Makefile中的动态包含指令

时间:2016-04-20 11:36:21

标签: makefile

让我们考虑一下这个Makefile:

$type->user_type == "Employer"

文件.SUFFIXES: .DEFAULT_GOAL := all out=foo clean: rm -f vars.mk rm -f $(out) vars.mk: vars.mk.default @echo "Regenerating $@..." cp $< $@ # Let's assume the translation is much complex than a cp -include vars.mk ifeq ($(filter foo,$(FOO)),) $(error FOO undefined) endif all: $(out) $(out): vars.mk echo "Cow says: I am not a $(FOO)." > $@

vars.mk.default

如果FOO = foo bar 更新,我想重新生成目标。此外,作为仔细检查,必须检查vars.mk.default中是否存在foo

如果更新$(FOO),如何强制make重新生成vars.mk

换句话说,我想要这个输出:

vars.mk.default

3 个答案:

答案 0 :(得分:2)

如果vars.mk不存在,为了避免失败,请先检查一下:

ifeq ($(wildcard vars.mk),vars.mk)
  ifeq ($(filter foo,$(FOO)),)
    $(error FOO undefined)
  endif
endif

答案 1 :(得分:1)

  

我的目标是在更新vars.mk.default时重新生成目标。

在这种情况下,让你的目标依赖于该文件,但在食谱中过滤掉它,例如

foo.o : foo.cc vars.mk.default
    $(COMPILE) $(filter-out vars.mk.default,$^)
  

如果vars.mk不存在,则在ifeq上make失败并且不生成vars.mk。

Make将构建vars.mk并重新启动,有关详细信息,请参阅How Makefiles Are Remade

因此,为了避免该错误,请先检查FOO是否定义为ifdef FOO

答案 2 :(得分:0)

有几件事。首先,您应该在include前面放置一个main,以防止在文件不存在时弹出警告:

-

如果没有生成vars.mk,这不会导致致命错误,但是因为vars.mk规则在这种情况下会失败,所以你会从那里得到错误。

然后,您可以在食谱中检查-include vars.mk 是否包含$(FOO)

foo

配方仅在生成并包含vars.mk后运行,因此它应该只在您想要的条件下失败。