В GNU Make версии 3.81 введена специальная переменная с именем .DEFAULT_GOAL, которую можно использовать, чтобы указать команде Make, какая цель (или цель) должна быть построена, если в командной строке не была указана цель. В противном случае Make просто сделает первую цель, с которой столкнется.
Рассмотрим:
bar: a b c
${MAKE_BAR_COMMANDS}
foo: x y z
${MAKE_FOO_COMMANDS}
С помощью приведенного выше гипотетического Makefile, запуск make
создаст «бар», потому что это первая цель, с которой сталкивается Make. Но если мы добавим .DEFAULT_GOAL, вот так ...
.DEFAULT_GOAL := foo # Build foo by default, even if it's not first.
bar: a b c
${MAKE_BAR_COMMANDS}
foo: x y z
${MAKE_FOO_COMMANDS}
... затем Make (версия 3.81) создаст "foo", если мы запустим просто make
.
Я нашел эту переменную .DEFAULT_GOAL весьма полезной в модульной, многократно используемой «среде» Makefile, которую я построил. Тем не менее, я обнаружил, что многие системы по-прежнему имеют GNU Make 3.80 или старше, и они не поддерживают эту переменную.
Играя с вещами, я заметил, что простое указание пустого целевого правила, похоже, имеет тот же эффект, что и .DEFAULT_GOAL, даже в версиях GNU до 3.81 до: 3. 1015 *
foo: # Empty target rule
bar: a b c
${MAKE_BAR_COMMANDS}
foo: x y z
${MAKE_FOO_COMMANDS}
Я знаю, что допустимо и законно добавлять правила и / или предварительные требования к цели, указав дополнительные правила цели таким образом. Однако мне интересно, может ли это привести к появлению потенциально нежелательных побочных эффектов, которые не возникают при использовании .DEFAULT_GOAL.
Полагаю, мне интересно, почему был введен .DEFAULT_GOAL, если вы можете достичь того же с помощью простого пустого правила цели. Это заставляет меня подозревать, что они, возможно, не приводят к точно такому же поведению.
Итак, основной вопрос: есть ли внешне обнаруживаемая разница между использованием .DEFAULT_GOAL по сравнению с пустым целевым правилом?