我想做这样的事情:
%_0.x: %.y
tool $^ -b 0 -o $@
%_1.x: %.y
tool $^ -b 1 -o $@
.
.
.
%_n.x: %.y
tool $^ -b n -o $@
但是,我不想单独列出每条规则,因为我不知道n可能是什么。
我尝试做这样的事情,想我是否可以使%_0.x规则正常工作然后我可以将它概括为任何n。但是这不起作用。
%.x : $$(subst\ _0,.y,%)
@echo Making $@ with option 0 using $^
%_1.x : %.y
@echo Making $@ with option 1 using $^ -- $(subst _1.x,.y,$@)
file.y:
@echo Making $@
查看make -p
输出,我看到以下内容。不知何故,该基地没有扩大。
Trying implicit prerequisite `$(subst _0,.y,file_0)'.
Looking for a rule with intermediate file `$(subst _0,.y,file_0)'.
Avoiding implicit rule recursion.
这是我的makefile输出:
$ make file_0.x
make: *** No rule to make target `file_0.x'. Stop.
$ make file_1.x
Making file.y
Making file_1.x with option 1 using file.y -- file.y
答案 0 :(得分:3)
Make的一大缺点是无法处理多个通配符。
我建议这个令人毛骨悚然的黑客:
.SECONDEXPANSION:
%.x: $$(firstword $$(subst _, ,$$@)).y
@echo Making $@ with option $(lastword $(subst _, ,$*)) using $^
答案 1 :(得分:1)
而不是使用subst,我们可以选择更灵活的,比如
.SECONDEXPANSION:
%.x: $$(shell echo %.y | sed 's/_[0-9]*//')
@echo Making $@ with option $$(echo $@ | sed 's/.*_\([0-9]*\).*/\1/') using $^
输出喜欢,
touch file.y
make file_1.x
Making file_1.x with option 1 using file.y
make file_2.x
Making file_2.x with option 2 using file.y