不止一次运行模式规则

时间:2014-09-25 14:20:09

标签: makefile

根据make文档,具有多个输出的模式规则仅运行一次,而普通规则可能多次运行。我想多次运行模式规则来共享配方。我知道我可以通过使用一个定义来共享它们,但这会带来一系列不同的问题。

我正在使用gnu make version 3.8.1

这是我想要使用的makefile。有没有办法让它运行模式规则四次?

build: test.a.x test.a.y test.b.x test.b.y

clean:
    rm -f test.a.x test.a.y test.b.x test.b.y

%.a.x: optAB=a
%.a.x: optXY=x
%.a.y: optAB=a
%.a.y: optXY=y
%.b.x: optAB=b
%.b.x: optXY=x
%.b.y: optAB=b
%.b.y: optXY=y

%.a.x %.a.y %.b.x %.b.y: %.v
    @echo optAB: $(optAB) optXY: $(optXY) $@ $<
    touch $@

1 个答案:

答案 0 :(得分:0)

the documentation中的相关行

  

如果模式规则有多个目标,则make知道规则的配方负责制作所有目标。

因此,解决这个问题的一种方法是定义多个目标。实现此目的的一种方法是使用foreach / eval / call:

build: test.a.x test.a.y test.b.x test.b.y

clean:
    rm -f test.a.x test.a.y test.b.x test.b.y

%.a.x: optAB=a
%.a.x: optXY=x
%.a.y: optAB=a
%.a.y: optXY=y
%.b.x: optAB=b
%.b.x: optXY=x
%.b.y: optAB=b
%.b.y: optXY=y

optset1 = a b
optset2 = x y

define target_template
%.$(1).$(2): %.v
    @echo optAB: $$(optAB) optXY: $$(optXY) $$@ $$<
    touch $$@

endef

$(foreach opt1,$(optset1),$(foreach opt2,$(optset2),$(eval $(call target_template,$(opt1),$(opt2)))))

我们为规则定义模板,然后为每个选项调用/ eval该模板,以生成多个规则,每个目标一个。请注意,模板定义中的$$是为了确保在定义模板时不扩展变量,但仅在评估模板以生成每个目标时。