我想写一个看起来像这样的规则:
A_vs_B.txt : A.txt B.txt
但一般规则。问题是我不能有两个%s(据我所知)。我正在考虑只创建目标%.txt,然后使用字符串函数来解析依赖项中的A和B,但这将是相当复杂的。我想知道是否有更好的方法来编写这样的规则。
答案 0 :(得分:2)
两种选择:
Secondary expansion(您对依赖项中的字符串设置的想法)。像这样的东西(可能是更好/更短的方式,但这是我先得到的)。
A_v_B.txt: $$(addsuffix $$(suffix $$(lastword $$(subst _, ,$$@))),$$(firstword $$(subst _, ,$$@)) $$(lastword $$(basename $$(subst _, ,$$@))))
@echo $^
生成的目标/先决条件。虽然您如何生成所需的目标/先决条件取决于生成对的位置/方式/等。
H1 := $(REP1)
H2 := $(REP2)
SEP := _vs_
JOIN := $(SEP)
define mktgt
H1 += $R.pr1
H2 += $R.pr2
JOIN += $(SEP)
endef
$(foreach R,$(REP1) $(REP2) $(REP1)$(REP2),$(eval $(mktgt)))
PAIRS := $(join $(join $(H1),$(JOIN)),$(H2))
$(foreach P,$(PAIRS),$(eval $P.txt: $(addsuffix .txt,$(subst _vs_, ,$P))))
# Debugging output
$(foreach P,$(PAIRS),$(info $P.txt: $(addsuffix .txt,$(subst _vs_, ,$P))))
创建(正如您从调试输出中看到的)目标/先决条件映射。它没有给目标任何食谱。我假设你已经有一个食谱,并且你已经将它分配给所有适当的目标。
如果没有,那么添加如下内容:
$(PAIRS):
@echo 'Use $^ to generate $@'
应该有用。