Подтвердить что ты не робот

GNU make: несколько целей в одном правиле

Возможный дубликат:
GNU Makefile правило, генерирующее несколько целей из одного исходного файла

Если у меня есть правило Makefile, например:

a b c:
    echo "Creating a b c"
    touch a b c

output: a b c
    cat a b c > output

и я запустил make -j9 output

make видит 3 зависимости (a, b, c), ищет, как их создавать: (правило "a b c" выше), но что будет дальше? Если он не понимает, что правило "a b c" нужно запускать только один раз, чтобы создать все 3 цели?

Это то, что делает на самом деле:

[[email protected] test]$ make -j9 output -n
echo "Creating a b c"
touch a b c
echo "Creating a b c"
touch a b c
echo "Creating a b c"
touch a b c                                                                                                                                                                                                                                                                    
cat a b c > output                                                                                                                                                                                                                                                             
[[email protected] test]$

Тот же рецепт запускается 3 раза, один раз для каждой зависимости, чтобы правило "выводить"!

Кто-нибудь знает, почему он ведет себя таким образом?

4b9b3361

Ответ 1

В правиле a b c: указано, что это означает, что это как any для этих целей, а не как построить все из них. Make не достаточно умен, чтобы анализировать команды и вывести, что запуск правила однажды будет создавать все три. Make знает (из правила output), что он должен перестроить a, b и c, чтобы он это делал. Он запускает первое правило один раз для a, один раз для b и один раз для c.

Если вы хотите перестроить их отдельно, сделайте следующее:

a b c:
    echo "Creating [email protected]"
    touch [email protected]

Если вы хотите перестроить их все сразу, сделайте что-то вроде этого:

.PHONY: things
things:
    echo "Creating a b c"
    touch a b c

output: things
    cat a b c > output

или еще лучше:

THINGS = a b c
.PHONY: things
things:
    echo "Creating $(THINGS)"
    touch $(THINGS)

output: things
    cat $(THINGS) > output

Ответ 2

a b c - три разные цели/цели без каких-либо предварительных условий. i, e сказать, что он будет строить цель, когда будет просить.

a b c:
    echo "Creating a b c"
    touch a b c

Вы запрашиваете make для создания целевого именованного вывода, который имеет b c как предварительные условия. Таким образом, цели b c строятся последовательно и, наконец, вывод построен.

Теперь в вашем случае все цели создаются неизменно, когда вызывается один из них. Поэтому, чтобы избежать избыточной сборки, вам придется добавлять предварительные условия для целей a, b, c. Построить цель "a", только если "a" не существует. Аналогично для 'b' и 'c'

a b c: [email protected]
    echo "Creating a b c"
    touch a b c

Однако это нецелесообразно. В идеале цели Makefile должны быть очень конкретными.