makefile 意外删除目标
一个最小的例子:
%.txt: foo.log
# pass
%.log:
# pass
运行:
$ make a.txt --dry-run
# pass
# pass
rm foo.log
为什么最后一个操作是 rm foo.log
? 我怎样才能摆脱它?
A minimal example:
%.txt: foo.log
# pass
%.log:
# pass
Run:
$ make a.txt --dry-run
# pass
# pass
rm foo.log
Why is the last action rm foo.log
?
How can I get rid of it?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
默认情况下,GNU make 会删除中间文件。由于 %.txt 依赖于 %.log,因此 make 想要删除 .log 文件。为了防止这种行为,您可以使用 .PRECIOUS 或 .SECONDARY 将它们标记为珍贵。
另外,您可以通过使用不带依赖项的 .SECONDARY 来确保不删除任何中间文件。
请参阅 GNU 的此部分制作手册。
By default, GNU make removes intermediate files. Since %.txt depends on %.log, make wants to remove the .log file. To prevent that behavior you mark them as precious with .PRECIOUS or .SECONDARY.
Also, you can make it so that no intermediate files are ever removed by using .SECONDARY with no dependencies.
See this section of the GNU make manual.
您正在通过一系列隐式规则(在本例中是您自己定义的隐式规则)来制作
a.txt
。因此 Make 认为foo.log
是一个 中间文件,并在其达到目的后将其删除。您可以通过声明 foo.log 为 SECONDARY 目标来覆盖此行为:You are making
a.txt
by means of a chain of implicit rules (in this case implicit rules which you defined yourself). So Make considersfoo.log
an intermediate file, and deletes it when it has served its purpose. You can override this behavior by declaringfoo.log
a SECONDARY target: