如何决定构建目标

时间:2010-05-04 04:16:33

标签: makefile timestamp target prerequisites

一个标志是目标不存在,理解这一点。

另一种方法是比较目标和先决条件的修改时间戳。它的工作原理如何?当存在多个先决条件时,比较目标和先决条件时间戳及其工作原理的逻辑是什么?

2 个答案:

答案 0 :(得分:2)

make首先获取目标的修改时间,然后按照从左到右的顺序将该值与每个先决条件的修改时间进行比较,一旦发现任何比目标更新的先决条件,就立即停止(因为一个较新的先决条件足以要求重建目标)。

例如,假设您有这样的规则:

foo: bar baz boo

此外,假设这些文件的修改时间如下:

foo: 4
bar: 3
baz: 6
boo: 2

在这种情况下,make会将foo(4)的修改时间与bar(3)的修改时间进行比较;由于bar较早,make会继续,并将foo(4)的修改时间与baz(6)的修改时间进行比较。由于baz较新,make将决定必须重建foo,并且会停止检查foo的先决条件(因此永远不会检查boo

如果输出目标有多个依赖关系行,请参见:

foo: bar baz
foo: boo

第二个和后续依赖关系行中的先决条件只是附加到输出目标的先决条件列表的末尾 - 也就是说,此示例与上面的第一个示例完全等效。

通常,所有make变体都以这种方式运行,尽管某些变体具有修改此行为的扩展(例如,GNU make包含仅订单的先决条件; Sun make具有“保持状态”功能;等等)。

答案 1 :(得分:0)

Unix make有非常复杂的推理规则来确定目标是否需要重建。对于GNU make,您可以通过在没有Makefile的目录中运行'make -p'来转储它们。

规则也可以被链接,关于它的更多解释是here

标准Unix make和Microsoft nmake以类似的方式工作