Makefile игнорирует существующий каталог - PullRequest
0 голосов
/ 24 июня 2019

У меня есть Makefile:

MAKEFILE_DIR:=$(dir $(realpath $(lastword $(MAKEFILE_LIST))))
DIR:=$(MAKEFILE_DIR)/some/where

.PHONY: load install

load: $(DIR)
  some-actions...

$(DIR): install
  another-actions...

когда я запускаю make load, я вижу, что $(DIR) считается пропущенным, и $(DIR) вызывается цель, поэтому вызывается install и another-actions. Это происходит каждый раз. Где ошибка? Как это исправить, чтобы $(DIR) вызывался только тогда, когда его не существует?

PS. У меня была идея, что mtime из $(DIR) меняется, может быть, оно меняется после каждого запуска make. Я проверил это с stat, кажется, это не меняется.

Ответы [ 2 ]

1 голос
/ 24 июня 2019

Каждая .PHONY цель обрабатывается так, как если бы она не существовала . Поэтому он всегда перестраивается . Каждый раз, когда любое предварительное условие перестраивается, цель (в данном случае $ (DIR)) ТАКЖЕ ПОЛУЧАЕТСЯ .

Как это исправить

Либо выпадает install из $(DIR) (на самом деле, я не понимаю, почему install следует сделать до создания dir?), Либо сделайте это обязательным предварительным условием (которое точно означает, что он никогда не запускает восстановление своей цели).

У меня была идея, что mtime $ (DIR) меняется, возможно, оно меняется после каждого запуска make. Я проверил с помощью stat, кажется, он не меняется.

Но это может измениться. Таким образом, обычно каталоги выполняются только для заказа (хотя в данном конкретном случае это не имеет значения).

0 голосов
/ 24 июня 2019

Да, причина в фальшивой зависимости $(DIR). Это будет проверяться каждый раз, и потому что это фальшивка, то это будет переделывать. Этого можно избежать с помощью:

define install
commands-of-install...
endef

$(DIR): # no more install dep here
  $(call install)
  another-actions...

Таким образом, $(DIR) - это просто каталог без предварительных условий, поэтому он будет заново создавать, только если он не существует.

...