使用空配方制定规则的先决条件

时间:2016-03-12 15:30:48

标签: makefile gnu-make

我想知道如何在GNU make中为空配方添加规则的先决条件。这是我为解释问题而做的一个简短例子。我有一个Test.c文件,它依赖于某个文件header1.h,其中包含另一个文件header2.h。这是make文件:

Test : Test.c header1.h
    gcc -o Test Test.c

header1.h : header2.h

最后一行不为空,它包含制表符。现在假设我运行make并创建Test。之后我改变了header2.h。如果我再次运行make,make表示Test已经更新。我希望make重新制作测试,因为header2.h比header1.h更新。

如果我在最后一条规则中添加一个简单的配方

Test : Test.c header1.h
    gcc -o Test Test.c

header1.h : header2.h
    echo foo

按照我的预期行事。我还尝试在先决条件列表中的header2.h之后添加分号,但这没有帮助。

2 个答案:

答案 0 :(得分:1)

您已告知make Test取决于Test.cheader1.h,因此它不会运行配方,除非这两个文件的任何一个时间戳都比一个更新为Test

您可以添加touch $@作为header1.h的配方,但从逻辑上讲,它并不真正取决于header2.hTest的内容,因此您应该添加header2.h {1}}作为Test的依赖关系。

理想情况下,你可以避免手动指定所有这些并使用GCC的依赖关系生成标志,你也可以利用make的内置规则,对于像这样的单个源文件的绝对最小的例子将是

CFLAGS := -MMD
Test:
-include *.d

答案 1 :(得分:0)

其他人已经提供了适当的解决方案:编译器生成的依赖文件。

这不回答问题的部分,为什么添加“琐碎的食谱”(echo foo)会改变任何东西。这可能与以下make bug有关。

正如OP已经发现的那样,可以通过添加一个简单的配方(例如@true)来规避错误。这会导致make重新评估目标的“时间戳”,这就是预期依赖性的原因。