如何使用依赖于目标部分的依赖项编写makefile规则?

问题描述:

我想写一个规则,看起来是这样的:如何使用依赖于目标部分的依赖项编写makefile规则?

A_vs_B.txt : A.txt B.txt 

但一般规则。问题是我不能有两个%s(据我所知)。我正在考虑只制作目标%.txt,然后使用字符串函数解析依赖项中的A和B,但这会非常复杂。我想知道是否有更好的方法来编写这样的规则。

+0

如何'A_vs_B.txt'确定的?有没有已知的配对?他们是否按顺序配对?在一个模式?任意? –

+0

当我运行make时,它们是由我设置的两个变量创建的。只有四个不同的目标是使用相同的命令生成的,只有命令中的两个依赖项是参数才会有所不同。我可以写出我不想让命令重复四次的四条规则,以防将来需要更改它。 – Colin

+0

向我展示参数/变量以及如何设置它们? –

两个选择:

  1. Secondary expansion(在依赖你的字符串改写(munging)的想法)。像这样的东西(可能是更好/更短的方式,但这是我第一次)。

    A_v_B.txt: $$(addsuffix $$(suffix $$(lastword $$(subst _, ,[email protected]))),$$(firstword $$(subst _, ,[email protected])) $$(lastword $$(basename $$(subst _, ,[email protected])))) 
        @echo $^ 
    
  2. 生成的目标/先决条件。尽管如何生成您需要的目标/先决条件取决于生成对的位置/方式等。

    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]' 
    

    应该工作。