Почему make не удаляет промежуточные файлы? - PullRequest
2 голосов
/ 19 января 2012

У меня проблемы с GNU make 3.81, не удаляющей промежуточные файлы.Проблема похожа на GNU make Не удаляет промежуточные файлы , но этот ответ не решает мою проблему.Я разобрал проблему в этом тестовом примере:

default: 
    @echo no $@ target; exit 1

oncetwice: once twice
    @echo $@: $^

## Uncommenting the following line is sufficient to cause GNU make 3.81 to
## not delete the intermediate 'twice.dep', even if it didn't exist
## previously (i.e., was created by this invocation).
#another: twice.dep

%: %.dep
    @echo $^ >$@

## the following .INTERMEDIATE has no effect re: the twice: twice.dep
## dependency
.INTERMEDIATE: %.dep
%.dep:
    @echo $@ >$@

NB командные блоки должны быть с отступом табуляции.

То есть цель once зависит от once.dep и twice зависит от twice.dep.Кроме того, another также зависит от twice.dep.Именно эта строка никогда не удаляет twice.dep, даже если make ее создал и несмотря на строку .INTERMEDIATE.

Созданный Makefile дает:

snafu$ rm -f once* twice*; make oncetwice
oncetwice: once twice
rm once.dep twice.dep

Раскомментирование twice: twice.dep строка:

snafu$ rm -f once* twice*; make oncetwice
oncetwice: once twice
rm once.dep

Обратите внимание, что дважды.dep не является rm'd во втором вызове.

со страниц информации:

.INTERMEDIATE
The targets which .INTERMEDIATE depends on are treated as intermediate files.

[...]

Intermediate files are remade using their rules just like all other
files. But intermediate files are treated differently in two ways.

The first difference [...]

**The second difference is that if make does create b in order to update
something else, it deletes b later on after it is no longer
needed. Therefore, an intermediate file which did not exist before make
also does not exist after make.**

I 'мы пытались сделать another: twice.dep настоящим правилом с помощью командного блока.Я также пробовал варианты указания .INTERMEDIATE в качестве шаблона, буквального имени файла и того и другого.Я также пытался использовать .PHONY.make-3.82 NEWS, похоже, не содержит соответствующих исправлений.Поведение, которое я наблюдаю, больше похоже на описанное для .SECONDARY целей.

Спасибо,

Reece

Ответы [ 2 ]

3 голосов
/ 20 января 2012

Вы не можете использовать шаблон в качестве предварительного условия для специальной цели .INTERMEDIATE (если бы вы могли, это было бы задокументировано в руководстве; если в руководстве не сказано, что вы можете, то вы не можете).

Кроме того, в GNU make 3.81 была ошибка, из-за которой .INTERMEDIATE не работал должным образом;эта ошибка исправлена ​​в 3.82.Если вы измените свой файл на использование:

.INTERMEDIATE: twice.dep

(редактировать: оригинальный ответ сказал "two.dep")

вместо "% .dep" и вы переключитесь на GNU make 3.82ваш пример будет работать так, как вы ожидаете.

0 голосов
/ 19 января 2012

Проблема в том, что правило

.INTERMEDIATE: %.dep

не интерпретируется как правило шаблона (поскольку в нем отсутствует % в левой части), а %.dep не является файлом.

Например, попробуйте этот Makefile:

foo: %.bar
    cat $+ > $@ 

Теперь создайте a.bar и b.bar и запустите make foo.

...