2015-08-09 2 views
1

От docs:Make удаляет мою цель. Зачем?

Обычно, когда выходит из строя рецепт линии, если она изменила целевой файл на всех, файл поврежден и не может быть использован - или, по крайней мере, это не полностью обновлена. Тем не менее, временная метка файла говорит, что теперь это значение до , так что в следующий раз «make» запускается, он не будет пытаться обновить этот файл. Ситуация такая же, как когда оболочка убита сигналом; * note Прерывания ::. Поэтому в целом правильная вещь - удалить целевой файл , если рецепт завершился с ошибкой после начала изменения файла. «make» будет делать это, если «.DELETE_ON_ERROR» появляется как цель. Это почти всегда то, что вы хотите «сделать», но это не исторический практика; поэтому для совместимости вы должны явно запросить его.

Итак, вот у меня есть Makefile:

# The idea here is to auto-generate the file ('make.include') 
# and to use it as a makefile. 
# For simplicity, I replaced the "auto-generate" part, with "touch". 
# I also simplified the dependency-tree with 'phony'. 
# In practice, we re-generate, only when "need" to. 

make.include : phony 
    +touch '[email protected]' 
    make -f '[email protected]' 

.PHONY: phony 

Продолжительность:

$ make -q 

я получаю:

touch 'make.include' 
make: *** Deleting file 'make.include' 

Теперь, я не вижу, как предотвратить make от удаления этого вновь созданного автоматически «make.include» (который вполне может быть довольно дорогостоящим процессом s для повторного запуска), если я не прибег к специальной цели .PRECIOUS.

Но, требуя, чтобы пользователь явно определял свои «драгоценные» цели, не соответствует этой цитате из приведенных выше документов. Правильно?

ответ

0

Это связано с использованием + в +touch '[email protected]' и исполнением make с опцией -q. С GNU Make Manual опцией -q является

«Вопросный режим». Не запускайте никаких рецептов или не печатайте ничего; просто верните статус завершения, равный нулю, если указанные цели уже обновлены, если требуется переработка, или два, если возникла ошибка. Смотрите вместо того, чтобы выполнять рецепты.

+ символ имеет значение только тогда, когда make выполняется с -t, -n или -q вариантов, и он говорит сделать, чтобы выполнить любые команды, она предшествует make выполняется с любым из вариантов -t, -n или -q. Итак, когда вы выполняете свой текущий makefile с make -q, вы задаете make, чтобы проверить, не обновлено ли все, без каких-либо команд, но поскольку вы указали + до touch '[email protected]'make должны выполнить эту команду. Чтобы оставить все так, как это было до того, как вы исполнили make -qmake, необходимо удалить файл, созданный с помощью +touch '[email protected]'.

Чтобы ответить на ваш вопрос конкретно.Если вы не хотите, чтобы make удалял make.include, то вы можете запустить make без опции -q на makefile, указанной в вашем ответе.

Однако рецепт для цели, то есть make.include, не должен называть его самолетом make -f make.include. Вероятно, лучше переписать makefile так, чтобы рецепт для make.include создавал только make.include, а затем он вызывается с make -f make.include в другом рецепте.

make.include: 
    +touch [email protected] 

all: make.include 
    make -f $< 
Смежные вопросы