Является ли пустое целевое правило реальной заменой .DEFAULT_GOAL в GNU Make? - PullRequest
2 голосов
/ 10 июля 2009

В 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 по сравнению с пустым целевым правилом?

Ответы [ 2 ]

2 голосов
/ 21 ноября 2011

Ваше "foo: # Empty target rule" конфликтует с правилами с двоеточием.

Если вы исключите их (:: rules), это сработает, только если это первое правило. Итак, если вы «включаете clear-variables.mk» в начале, и в целом имеете сложную сеть включаемых файлов, это ".DEFAULT_GOAL" сделает очевидным & проверено , что только 1 правило может быть по умолчанию.

2 голосов
/ 11 июля 2009

Я не могу дать вам однозначный ответ, но могу предложить другие причины его введения:

  1. Сразу видно, что делает .DEFAULT_GOAL; то есть то, что написано на этикетке. Наличие и значение однострочной пустой цели легко замаскировать, особенно в большом Makefile
  2. На самом деле вы можете прочитать значение $(.DEFAULT_GOAL) в другом месте в Makefile. Тестирование показывает, что не имеет значения, установлен ли он явно или же он определяется путем выбора первого правила.
...