你能帮我理解GNU Make(版本3.81)如何处理简单的Makefile吗?这是文件:
.PHONY: a b c e f a : b c @echo "> a(b,c)" e : a @echo "> e(a)" e : f @echo "> e(f)" f : @echo "> f()" b : @echo "> b()" c : @echo "> c()"
现在我运行命令
make e
建立'e'目标.Make的输出如下:
Makefile:7: warning: overriding commands for target `e' Makefile:5: warning: ignoring old commands for target `e' > f() > b() > c() > a(b,c) > e(f)
http://www.gnu.org/software/make/manual/html_node/Error-Messages.html给出了下一个解释:
'警告:覆盖目标`xxx'的配方
'警告:忽略目标`xxx'的旧配方
GNU make只允许为每个目标指定一个配方(双冒号规则除外).如果为已经定义为具有目标的目标提供配方,则会发出此警告,第二个配方将覆盖第一个配方.
但是从输出中我们可以看到构建'a'目标的命令也被执行.我认为根据'Error-Messages'页面中的描述make,在处理这个Makefile并尝试构建'e'目标(make e)时,应该首先确定'e'取决于'a'然后覆盖这个'e'取决于'f'.输出应该如下:
Makefile:7: warning: overriding commands for target `e' Makefile:5: warning: ignoring old commands for target `e' > f() > e(f)
但看起来make仍然记得'e'取决于'a'而不是覆盖配方.
请帮助我理解这种行为.为什么即使在配方覆盖之后,仍然会执行用于构建'a'目标的命令?