У меня есть простой 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.
Таким образом, я могу подтвердить, что включение несуществующего файла фактически приводит к перестроению второй цели.