Makefile忽略现有目录

时间:2019-06-24 13:15:34

标签: makefile gnu-make

我有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进行了检查,似乎它没有变化。

2 个答案:

答案 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)只是没有先决条件的目录,因此只有不存在时它才会重新生成。