2

我有中间文件,只有在它们成功生成时才想保留。

这是我目前的尝试:

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;
4

1 回答 1

2

手册说

.PRECIOUS .PRECIOUS 所依赖的目标被给予以下特殊处理:如果 make 在其配方执行期间被杀死或中断,则不会删除目标。请参阅中断或终止 make。此外,如果目标是中间文件,则在不再需要后不会像通常那样将其删除。请参阅隐式规则链。在后一方面,它与 .SECONDARY 特殊目标重叠。

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

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

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

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

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

于 2018-11-03T10:18:59.533 回答