Makefile 如果包含更新,请考虑MaFoE文件过期,仅当它存在时

Makefile 如果包含更新,请考虑MaFoE文件过期,仅当它存在时,makefile,gnu-make,Makefile,Gnu Make,考虑以下Makefile,如果Makefile或其包含的配置文件config.mk或local.mk发生更改,则该Makefile知道如何清理和重建自身: include config.mk -include local.mk -include dummy.rebuild all: ... # other targets... # https://stackoverflow.com/a/3892826/149138 dummy.rebuild: Makefile config.mk loc

考虑以下Makefile,如果Makefile或其包含的配置文件
config.mk
local.mk
发生更改,则该Makefile知道如何清理和重建自身:

include config.mk
-include local.mk

-include dummy.rebuild

all: ...
# other targets...

# https://stackoverflow.com/a/3892826/149138
dummy.rebuild: Makefile config.mk local.mk
    touch $@
    $(MAKE) -s clean
如果
config.mk
local.mk
实际存在,则此功能可以正常工作-如果修改了其中一个,则会触发
dummy.rebuild
目标并重建项目

但是,假设
local.mk
是一个可选文件,它可能存在,也可能不存在。在它不存在的情况下,
dummy.rebuild
规则似乎根本不会运行,即使Makefile或
config.mk
已更改。这与不存在依赖项的正常规则不同,通常会出现如下错误:

make: *** No rule to make target 'local.mk', needed by 'dummy.rebuild'.  Stop.
。。。但是,对于通过包含隐式添加为目标的
dummy.rebuild
目标,您只需获得:

make: Nothing to be done for 'all'.

如何实现makefile,以便在更改
makefile
config.mk
local.mk
中的任何一个时,执行
dummy.rebuild
目标,其中
local.mk
文件可能不存在?

我不完全确定您想做什么,但也许用这个来代替会给你想要的行为:

local.mk := $(wildcard local.mk)

include $(local.mk)
  ...
dummy.rebuild: Makefile config.mk $(local.mk)
  ...

使用
通配符
这里扩展到
local.mk
(如果文件存在),或者空字符串(如果它不存在),因此如果它不存在,将以各种方式被忽略。

我不完全确定您试图做什么,但使用它可能会使您获得想要的行为:

local.mk := $(wildcard local.mk)

include $(local.mk)
  ...
dummy.rebuild: Makefile config.mk $(local.mk)
  ...

使用
通配符
在这里扩展到
local.mk
,如果文件存在,或者如果它不存在,则扩展为空字符串,因此如果它不存在,则将在所有方面被忽略。

是的,这是我到目前为止确定的。是的,这是我到目前为止确定的。