makefile意外删除目标

问题描述 投票:21回答:2

一个最小的例子:

%.txt: foo.log
    # pass

%.log:
    # pass

运行:

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

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

makefile
2个回答
26
投票

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

.PRECIOUS: foo.log

此外,您也可以使用.SECONDARY在没有依赖项的情况下删除任何中间文件。

.SECONDARY:

请参见GNU make手册的this部分。


6
投票

您正在通过隐式规则链制作a.txt(在这种情况下,您定义了自己的隐式规则)。因此,Make认为foo.logintermediate file,并在达到其目的时将其删除。您可以通过声明foo.log一个次要目标来覆盖此行为:

.SECONDARY: foo.log
© www.soinside.com 2019 - 2024. All rights reserved.