GNU Make v3.82重建目标而v3.81不重建目标

时间:2013-10-15 14:35:04

标签: gnu-make

我有以下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?

谢谢,

马丁

1 个答案:

答案 0 :(得分:1)

test.bar不是中间文件,因为它被明确提及为target1的先决条件。它不必仅在决定构建的目标和先决条件集中明确提及,它只需要在makefile中明确地提到 somewhere

毕竟,可能是下次您要求构建target1然后make必须重建test.bar,如果它不是必须重建{{1}}没有被删除。

ETA:我相信GNU make 3.81中的行为是一个错误。