根据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 $@
答案 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该模板,以生成多个规则,每个目标一个。请注意,模板定义中的$$
是为了确保在定义模板时不扩展变量,但仅在评估模板以生成每个目标时。