Как создать несколько целевых объектов, вызвав только одну команду?

#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.