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

Makefile make-使用模式替换构建多个目标,makefile,gnu-make,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可能是什么 我试着这样做,想如果我能让%\u 0.x规则起作用,那么我就可以把它推广到任何n。然而,这不起作用 %.x : $$(subst\ _0,.y,%) @echo Making $@ with opti

我想这样做:

%_0.x: %.y
tool $^ -b 0 -o $@

%_1.x: %.y
    tool $^ -b 1 -o $@

.
.    
.
%_n.x: %.y
    tool $^ -b n -o $@
然而,我不想单独列出每个规则,因为我不知道n可能是什么

我试着这样做,想如果我能让%\u 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
输出,我看到以下内容。不知何故,subst没有被扩展

   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

我们可以使用更灵活的sed代替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

我们可以使用更灵活的sed代替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

Make最大的缺点之一是无法处理多个通配符

我建议使用这种可怕的黑客手段:

.SECONDEXPANSION:
%.x: $$(firstword $$(subst _, ,$$@)).y
    @echo Making $@ with option $(lastword $(subst _, ,$*)) using $^

Make最大的缺点之一是无法处理多个通配符

我建议使用这种可怕的黑客手段:

.SECONDEXPANSION:
%.x: $$(firstword $$(subst _, ,$$@)).y
    @echo Making $@ with option $(lastword $(subst _, ,$*)) using $^

这对你有用吗?我无法让它为我工作。
.SECONDEXPANSION
于3.81(2006年4月)引入;如果你有一个较旧的版本,那就可以解释了。谢谢你提供的版本信息-我刚刚检查了这在3.81的系统上是否有效。另一台机器有3.80。这对你有用吗?我无法让它为我工作。
.SECONDEXPANSION
于3.81(2006年4月)引入;如果你有一个较旧的版本,那就可以解释了。谢谢你提供的版本信息-我刚刚检查了这在3.81的系统上是否有效。另一台机器有3.80。这对你有用吗?我试过了,但它对我不起作用。是的,它在这里起作用,只是更新了原始答案中的输出。下面Beta的答案也不错,这对你有用吗?我试过了,但它对我不起作用。是的,它在这里起作用,只是更新了原始答案中的输出。下面Beta的答案也不错