2009-07-10 2 views
2

GNU Сделать версию 3.81 введена специальная переменная с именем .DEFAULT_GOAL, которая может использоваться для указания Make, какая цель (или цель) должна быть построена, если в командной строке не указана цель. В противном случае Make просто сделает первую цель, с которой он сталкивается.Является ли пустая цель правильной жизнеспособной заменой .DEFAULT_GOAL в GNU Make?

Рассмотрим:

 
bar: a b c 
     ${MAKE_BAR_COMMANDS} 

foo: x y z 
     ${MAKE_FOO_COMMANDS} 

С выше гипотетической Makefile, запуск 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} 

... затем сделать (версия 3.81) будет строить "Foo", если мы управляем только make.

Я нашел эту переменную .DEFAULT_GOAL весьма полезной в модульной, повторно используемой «фреймворке» Makefile, которую я создал. Тем не менее, я считаю, что многие системы по-прежнему имеют GNU Make 3,80 или более старые, и они не поддерживают эту переменную.

В то время как играть с вещами, я заметил, что просто указать пустой целевой правило, кажется, имеет тот же эффект, как и .DEFAULT_GOAL, даже на предварительно 3,81-версии GNU Make:

 
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

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

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

Ваше «foo: # Пустое правило назначения» конфликтует с правилами двойной толстой кишки.

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

Смежные вопросы