#makefile
#makefile
Вопрос:
Я получил Makefile, подобный следующему:
.PHONY: all
all: aaa.2 bbb.2
aaa.2 : aaa.1 common.1
create_2 $@
bbb.2 : bbb.1 common.1
create_2 $@
Запуск программы create_2 занимает много времени, но она способна создавать несколько файлов %.2 одновременно, поэтому я хотел бы вызвать create_2 только один раз.
Например, если common.1 изменился, я бы хотел, чтобы create_2 aaa.2 bbb.2
вместо обоих вызывались create_2 aaa.2
и create_2 bbb.2
.
Я пытался использовать create_2 $?
рецепт в целевом объекте «все», но безуспешно.
Я ищу решение, которое работает как с gmake, так и с clearmake (в режиме совместимости с gnu).
Ответ №1:
Make в основном ориентирован на файлы, а вам нужно что-то ориентированное на процесс, так что … возможно, это оправдывает тот факт, что это ужасная ошибка:
.PHONY: all
all: marker
aaa.2 : aaa.1 common.1
@touch $@
bbb.2 : bbb.1 common.1
@touch $@
marker: aaa.2 bbb.2
create_2 $?
@touch $@
Обратите внимание, что marker
это фиктивный файл и что правила для aaa.2
и bbb.2
касаются этих целей, но на самом деле не перестраивают их. Это некрасиво, но это делает свое дело.
Ответ №2:
Этот хак может вам помочь:
.PHONY: all
all: file1 file2
>---@if [ -f work ]; then
>--->---touch file1 file2;
>--->---echo "touch file1 file 2";
>---fi
>---rm -f work
file1:
>---touch work
file2:
>---touch work
Это приводит к тому, что оба файла будут перестроены, если какой-либо из них нуждается в перестройке. Вероятно, вы могли бы использовать этот взлом, создать work1
и work2
файлы вместо только work
и использовать более сложное if
условие для восстановления только того, что нуждается в восстановлении. Работает, по крайней мере, с GNU Make.