仅在成功的情况下保留中间文件

时间:2018-11-03 10:14:07

标签: makefile gnu-make

我有一些中间文件,只有在成功制作后才要保留。

这是我目前的尝试:

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;

1 个答案:

答案 0 :(得分:1)

手册说

  

.PRECIOUS赋予.PRECIOUS依赖的目标   接受以下特殊处理:如果make在执行过程中被杀死或中断   执行其配方时,不会删除目标。看到   打断或杀死。另外,如果目标是中间   文件,因此不再需要后将不会被删除   正常完成。请参阅隐式规则链。在后者方面   与.SECONDARY特殊目标重叠。

     

您还可以列出隐式规则的目标模式(例如   “%.o”)作为特殊目标.PRECIOUS的前提文件   保留由目标模式的规则创建的中间文件   匹配该文件的名称。

     

.INTERMEDIATE被视为.INTERMEDIATE依赖的目标   作为中间文件。请参阅隐式规则链。 。中间   没有先决条件就没有效果。

     

.SECONDARY .SECONDARY依赖的目标被视为   中间文件,除非它们永远不会被自动删除。   请参阅隐式规则链。

     

.SECONDARY没有先决条件会导致将所有目标视为   次要的(即未删除目标,因为它被认为   中级)。

因此,您不应该使用.PRECIOUS,而应该使用.SECONDARY。但是,不能在%规则的右侧使用.SECONDARY。您可以将其保留为空白(这使所有内容成为次要内容),也可以给出列表。