首页 文章

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

提问于
浏览
0

如果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 回答

  • 2

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

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

    如果文件存在,则使用 wildcard 此处扩展为 local.mk ,如果不存在,则使用空字符串't exist so it will be ignored in all ways if it' .

相关问题