Makefile 如何使用模式规则像定义变量一样添加先决条件?
我有以下生成文件:Makefile 如何使用模式规则像定义变量一样添加先决条件?,makefile,gnu-make,Makefile,Gnu Make,我有以下生成文件: all: foo/bar/baz foo/%: @echo $(VAR) cp $@.in $@ # This works foo/bar/%: VAR := Hello world # This doesn't foo/bar/%: foo/bar/%.in foo/bar/baz.in: touch $@ 当我运行它时,输出是 Hello world cp foo/bar/baz.in foo/bar/baz cp: cannot sta
all: foo/bar/baz
foo/%:
@echo $(VAR)
cp $@.in $@
# This works
foo/bar/%: VAR := Hello world
# This doesn't
foo/bar/%: foo/bar/%.in
foo/bar/baz.in:
touch $@
当我运行它时,输出是
Hello world
cp foo/bar/baz.in foo/bar/baz
cp: cannot stat ‘foo/bar/baz.in’: No such file or directory
Makefile:4: recipe for target 'foo/bar/baz' failed
make: *** [foo/bar/baz] Error 1
换言之,这是可行的,但声明额外先决条件的等效语法却不行。我该怎么做呢
真正的用例是在构建之前复制头。我写
obj/subdir/%.o: CPPFLAGS += -Igen/include
obj/subdir/%.o: | gen/include
gen/include:
# Copy the headers
但是不会复制标题。您不能这样做。模式规则必须在创建规则时定义所有先决模式;以后不能添加它们
编写没有配方的模式规则。好的,我应该怎么做?您必须将
|gen/include
添加到定义配方的模式规则的原始定义中,或者将其显式添加到所有目标中(例如,如果您有一个变量OBJS
,其中包含所有的对象文件,您可以编写$(OBJS):| gen/include
。为什么VAR
赋值在这里生效?运行的目标与该模式匹配,所以应该如此。我在这里遗漏了一些内容(除非它适用,即使没有实际的目标与该模式得到应用,并有其他模式/目标做的工作)。你的“除非…”是正确的;确实。我没有仔细阅读过去。谢谢。