我有以下makefile代码:
NAME := test
target1: $(addsuffix .bar,$(NAME))
target2: $(addsuffix .dar,$(NAME))
%.bar: $(INPUT)
touch $@
%.dar: %.bar
touch $@
我用GNU Make v3.81执行这个makefile,如下所示:
user@node1:/data/user/Tests/oldfile3$ rm test.*
removed `test.bar'
removed `test.txt'
user@node1:/data/user/Tests/oldfile3$ touch test.txt
user@node1:/data/user/Tests/oldfile3$ make target2
touch test.bar
touch test.dar
user@node1:/data/user/Tests/oldfile3$ make target2
make: Nothing to be done for `target2'.
user@node1:/data/user/Tests/oldfile3$ rm test.bar
removed `test.bar'
user@node1:/data/user/Tests/oldfile3$ make target2
make: Nothing to be done for `target2'.
user@node1:/data/user/Tests/oldfile3$
正如我所料,中间文件test.bar在删除后不会重建,因为test.dar仍然是最新的。但是当我使用GNU Make v3.82:
时user@node1:/data/user/Tests/oldfile3$ rm test.*
removed `test.dar'
removed `test.txt'
user@node1:/data/user/Tests/oldfile3$ touch test.txt
user@node1:/data/user/Tests/oldfile3$ mk82 target2
touch test.bar
touch test.dar
user@node1:/data/user/Tests/oldfile3$ mk82 target2
make: Nothing to be done for `target2'.
user@node1:/data/user/Tests/oldfile3$ rm test.bar
removed `test.bar'
user@node1:/data/user/Tests/oldfile3$ mk82 target2
touch test.bar
touch test.dar
user@node1:/data/user/Tests/oldfile3$
现在,当我删除test.bar并调用make时,它将重建test.bar,然后重建test.dar。 test.txt仍然比test.dar旧,那么为什么要重新制作依赖于test.txt的test.bar呢?如果我像这样删除target1,就不会发生这种情况:
NAME := test
target2: $(addsuffix .dar,$(NAME))
%.bar: $(INPUT)
touch $@
%.dar: %.bar
touch $@
为什么在我没有在任何地方指定它时会构建target1?
谢谢,
马丁
答案 0 :(得分:1)
test.bar
不是中间文件,因为它被明确提及为target1
的先决条件。它不必仅在决定构建的目标和先决条件集中明确提及,它只需要在makefile中明确地提到 somewhere 。
毕竟,可能是下次您要求构建target1
然后make必须重建test.bar
,如果它不是必须重建{{1}}没有被删除。
ETA:我相信GNU make 3.81中的行为是一个错误。