Что происходит, когда мы повторяем команду make all? - PullRequest
1 голос
/ 02 мая 2020

Я пытаюсь понять, как работают make-файлы. Это пример make-файла:

all: prog
x.o: x.cpp globals.hh
    $(CC) -c x.cpp
y.o: y.cpp globals.hh
    $(CC) -c y.cpp
prog: x.o y.o
    $(LD) -o prog x.o y.o -lc

Если я сделаю make file, а затем внесу некоторые изменения в x.cpp, а затем повторите make all, какие команды будут перезапущены?

Насколько я понимаю, будут выполняться следующие команды:

$(CC) -c x.cpp

и

-o prog x.o y.o -lc

И если я вместо этого изменю файл заголовков, я думаю, что все три будут перезапущены, когда я сделаю все снова.

Я прав? Какова будет последовательность?

Также я пытаюсь понять, как может выглядеть граф зависимостей make-файла. Я знаю, что все, хо, йо и прог здесь цели. Но имеет ли смысл моя логика c? enter image description here

1 Ответ

0 голосов
/ 02 мая 2020

Ни один не будет перезапущен.

При создании x.o, y.o и prog каждый из них будет новее, чем соответствующие им входные файлы.

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

Из POSIX spe c в make:

РАСШИРЕННОЕ ОПИСАНИЕ

Утилита make пытается выполнить действия, необходимые для обеспечения актуальности указанных целей. Цель должна считаться обновленной, если она существует и новее, чем все ее зависимости, или если она уже была обновлена ​​текущим вызовом make (независимо от существования или возраста цели). Цель также может считаться обновленной, если она существует, имеет тот же возраст, что и одна или несколько ее предпосылок, и новее, чем остальные предпосылки (если таковые имеются). Утилита make должна обрабатывать все предпосылки как сами цели и рекурсивно проверять их актуальность, обрабатывая их в том порядке, в котором они появляются в правиле. Утилита make должна использовать времена изменения файлов, чтобы определить, устарели ли соответствующие цели.

Чтобы обеспечить актуальность цели, make должен убедиться, что все предварительные условия для цели обновлены, затем проверьте, является ли сама цель актуальной. Если цель не обновлена, цель должна быть обновлена ​​путем выполнения команд правила (если таковые имеются). Если цель не существует после того, как цель была успешно обновлена, цель должна рассматриваться как более новая, чем любая цель, для которой она является обязательным условием.

Если цель существует и существует ни целевое правило, ни правило вывода для цели, цель не должна считаться актуальной. Будет ошибкой, если make попытается убедиться, что цель обновлена, но цель не существует, и для цели не существует ни правила цели, ни правила вывода.

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