Makefile忽略现有目录

Makefile忽略现有目录,makefile,gnu-make,Makefile,Gnu Make,我有一个文件: MAKEFILE_DIR:=$(dir $(realpath $(lastword $(MAKEFILE_LIST)))) DIR:=$(MAKEFILE_DIR)/some/where .PHONY: load install load: $(DIR) some-actions... $(DIR): install another-actions... 当我运行makeload时,我看到$DIR被视为丢失,并且$DIR目标被调用,所以install被调用,其他操

我有一个文件:

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

.PHONY: load install

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

$(DIR): install
  another-actions...
当我运行makeload时,我看到$DIR被视为丢失,并且$DIR目标被调用,所以install被调用,其他操作也被调用。每次都是这样。错误在哪里?如何修复它,使$DIR仅在它不存在时才被调用


另外,我认为$DIR的mtime会发生变化,可能是每次运行后都会发生变化。我用stat检查了一下,似乎没有变化。

是的,原因是$DIR的虚假依赖性。每次都会测试,因为它是假的,所以会重新制作。这可以通过以下方式避免:

define install
commands-of-install...
endef

$(DIR): # no more install dep here
  $(call install)
  another-actions...
因此$DIR只是一个没有先决条件的目录,因此它将重新生成它不存在的目录。

每个虚假目标都被视为不存在。因此,它总是被重建。每次重建任何先决条件时,都会重建目标(在本例中为$DIR)

如何修复它

要么从$DIR退出安装事实上,我不明白为什么在创建DIR之前要进行安装,要么将其作为仅限订单的先决条件,这意味着它永远不会触发目标的重建

我认为$DIR的mtime会发生变化,可能是每次运行后都会发生变化。我用stat检查了一下,似乎没有变化


但它可以改变。因此,通常目录都是只按顺序生成的先决条件,尽管在这种特殊情况下它似乎无关紧要。

我用make-d检查了make行为,并且似乎它测试了先决条件,它们总是伪造$DIR,即使它存在。然后写入$DIR deps已更新。这正常吗?我很困惑是的,我用make-d检查过了。让我感到困惑的是检查现有目录的先决条件,但您是对的,这是正确的,因为它想知道$dir是否应该重新设置-making@Paul-AG make就是这样工作的:它检查先决条件以确定是否应该重建目标。目标是目录还是常规文件并不重要。