make - 使用模式替换构建多个目标

时间:2016-02-29 16:31:04

标签: makefile gnu-make

我想做这样的事情:

%_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

2 个答案:

答案 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