没有命令的规则(如“a.h:b.h”)如何在make文件中生效

时间:2014-01-15 21:46:24

标签: makefile

例如:

# I understand this rule,
# which will compile a.c if b.h has been updated due to some implicit rules and dependency.
a.o: b.h

# But I don't understand the rule below.
# In reality, if c.h is modified, then when you run "make a.o", you will re-generate a.o.
# What I don't get is that, in theory, since the rule does not update b.h
# and a.o relies on b.h only according to the rule above 
# (I know a.o relies on c.h, indirectly),
# a.o should not be re-generated, right?
b.h: c.h

我查阅了gnu make手册,但没有找到解释上述行为的语法。

有人可以指出吗?

编辑:我在阅读一些关于如何编写描述头文件依赖性的规则的文章时遇到了问题。我猜想,一旦c.h被修改(基于我对那篇文章的理解),a.o就会被重新生成。我刚试过在这种情况下,a.o不会再生,这也符合我的想法。我将重新阅读那篇文章,看看为什么我对这篇文章有这样的误解。无论如何,我的道歉。这是一个错误的问题。

Edit2:我终于找回了the article,这让我误解了。如果您搜索“Vector.h:Foo.h”,您会发现作者在该部分中提供了错误的知识。要小心!再次抱歉,在我问这个问题之前,我没有尝试就把它当作真实。

1 个答案:

答案 0 :(得分:1)

请参阅POSIX规范中的make:

  

如果没有为目标列出命令,则目标应被视为最新。

我真的不明白你对发生的事情的评论。如果所有三个文件a.ob.hc.h都存在,并且a.o 较新而不是b.h(所以不会需要根据第一个目标进行重建),但c.h(因此理论上需要根据第二个目标进行重建),事实上,{{1}运行make时将 NOT 更新。

这是因为上面的规则,因为没有规则来构建a.o,所以它被认为是最新的,因此没有被修改,因此它的(比b.h}时间戳更早的时间戳被比较,并且a.o不需要更新。

如果这不是您的意思,请通过提供准确的观察结果来澄清您的问题(可能会显示一些示例输出)。