首页 > 解决方案 > Makefile 忽略现有目录

问题描述

我有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)更改的时间,可能是每次“制作”运行后都会发生变化。我检查了它stat,似乎它没有改变。

标签: makefilegnu-make

解决方案


每个.PHONY目标都被视为不存在。因此,它总是被重建。每次重新构建任何先决条件时,目标(在本例中为 $(DIR))也是 REBUILT

如何修复它

要么退出install$(DIR)实际上,我不明白为什么install要在创建目录之前完成?),要么将其作为仅订单的先决条件(这意味着它永远不会触发重建其目标)。

我知道 $(DIR) 更改的 mtime 可能是在每次“make”运行后发生变化。我用stat检查了它,似乎它没有改变。

但它可以改变。因此,通常将目录设为仅订单的先决条件(尽管在这种特殊情况下似乎无关紧要)。


推荐阅读