Как «заставить» приложение знать цель по умолчанию для сборки, если цель не указана?

188

Большинство приложений Linux скомпилированы с:

make
make install clean

Как я понял, make принимает имена целей сборки в качестве аргументов. Так installчто цель, которая копирует некоторые файлы, а после этого cleanцель, которая удаляет временные файлы.

Но какую цель будет makeстроить, если не указаны аргументы (например, первая команда в моем примере)?

grigoryvp
источник

Ответы:

233

По умолчанию он начинается с обработки первой цели, которая не начинается с . акой цели по умолчанию ; для этого может потребоваться обработка других целей, в частности, тех, от которых зависит первая цель.

Руководство по GNU Make охватывает все эти вещи и удивительно легко и информативно читается.

Марсель Госселин
источник
61
Вызов первой цели all- это просто соглашение.
Тобу
1
Их полезно запускать отдельно, если вы устанавливаете их для других пользователей, так как вам нужно только запустить make installin sudo, а не всю сборку.
Скотт Уэльс
2
К вашему сведению, запись по умолчанию для команды make не упоминает, что происходит, если вы не указали цель ..
Sekm
2
Если руководство GNU make охватывает все эти вопросы, почему был задан этот вопрос? Руководство прекрасно описывает, как писать правила, но не упоминает о том, как написать Makefile.
Ник
1
Я смотрю на make-файл, который является includeдругим make-файлом, чья первая цель %.o : %.cpp. Итак, целью по умолчанию является ... собрать все файлы .cpp?
Qwertie
178

Чтобы сэкономить другим несколько секунд и избавить их от необходимости читать руководство, вот краткий ответ. Добавьте это в начало вашего файла make:

.DEFAULT_GOAL := mytarget

mytarget теперь будет целью, которая выполняется, если выполняется make, и цель не указана.

Если у вас более старая версия make (<= 3.80), это не сработает. Если это так, то вы можете делать то, что упоминается, просто добавив это в начало вашего файла make:

.PHONY: default
default: mytarget ;

Ссылки: https://www.gnu.org/software/make/manual/html_node/How-Make-Works.html

Самуил
источник
1
@nathan Это делает mytarget целью по умолчанию, если кто-то запускает "make" без каких-либо параметров.
Самуэль
1
Обратите внимание, что .DEFAULT_GOAL, по-видимому, не поддерживается в GNU make v3.80, и я бы также предположил более ранние версии (v3.81 поддерживает это). Если вы используете старую версию make, вам нужно убедиться, что ваша цель по умолчанию является первой / самой верхней целью в вашем файле make.
Самуил
4
«... чтобы избавить их от необходимости читать руководство» - это один из пунктов SO: быстрые ответы на вопросы, которые в противном случае потребовалось бы время для поиска в древней документации.
WattsInABox
1
«Добавьте это в начало вашего файла make»: добавление в начало не кажется обязательным.
Аман Дип Гаутам
2
Это должен быть правильный ответ. Явный над неявным выигрышем в этом случае.
Сион
34

GNU Make также позволяет вам указать цель make по умолчанию, используя специальную переменную с именем .DEFAULT_GOAL. Вы даже можете сбросить эту переменную в середине файла Makefile, в результате чего следующая цель в файле станет целью по умолчанию.

Ссылка: Руководство по Gnu Make - Специальные переменные

Сандип Бхаттачарья
источник