如何使用依赖于目标部分的依赖项编写makefile规则?
问题描述:
我想写一个规则,看起来是这样的:如何使用依赖于目标部分的依赖项编写makefile规则?
A_vs_B.txt : A.txt B.txt
但一般规则。问题是我不能有两个%s(据我所知)。我正在考虑只制作目标%.txt,然后使用字符串函数解析依赖项中的A和B,但这会非常复杂。我想知道是否有更好的方法来编写这样的规则。
答
两个选择:
-
Secondary expansion(在依赖你的字符串改写(munging)的想法)。像这样的东西(可能是更好/更短的方式,但这是我第一次)。
A_v_B.txt: $$(addsuffix $$(suffix $$(lastword $$(subst _, ,[email protected]))),$$(firstword $$(subst _, ,[email protected])) $$(lastword $$(basename $$(subst _, ,[email protected])))) @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 [email protected]'
应该工作。
如何'A_vs_B.txt'确定的?有没有已知的配对?他们是否按顺序配对?在一个模式?任意? –
当我运行make时,它们是由我设置的两个变量创建的。只有四个不同的目标是使用相同的命令生成的,只有命令中的两个依赖项是参数才会有所不同。我可以写出我不想让命令重复四次的四条规则,以防将来需要更改它。 – Colin
向我展示参数/变量以及如何设置它们? –