Как построить несколько целей, вызвав только одну команду? - PullRequest
2 голосов
/ 10 мая 2011

Я получил 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.

.рецепт в цели «все», но безуспешно.

Я ищу решение, которое работает как с gmake, так и с clearmake (в режиме совместимости с gnu).

Ответы [ 2 ]

2 голосов
/ 10 мая 2011

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 касаются этих целей, но на самом деле не перестраивают их. Это некрасиво, но делает работу.

0 голосов
/ 10 мая 2011

Этот хак может вам помочь:

.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 как минимум.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...