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
赋值在这里生效?运行的目标与该模式匹配,所以应该如此。我在这里遗漏了一些内容(除非它适用,即使没有实际的目标与该模式得到应用,并有其他模式/目标做的工作)。你的“除非…”是正确的;确实。我没有仔细阅读过去。谢谢。