%.txt: foo.log
# pass
%.log:
# pass
运行:
$ make a.txt --dry-run
# pass
# pass
rm foo.log
为什么最后一个动作是RM foo.log? 如何摆脱它?
%.txt: foo.log
# pass
%.log:
# pass
运行:
$ make a.txt --dry-run
# pass
# pass
rm foo.log
为什么最后一个动作是RM foo.log? 如何摆脱它?
您正在通过隐含规则(在这种情况下,您自己定义的隐式规则)链的方式制作a.txt
。所以Make认为foo.log
是intermediate file,并且在它达到目的时删除它。您可以通过声明foo.log
次要目标覆盖此行为:
.SECONDARY: foo.log
默认情况下,GNU化妆删除中间文件。由于%.txt取决于%.log,因此希望删除.log文件。为了防止这种行为,您可以使用.PRECIOUS或.SECONDARY将它们标记为珍贵。
.PRECIOUS: foo.log
此外,您可以使它通过使用.SECONDARY没有依赖关系删除中间文件。
.SECONDARY:
请参阅this部分的GNU make手册。
.SECONDARY:%.log#does not work,我该怎么办才能使规则一般? – 2011-03-25 00:18:20
如果您想要保留所有中间体,只需声明.SECONDARY的目标:不需要依赖关系。或者,您可以使用通配符.PRECIOUS。即.PRECIOUS:%.log – Sean 2011-03-25 00:22:07
@Sean:奇怪的是通配符与PRECIOUS协同工作,但与SECONDARY协同工作... – Beta 2011-03-25 01:20:09