如果包含已更新,则认为makefile已过期,仅当存在时才会更新

时间:2018-01-13 20:45:54

标签: makefile gnu-make

如果Makefile或其包含的配置文件config.mklocal.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.mklocal.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,以便在Makefileconfig.mklocal.mk中的任何一个更改时,执行dummy.rebuild目标,其中local.mk文件可能不存在?

1 个答案:

答案 0 :(得分:2)

我不完全确定你要做什么,但也许使用它会给你你想要的行为:

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

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

如果文件存在,则使用wildcard此处扩展为local.mk,如果不存在则将空字符串扩展为空字符串,因此如果它不存在则会被忽略