如何根据模式先决条件设置Makefile目标?
我在一个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 '%.
*.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文档
- 通配符函数
- 替代函数