1

一个迹象是目标不存在,请理解这一点。

另一种是通过比较目标和先决条件的修改时间戳。它如何更详细地工作?比较目标和先决条件时间戳的逻辑是什么,以及当有多个先决条件时它是如何工作的?

4

2 回答 2

2

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

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

foo: bar baz boo

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

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

在这种情况下,makefoo(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 具有“保持状态”功能;等等)。

于 2010-05-04T17:33:43.297 回答
0

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

规则也可以链接,更多解释在这里

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

于 2010-05-04T04:36:00.953 回答