如何设置Makefile目标取决于模式先决条件?

时间:2016-10-03 10:19:34

标签: makefile

我在makefile中有一系列模式依赖项,最后它们应该放在一个文件中,例如:*.x - > *.y - > onefile.z

所以我制作了这样的文件:

$ touch a.x b.x

和规则:

%.y: %.x some-other-script
    touch $@

onefile.z: %.y second-other-script
    touch $@

此规则不起作用:

$ make onefile.z
make: *** No rule to make target '%.y', needed by 'onefile.z'.  Stop.

使用通配符:

%.y: %.x some-other-script
    touch $@

z: $(wildcard *.y) second-other-script
    touch $@

这也不起作用:它看到没有*.y个文件并继续使onefile.z跳过第一个规则。

$ make onefile.z
touch onefile.z

$ ls
a.x b.x onefile.z Makefile

我可能会将两个规则合并为一个,但在实际应用程序中,有更多步骤,有些是通过HTTP发出请求并花费很多时间,实际上不应该没有理由重复。

有没有办法做出这样的依赖?

1 个答案:

答案 0 :(得分:2)

onefile.z: %.y second-other-script是常规规则,而不是模式规则或静态模式规则,因此%按字面解释。即使它是一个模式规则,如何推断该词应该匹配什么?

$(wildcard *.y)告诉make查找匹配*.y的所有文件,但当然还没有,所以它返回一个空字符串。

如果我能正确理解您的问题,以下内容应该有效:

xfiles := $(wildcard *.x)
yfiles := $(xfiles:.x=.y)

%.y: %.x some-other-script
    touch $@

onefile.z: $(yfiles) second-other-script
    touch $@

请参阅

上的Gnu Make文档