【发布时间】:2010-05-04 04:16:33
【问题描述】:
一个迹象是目标不存在,理解这一点。
另一个是通过比较目标和先决条件的修改时间戳。它如何更详细地工作?比较目标时间戳和先决条件时间戳的逻辑是什么,以及在存在多个先决条件时它是如何工作的?
【问题讨论】:
标签: makefile timestamp target prerequisites
一个迹象是目标不存在,理解这一点。
另一个是通过比较目标和先决条件的修改时间戳。它如何更详细地工作?比较目标时间戳和先决条件时间戳的逻辑是什么,以及在存在多个先决条件时它是如何工作的?
【问题讨论】:
标签: makefile timestamp target prerequisites
make 首先获取目标的修改时间,然后将该值与每个 prereq 的修改时间进行比较,从左到右顺序,一旦发现任何比目标更新的 prereq 就停止(因为一个较新的 prereq 就足以要求重新构建目标)。
例如,假设您有这样的规则:
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
第二个和后续依赖行中的 prereqs 被简单地附加到输出目标的 prereqs 列表的末尾——也就是说,这个例子与上面的第一个例子完全等价。
一般来说,所有make 变体都以这种方式运行,尽管某些变体具有修改此行为的扩展(例如,GNU make 包含仅订单先决条件;Sun make 具有“保持状态”功能;等等)。
【讨论】:
Unix make 有相当复杂的推理规则来确定是否需要重建目标。对于 GNU make,您可以通过在没有 Makefile 的目录中运行“make -p”来转储它们。
规则也可以链式,更多解释是here
标准 Unix make 和 Microsoft nmake 的工作方式相似
【讨论】: