我在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发出请求并花费很多时间,实际上不应该没有理由重复。
有没有办法做出这样的依赖?
答案 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文档$(wildcard ...)
$(foo:from=to)