让我们考虑一下这个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
答案 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后运行,因此它应该只在您想要的条件下失败。