我有一些中间文件,只有在成功制作后才要保留。
这是我目前的尝试:
all: foo.result
%.result: %.intermediate
cp $^ $@
%.input:
touch $@
%.intermediate: %.input
touch $@
$(if $(FAIL),exit 1)
.PRECIOUS: %.intermediate
.DELETE_ON_ERROR: %.intermediate
clean:
rm -f *.intermediate *.input *.result
要让我清楚地知道要执行的操作,请运行此命令并尝试不输出:
(make clean && make foo.result) |&> /dev/null; if [[ ! -e foo.intermediate ]]; then echo "make removed precious intermediate file"; fi; (make clean && make foo.result FAIL=1) |&> /dev/null; if [[ -e foo.intermediate ]]; then echo "make did not remove corrupt file"; fi;
答案 0 :(得分:1)
手册说
.PRECIOUS赋予.PRECIOUS依赖的目标 接受以下特殊处理:如果make在执行过程中被杀死或中断 执行其配方时,不会删除目标。看到 打断或杀死。另外,如果目标是中间 文件,因此不再需要后将不会被删除 正常完成。请参阅隐式规则链。在后者方面 与.SECONDARY特殊目标重叠。
您还可以列出隐式规则的目标模式(例如 “%.o”)作为特殊目标.PRECIOUS的前提文件 保留由目标模式的规则创建的中间文件 匹配该文件的名称。
.INTERMEDIATE被视为.INTERMEDIATE依赖的目标 作为中间文件。请参阅隐式规则链。 。中间 没有先决条件就没有效果。
.SECONDARY .SECONDARY依赖的目标被视为 中间文件,除非它们永远不会被自动删除。 请参阅隐式规则链。
.SECONDARY没有先决条件会导致将所有目标视为 次要的(即未删除目标,因为它被认为 中级)。
因此,您不应该使用.PRECIOUS
,而应该使用.SECONDARY
。但是,不能在%
规则的右侧使用.SECONDARY
。您可以将其保留为空白(这使所有内容成为次要内容),也可以给出列表。