【问题标题】:Why does gnu make delete this file?为什么 gnu make 删除这个文件?
【发布时间】:2020-08-12 10:11:19
【问题描述】:

考虑一下Makefile

.PHONY: all

all: main.txt

main.txt: build/main.txt
    cp build/main.txt .

%/main.txt: %/data.txt
    cp $*/data.txt $*/main.txt

%/data.txt:
    touch $*/data.txt

运行make 后,build/data.txt 会自动删除。为什么会这样?

我尝试将.PRECIOUS: build/% 添加到文件中,但没有帮助,文件仍然被删除。我怎样才能防止这种情况发生?

【问题讨论】:

  • 这能回答你的问题吗? How to undo intermediate file deletion
  • @Joe 正如我所写,添加.PRECIOUS build/% 不起作用。它仅在显式命名文件时才有效。我想保留目录中的所有文件,
  • .SECONDARY,不是.PRECIOUS,看看stackoverflow.com/questions/27090032/…那里是否可以使用模式。
  • 我敦促您不要为此使用.PRECIOUS。宣布目标为珍贵还有其他可能令人不快的副作用。例如,如果您的构建在 build/data.txt 文件写入一半时被终止,那么声明它 .PRECIOUS 将阻止 make 清理它。这意味着下一次运行 make 将看到具有更新时间戳的半构建文件并确定它是最新的而不是重新构建它,这会导致问题,直到您手动删除它。 .PRECIOUS 有特定用途,不应仅用于其禁用中介的副作用。
  • 如果你想强制某些东西不是中间的,最好的方法是让它成为我上面提到的某个目标的先决条件。

标签: gnu-make


【解决方案1】:

根据GNU Make documentation

您还可以将隐式规则的目标模式(例如“%.o”)列为特殊目标 .PRECIOUS 的先决条件文件,以保留目标模式与该文件名匹配的规则创建的中间文件。

.PRECIOUS 的先决条件必须是现有隐式规则的(确切)目标模式。

在你的情况下,这将是 %/data.txt

文档暗示了这一点,但不是特别清楚。

附带说明:据我所知,build/main.txt 不会自动删除,因为它被明确命名为main.txt 目标的先决条件,而build/data.txt 会自动删除,因为它从未明确命名。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-05-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多