Я хочу написать (GNU) make-правило, которое зависит от наличия какого-либо файла (любого произвольного файла) в подкаталоге. В моем конкретном случае этот подкаталог является подмодулем git.
Вот что у меня есть:
DEP = submod/.git
$(DEP):
git submodule update --init $(@D)
submod/%: | $(DEP)
@ # why do I need this?
install: submod/junk.c
echo installing
Если я затем наберу make install
, команда git будет запущена (измените ее на mkdir -p $(@D); touch $@
для теста, не относящегося к git), и make не будет жаловаться.
У меня два вопроса. Прежде всего, есть ли какие-либо побочные эффекты в манекене для рецепта submod/%
, о котором я должен беспокоиться? Во-вторых, и что еще интереснее, зачем мне этот рецепт вообще? Если я уберу это, сделаю ошибки:
make: *** No rule to make target 'submod/junk.c', needed by 'install'. Stop.
Моя единственная гипотеза состоит в том, что make выполняет некоторую оптимизацию на основе файлов, которые существуют при запуске, и с версией без рецепта она думает, что может просто ожидать, что файл будет существовать, когда это необходимо, но с любым рецептом там , он не может сделать эту оптимизацию, и он переоценивает, когда это необходимо. Если это правда, это ошибка или что-то, что должно быть изменено?