a 使用示例 make 文件运行 make 会导致在第一-6ren">
gpt4 book ai didi

makefile - 当 PHONY 依赖项更新时,为什么 make 不考虑没有配方过时的目标?

转载 作者:行者123 更新时间:2023-12-03 17:07:37 28 4
gpt4 key购买 nike

.PHONY: b
c: a
@touch c
@echo "Changed"
a: b
b:
@date +%s > a

使用示例 make 文件运行 make 会导致在第一次运行时打印“Changed”;但是“已更改”仅在第 3 次、第 5 次等执行时打印。这是因为 make 似乎没有意识到执行目标“b”的配方会更新 a。

将“a”作为目标的规则更改为空配方会导致每次 make 运行时打印“Changed”(正如您所期望的 - 虚假目标始终被视为“过时”)。例如。
a: b ;

Make 应该跳过对 PHONY 目标的隐式规则搜索,但“a”不是 PHONY。如果没有找到“a”的隐含规则,是否正确地不考虑“a”可能已被其 PHONY 依赖“b”改变?

最佳答案

Make无法分析命令的效果,因此正确组织规则是用户的责任。

考虑一个稍微不同的情况:

d: c b
c: a
@touch c
@echo "Changed"
a:
b:
@date +%s > a

这与您的示例具有相同的行为;不可能期望 Make 知道 c “真的”取决于 b .生成文件的作者有错。

现在应该这样写:
c: a
@touch c
@echo "Changed"

.PHONY: a
a:
@date +%s > a
a规则修改文件 a (还有 PHONY 只是为了强制运行 a 规则)。这是告诉 make 的方式 @date ...命令修改 a .此生成文件正常工作。

你的例子介于这两者之间。如果一个规则修改了一个作为另一个规则目标的文件,那么这个 makefile 的组织是错误的,并且 Make 没有错。是的,Make 可以假设一个依赖于 PHONY 的目标。规则可能在运行该规则时已更新,但也可以假设在运行任何规则时可能已更新任何目标。如果 Make 是那种偏执狂,它的效率就不会很高。

关于makefile - 当 PHONY 依赖项更新时,为什么 make 不考虑没有配方过时的目标?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12724137/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com