.PHONY: b
c: a
@touch c
@echo "Changed"
a: b
b:
@date +%s > a
Run Code Online (Sandbox Code Playgroud)
使用示例 make 文件运行 make 会导致在第一次运行时打印“Changed”;但是“已更改”仅在第 3 次、第 5 次等执行时打印。这是因为 make 似乎没有意识到执行目标“b”的配方会更新 a。
将“a”作为目标的规则更改为空配方会导致每次 make 运行时打印“Changed”(正如您所期望的 - 虚假目标始终被视为“过时”)。例如
a: b ;
Run Code Online (Sandbox Code Playgroud)
Make 应该跳过对 PHONY 目标的隐式规则搜索,但“a”不是 PHONY。如果没有找到“a”的隐含规则,是否正确地不考虑“a”可能已被其 PHONY 依赖“b”改变?
Make 无法分析命令的效果,因此用户有责任正确组织规则。
考虑一个稍微不同的情况:
d: c b
c: a
@touch c
@echo "Changed"
a:
b:
@date +%s > a
Run Code Online (Sandbox Code Playgroud)
这与您的示例具有相同的行为;Make 不可能知道c“真的”取决于b。makefile 的作者有错误。
现在应该这样写:
c: a
@touch c
@echo "Changed"
.PHONY: a
a:
@date +%s > a
Run Code Online (Sandbox Code Playgroud)
该a规则修改文件a(并且PHONY只是为了强制a规则运行)。@date ...这是告诉 make 该命令修改了的方法a。这个 makefile 工作正常。
你的例子介于这两者之间。如果一个规则修改了另一个规则的目标文件,则 makefile 组织得很糟糕,而 Make 没有错误。是的,Make 可以假设依赖于某个PHONY规则的目标可能在该规则运行时已更新,但它也可以假设在任何规则运行时任何目标都可能已更新。如果 Make 如此偏执,那么效率就不会很高。
| 归档时间: |
|
| 查看次数: |
1038 次 |
| 最近记录: |