makefile 意外删除目标

发布于 2024-10-26 14:06:42 字数 226 浏览 0 评论 0原文

一个最小的例子:

%.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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

孤君无依 2024-11-02 14:06:42

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

.PRECIOUS: foo.log

另外,您可以通过使用不带依赖项的 .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.

.PRECIOUS: foo.log

Also, you can make it so that no intermediate files are ever removed by using .SECONDARY with no dependencies.

.SECONDARY:

See this section of the GNU make manual.

雾里花 2024-11-02 14:06:42

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

.SECONDARY: foo.log

You are making a.txt by means of a chain of implicit rules (in this case implicit rules which you defined yourself). So Make considers foo.log an intermediate file, and deletes it when it has served its purpose. You can override this behavior by declaring foo.log a SECONDARY target:

.SECONDARY: foo.log
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文