Сохраняйте промежуточные файлы только в случае успеха - PullRequest
0 голосов
/ 03 ноября 2018

У меня есть промежуточные файлы, которые я хочу сохранить, только если они были успешно созданы.

Вот моя текущая попытка:

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 голосов
/ 03 ноября 2018

В инструкции написано

. PRECIOUS Цели, от которых зависит .PRECIOUS, получают следующий особый подход: если производитель был убит или прерван во время При выполнении своих рецептов цель не удаляется. Увидеть Прерывание или убийство делают. Кроме того, если цель является промежуточным файл, он не будет удален после того, как он больше не нужен, как нормально сделано. Смотрите Цепочки неявных правил. В этом последнем отношении это перекрывается со специальной целью .SECONDARY.

Вы также можете перечислить целевой шаблон неявного правила (например, ‘% .O’) в качестве необходимого файла специальной цели. PRECIOUS to сохранить промежуточные файлы, созданные по правилам, целевые шаблоны сопоставьте имя этого файла.

.INTERMEDIATE Обрабатываются цели, от которых зависит .INTERMEDIATE в качестве промежуточных файлов. Смотрите Цепочки неявных правил. .INTERMEDIATE без предварительных условий не имеет никакого эффекта.

.SECONDARY Цели, от которых зависит .SECONDARY, рассматриваются как промежуточные файлы, за исключением того, что они никогда не удаляются автоматически. См. Цепочки неявных правил.

.SECONDARY без предварительных условий заставляет все цели рассматриваться как вторичный (то есть, цель не удаляется, потому что она считается промежуточный).

Следовательно, вы не должны использовать .PRECIOUS, вы должны использовать .SECONDARY. Однако вы не можете использовать % справа от .SECONDARY правила. Вы можете оставить это поле пустым (все становится второстепенным) или указать список.

...