【发布时间】: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