Построение цели путем включения несуществующего файла - PullRequest
0 голосов
/ 19 октября 2019

У меня есть простой Makefile, который я пытаюсь понять и найти документацию, почему он работает, поэтому я надеюсь, что кто-то здесь может помочь мне с обоими аспектами.

Вот мой Makefile:

TEMP_DIR = ~/Desktop/temp

default:
    $(info "reached default")

$(TEMP_DIR)/myfile.txt:
    $(info "running temp_dir target")

-include $(addprefix $(TEMP_DIR)/, myfile.txt)

Теперь я понимаю, что когда вы вызываете make без передачи цели, она прочитает весь Makefile, а затем обработает первую цель. В этом случае это будет цель default.

Когда make читает последнюю строку, он проверит, есть ли файл myfile.txt, и включит ли его. Если это не так, то он не должен выдавать какую-либо ошибку, потому что я использую директиву -include. Как указано в GNU make manual:

Если вы хотите, чтобы make просто игнорировал make-файл, который не существует или не может быть переделан, без сообщения об ошибке, используйте директиву -include вместо include

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

"running temp_dir target"
"reached default"
make: `default' is up to date.

Мой вопрос: почему он выполняет эту цель? Мой второй вопрос: есть ли документация по созданию целей путем включения несуществующих файлов? Мне это не кажется традиционным способом восстановления цели.

Кроме того, для дальнейшего изучения, если я закомментирую строку включения, я получу следующий вывод:

"reached default"
make: `default' is up to date.

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

1 Ответ

0 голосов
/ 19 октября 2019

Nevermind. Я нашел ответ.

Руководство по сборке GNU Makefile использует этот метод для перестройки make-файлов при их включении. В руководстве говорится:

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

Другими словами, каждый включенный файл считается целью цели. И поэтому, когда я включаю файл myfile.txt, он запускает рецепт для цели, которая соответствует этому файлу.

Вот ссылка на то, где я нашел ответ:

https://www.gnu.org/software/make/manual/html_node/Remaking-Makefiles.html#Remaking-Makefiles

...