【发布时间】:2018-12-21 14:34:19
【问题描述】:
我有一个由以下 Makefile 示例大致描述的构建过程:
a: b
@echo "Build a, just using b. Don't care about c."
touch a
b: c
@echo "Constructing b from c is cheap..."
touch b
@echo "Once accomplished, I no longer need c."
c:
@echo "Constructing c is very expensive..."
@echo "Work work work..."
touch c
clean:
$(RM) a b c
example: clean
make a
$(RM) c
make a
关键是:我需要c 来构建b,但是一旦我拥有b,我就再也不需要c。当我执行make example、make 时,会生成c、b 和a(如预期的那样),删除c,然后,在最后一次make a 调用中,只是重新制作c(并且不会重新制作b 和a,即使我认为它们现在已经过时了)。但是,由于我的目标是a 和b 没有改变,我不想重制c。忘掉它!谁在乎! a 应该被认为是最新的。
另一件奇特的事,就是当我
make a
rm c
make a
(而不是make example),在第二次调用make 中重建所有内容(而在make example 中第二次调用只是重建c)。
当make 的目标是a 并且a 的所有直接先决条件都存在并且比它们更新鲜时,我如何防止make 构建c(a 与@ 相比并不陈旧) 987654350@),即使先决条件的先决条件没有?
编辑:我认为我可能想要将每个文件视为旧文件(例如--old-file)除非该文件不存在。
【问题讨论】:
-
我无法重现您为
make example描述的行为:删除c后,重新构建c、b和a。你用什么版本的make? -
GNU Make 3.81 (OS X)
-
使用
GNU Make 4.2.1似乎与 3.81 不同。当我使用 4.2.1 时,make example中的第二个make a会重建所有内容。 -
非常有趣,我不知道 3.81 和更新版本之间的这种差异。
-
虽然我没有证据表明您看到了这一点,但请注意,有报告称 MacOS/Xcode 提供的 GNU make 3.81 版本存在问题,这些问题未出现在 GNU make 的原始版本中3.81,甚至为 MacOS 编译。 IIRC 的失败非常奇怪。
标签: makefile