Зачем делать так, чтобы --dry-run с $ (MAKE) в рецепте приводило к ошибке? - PullRequest
0 голосов
/ 10 декабря 2018

Когда я запускаю make --dry-run на

all:
    false  # $(MAKE)

с использованием GNU Make 4.2.1, я получаю следующую ошибку.Почему?

false  # make all
make: *** [Makefile:2: all] Error 1

1 Ответ

0 голосов
/ 10 декабря 2018

https://www.gnu.org/software/make/manual/make.html#Instead-of-Execution:

Параметры -n, -t и -q не влияют на строки рецепта, которые начинаются с + символов или содержат строки $(MAKE) или ${MAKE}.

(--dry-run - это псевдоним -n.)

https://www.gnu.org/software/make/manual/make.html#MAKE-Variable:

subsystem:
        cd subdir && $(MAKE)

[...]

В качестве специальной функции использование переменной MAKE в рецепте правила изменяет эффекты -t (--touch), -n (--just-print) или -q (--question) вариант.Использование переменной MAKE имеет тот же эффект, что и использование символа + в начале строки рецепта.

[...]

Рассмотрим команду make -t вприведенный выше пример.(Опция -t помечает цели как актуальные без фактического запуска каких-либо рецептов; см. вместо выполнения .) Следуя обычному определению -t, команда make -t в примере создастфайл с именем подсистемы и больше ничего не делать.То, что вы действительно хотите, это запустить cd subdir && make -t;но для этого нужно выполнить рецепт, а -t говорит не выполнять рецепты.

Специальная функция заставляет вас делать то, что вы хотите: всякий раз, когда строка рецепта правила содержит переменную MAKE, флаги-t, -n и -q не относятся к этой строке.Строки рецептов, содержащие MAKE, выполняются в обычном режиме, несмотря на наличие флага, из-за которого большинство рецептов не запускаются.

Ваш рецепт содержит $(MAKE), поэтому он выполняется, несмотря на --dry-run.false возвращает состояние выхода 1, что считается ошибкой make.

...