Что означает «все» в make-файле? - PullRequest
91 голосов
/ 25 марта 2010

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

Есть идеи?

Ответы [ 4 ]

102 голосов
/ 25 марта 2010

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

  1. Сборка file1.o из file1.c
  2. Сборка file2.o из file2.c
  3. Сборка file3.o из file3.c
  4. Сборка исполняемого файла1 из file1.o и file3.o
  5. Сборка исполняемого файла2 из файла2.o

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

make file1.o

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

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

all: executable1 executable2

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

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

25 голосов
/ 29 марта 2014

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

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

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

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

.PHONY : all
all : executable

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

.DEFAULT_GOAL := all
2 голосов
/ 25 марта 2010

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

1 голос
/ 25 марта 2010

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

Другими примерами фиктивных целей являются "clean" и "install", и они работают одинаково.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...