LINUX.ORG.RU

[makefiles] Удаление недоделанных целей


0

2

Здравия желаю.

Пишу в Makefile следующее:

a b c d:
  touch a b c d
  sleep 10

запускаю:
make a b c d
Во время выполнения нажимаю CTRL+C, вижу:
 make: *** Deleting file `a'
Но файлы b, c, d тоже создались и не удалились.

Как сделать, что бы файлы b c d автоматически удаляллись тоже?

ОБЯЗАТЕЛЬНОЕ УСЛОВИЕ:
1. допустим что «touch a b c d» это неделимая комманда, то есть не может создавать файлы a,b,c,d по отдельности.
2. при отсуствии любого из файлов a,b,c,d необходимо запустить эту цель.

Спасибо.

★★

Последнее исправление: ASM (всего исправлений: 3)

Ответ на: комментарий от MKuznetsov
.DELETE_ON_ERROR:

a b c d:
	touch a b c d
	exit 1
$ make a b c d
touch a b c d
exit 1
make: *** [a] Error 1
make: *** Deleting file `a'
edigaryev ★★★★★
()

Нужно именно по Ctrl-C? Т.е. тупое || rm a b c d не пойдёт? Тогда похоже, что нет пути.

Yareg ★★★
()

а это ничего, что touch a b c d будет выполняться 4 раза (если программу не прерывать)?

Запись

a b c d:

...

означает, что для каждой из целей надо выполнить набор команд. Т.е. когда ты вводишь команду make a b c d, ты говоришь «достичь целей a b c d». Make начинает обрабатывать цели по очереди: сначала выполняется набор команд для цели a (touch a b c d; sleep 10). Здесь на sleep 10 ты прерываешь выполнение (C-c). Make считает, что цель a не была достигнута и удаляет (возможно, при соотв настройках; никогда не интересовался удалением целей в случае сигнала) файл a. К сборке целей b c и d программа ещё даже не преступала и, следовательно, не считает нужным удалять эти файлы.

Для данного makefile'а я бы посоветовал заменить touch a b c d на touch $@

anonymous
()

вобщем, мой воспаленный моск выдал следующее: (сильно не пинать) ;)))

.INTERMEDIATE: a b c d
.PHONY:a b c d

prog: a b c d
	-rm *_prod
	touch $^
	exit 1
	for f in $^; do \
	cp $${f} $${f}_prod; \
	done

all: prog

как верно было отмечено, в твоем варианте touch a b c d выполнится 4 раза, и, думается мне, это не то, чего ты хочешь добиться.

коментарии к моему бреду:

* в любом случае, после выполнения цели все 4 файла удаляются, как временные;

* если touch a b c d «сломается», то до копирования дело не дойдет;

* exit 1 - имитатор «поломки» ;)

aol ★★★★★
()
Ответ на: комментарий от anonymous

> это ничего, что touch a b c d будет выполняться 4 раза (если программу не прерывать)?

Выполнитца только 1 раз.

Алгоритм другой:

Есть цель создать фалы «a, b, c, d»

make работает по алгоритму: 1. Есть ли нужный цели файл? 2. Не поменялись ли его зависимости? 3. Если то и другое: нет, запустить цель.

Получается что он в цикле попробует сделать «a», после этого увидет что b, c, d уже созданы и пропустит эти итерации.

На то он и MAKE.

ASM ★★
() автор топика
Ответ на: комментарий от aol

> общем, мой воспаленный моск выдал следующее: (сильно не пинать) ;)))

Ничего не понял из того, что написано, но это хорошо, буду разбираться. Спасибо.

ASM ★★
() автор топика
Ответ на: комментарий от ASM

Есть только один вопрос: когда make проверяет необходимость пересборки целей: только при запуске или ещё и после каждой сборки цели? Если первый вариант, то я написал всё правильно, во втором случае твоё замечание верно.

anonymous
()
Ответ на: комментарий от anonymous

Да, я был не прав. Я, похоже, перепутал процесс построения графа зависимостей с проверкой необходимости сборки.

anonymous
()
Ответ на: комментарий от anonymous

Я проверял это на практике.

А вообще странно что бы он это делал только при запуске. С политикой «ленивых» вычислений, думаю в make сделано все так, что если надо что то сделать, то делает это в последний момент. Следовательно проверку есть ли уже цель делает непосредственно перед выполнением цели.

Хотя может быть есть какие-то режимы, документация очень большая, все не осилил.

ASM ★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.