【问题标题】:Handling inter-project dependencies with GNU make使用 GNU make 处理项目间依赖关系
【发布时间】:2018-01-15 22:03:02
【问题描述】:

我有两个使用 GNU make 构建的项目。项目 B 依赖于项目 A 的输出之一。我们称之为 OUTPUT。所以项目 B 的 Makefile 包含如下内容:

target:  ../ProjectA/OUTPUT
    do stuff

为确保 OUTPUT 是最新的,我希望 B 的 Makefile 启动 A 的 make,然后仅在 OUTPUT 被重建(或已经比目标更新)时“做一些事情”。

我第一次尝试这样做:

../ProjectA/OUTPUT:
    (cd ../ProjectA; $(MAKE) OUTPUT)

但是由于没有为 OUTPUT 提供依赖项,make 将简单地假设它是最新的(如果存在)并且不会运行子 make。

将 OUTPUT 声明为假可确保子 make 将运行:

.PHONY: ../ProjectA/OUTPUT
../ProjectA/OUTPUT:
    (cd ../ProjectA; $(MAKE) OUTPUT)

但现在 make 将忽略 OUTPUT 上的实际日期并始终认为它比目标更新,这意味着“做事”将始终执行。

我发现唯一可行的方法是在 B 的 Makefile 中复制 OUTPUT 的整个依赖关系树。这太可怕了,无法考虑。稍微不那么可怕的是将 OUTPUT 的依赖树放在两个项目的 Makefile 包含的单独文件中。

有没有更好的方法让 make 做我想做的事?

【问题讨论】:

  • 有一篇关于在项目之间使用 make 的困难的经典文章,值得一读:aegis.sourceforge.net/auug97.pdf
  • 看起来你还没有完全定义你的依赖关系。要么你可以找到ProjectA所依赖的ProjectB的结果,要么没有,那么不重建不是make的错。如果您的项目管理人员只想拥有新的时间戳,请将它们明确化并让 ProjectA 和 B 依赖它们。

标签: makefile gnu-make


【解决方案1】:

您可以添加一个虚假目标,其中包含制作另一个项目的配方,这样即使无事可做,它也始终被制作,然后启动第二个子制作来制作您的实际目标:

.PHONY: all

all:
    $(MAKE) -C ../ProjectA OUTPUT
    $(MAKE) target

target: ../ProjectA/OUTPUT
    do stuff

不是很优雅也不是很高效,但它应该做你想做的事:

  1. 总是尝试重建../ProjectA/OUTPUT
  2. 如果 ../ProjectA/OUTPUT 发生变化,也要重建 target

还有另一种方式,更优雅和高效,但它使用了一个相当晦涩的 GNU make 特性:双冒号规则(参见 this section of the manual),以一种相当不寻常的方式,而且它肯定不是为此而发明的:

target: ../ProjectA/OUTPUT
    do stuff

../ProjectA/OUTPUT::
    $(MAKE) -C ../ProjectA OUTPUT

因此,如果您不喜欢晦涩难懂,请选择第一个。至少,它更容易理解,没有人会通过删除这个 extra 冒号来破坏它,这肯定是一个错字...

【讨论】:

    【解决方案2】:

    嗯,我不知道双冒号规则是这样工作的。这真的很有用。

    为了记录,有一种方法可以让 make 尝试重建 ../ProjectA/OUTPUT 每次不那么晦涩(?)。基本上,您使用中间的.PHONY 目标。

    .PHONY: FORCE
    FORCE: ;
    
    ../ProjectA/OUTPUT: FORCE
        ${MAKE} -C ${@D} ${@F}
    

    由于FORCEmake 将意识到OUTPUT 可能 已过期。它将运行配方,然后检查OUTPUT 是否实际更新。

    (FWIW 我喜欢双冒号的表述。对我来说似乎更干净。)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-03
      • 1970-01-01
      • 2015-05-11
      相关资源
      最近更新 更多