为什么这个makefile会删除我的目标?

时间:2011-03-24 23:42:05

标签: makefile

一个最小的例子:

%.txt: foo.log
    # pass

%.log:
    # pass

执行命令

$ make a.txt --dry-run
# pass
# pass
rm foo.log

为什么最后一个动作是rm foo.log? 如何摆脱它?

2 个答案:

答案 0 :(得分:24)

默认情况下,GNU make会删除中间文件。由于%.txt依赖于%.log,因此想要删除.log文件。为了防止这种行为,您可以使用.PRECIOUS或.SECONDARY将它们标记为珍贵。

.PRECIOUS: foo.log

此外,您可以通过使用没有依赖项的.SECONDARY来删除任何中间文件。

.SECONDARY:

请参阅GNU制作手册的this部分。

答案 1 :(得分:6)

您通过一系列隐式规则(在本例中是您自己定义的隐式规则)制作a.txt。因此,请将foo.log视为intermediate file,并在达到其目的时将其删除。您可以通过声明foo.log SECONDARY目标来覆盖此行为:

.SECONDARY: foo.log