Что означает «все» в make-файле?

105

Я читал несколько руководств по Makefile, но мне все еще неясно, что означает цель «все» и что она делает.

Любые идеи?

Крис Смуллиан
источник

Ответы:

117

Сборка, как ее понимает Makefile, состоит из множества целей. Например, для создания проекта вам может потребоваться

  1. Построить file1.o из file1.c
  2. Постройте file2.o из file2.c
  3. Построить file3.o из file3.c
  4. Создайте исполняемый файл1 из file1.o и file3.o
  5. Собрать исполняемый файл2 из file2.o

Если вы реализовали этот рабочий процесс с помощью make-файла, вы могли бы создать каждую из целей отдельно. Например, если вы написали

make file1.o

он будет строить этот файл только в случае необходимости.

Имя allне зафиксировано. Это просто условное имя; alltarget означает, что если вы его вызовете, make соберет все, что необходимо для создания полной сборки . Обычно это фиктивная цель, которая не создает никаких файлов, а просто зависит от других файлов. Для приведенного выше примера сборка всего необходимого - это сборка исполняемых файлов, а другие файлы втягиваются как зависимости. Итак, в make-файле это выглядит так:

all: executable1 executable2

alltarget обычно является первым в make-файле, так как если вы просто напишете makeв командной строке, не указывая цель, она построит первую цель. И вы этого ожидаете all.

allобычно также является .PHONYцелью. Узнайте больше здесь .

П Швед
источник
31

Руководство по GNU Make дает четкое определение allв своем списке стандартных целей .

Если автор Makefile следует этому соглашению, цель allдолжна:

  1. Скомпилируйте всю программу, но не сборку документации.
  2. Быть целью по умолчанию. Как и в беге, makeнужно делать то же самое, что и make all.

Достижение 1 allобычно определяется как .PHONYцель, которая зависит от исполняемых файлов, которые формируют всю программу:

.PHONY : all
all : executable

Для достижения 2 allдолжна быть либо первая цель, определенная в файле make, либо назначенная как цель по умолчанию:

.DEFAULT_GOAL := all
PeterSW
источник
3

Не уверен, что это означает что-то особенное. Это просто соглашение, согласно которому вы предоставляете правило «все», и обычно оно используется для перечисления всех подцелей, необходимых для создания всего проекта, отсюда и название «все». Единственная особенность в этом заключается в том, что часто люди помещают его в качестве первой цели в make-файле, а это означает, что простой ввод «make» будет делать то же самое, что и «make all».

JustJeff
источник
2

Цель «все» - это пример фиктивной цели - на диске нет ничего, что называется «все». Это означает, что когда вы выполняете команду «make all», make всегда думает, что ей необходимо ее построить, и поэтому выполняет все команды для этой цели. Как правило, эти команды создают все конечные продукты, о которых знает make-файл, но они могут делать что угодно.

Другими примерами фиктивных целей являются «очистить» и «установить», и они работают таким же образом.

Если вы еще не читали его, вам следует прочитать Руководство GNU Make Manual , которое также является отличным учебным пособием.


источник