一个迹象是目标不存在,请理解这一点。
另一种是通过比较目标和先决条件的修改时间戳。它如何更详细地工作?比较目标和先决条件时间戳的逻辑是什么,以及当有多个先决条件时它是如何工作的?
一个迹象是目标不存在,请理解这一点。
另一种是通过比较目标和先决条件的修改时间戳。它如何更详细地工作?比较目标和先决条件时间戳的逻辑是什么,以及当有多个先决条件时它是如何工作的?
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
必须重建,并将停止检查 prereqs foo
(因此boo
永远不会被检查)。
如果输出目标有多个依赖行,如下所示:
foo: bar baz
foo: boo
第二个和后续依赖行中的 prereqs 只是简单地附加到输出目标的 prereqs 列表的末尾——也就是说,这个示例与上面的第一个示例完全相同。
通常,所有make
变体都以这种方式运行,尽管某些变体具有修改此行为的扩展(例如,GNU make 包含仅订单的先决条件;Sun make 具有“保持状态”功能;等等)。
Unix make 有相当复杂的推理规则来确定是否需要重建目标。对于 GNU make,您可以通过在没有 Makefile 的目录中运行“make -p”来转储它们。
规则也可以链接,更多解释在这里
标准 Unix make 和 Microsoft nmake 以类似的方式工作