如何根据模式先决条件设置Makefile目标?

如何根据模式先决条件设置Makefile目标?,makefile,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 '%.

我在一个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发出请求,需要花费很多时间,事实上不应该无缘无故地重复


有没有办法建立这种依赖关系

onefile.z:%.y第二个其他脚本
是常规规则,而不是模式规则或静态模式规则,因此
%
是按字面解释的。即使它是一个模式规则,make如何推断出茎应该匹配什么

$(通配符*.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文档

  • 通配符函数
  • 替代函数
这确实有效,非常感谢!(尽管如此,换行符变成了破坏格式的东西,让我困惑了一段时间)