我有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。我本来以为$(DIR)
的mtime会发生变化,可能是每次“ make”运行后它都在变化。我用stat
进行了检查,似乎它没有变化。
答案 0 :(得分:1)
将每个.PHONY
目标视为不存在。因此,它是始终重建。每次重建任何先决条件时,目标(在这种情况下为$(DIR))也是重建。
如何修复
从install
中退出$(DIR)
(实际上,我不明白为什么要在创建目录之前 之前完成install
?)只限订单的先决条件(这恰恰意味着它永远不会触发目标的重建)。
我本来以为$(DIR)的mtime会改变,可能是每次“ make”运行后它都在改变。我检查了它的统计信息,似乎它没有改变。
但是它可以进行更改。因此,通常将目录作为仅订购的先决条件(尽管在特定情况下似乎无关紧要)。
答案 1 :(得分:0)
是的,原因是$(DIR)
的虚假依赖性。每次都会对其进行测试,因为它是假的,所以会重新制作。可以通过以下方法避免这种情况:
define install
commands-of-install...
endef
$(DIR): # no more install dep here
$(call install)
another-actions...
所以$(DIR)
只是没有先决条件的目录,因此只有不存在时它才会重新生成。