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

时间:2015-10-15 18:53:59

标签: makefile

我想写一个看起来像这样的规则:

A_vs_B.txt : A.txt B.txt

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

1 个答案:

答案 0 :(得分:2)

两种选择:

  1. Secondary expansion(您对依赖项中的字符串设置的想法)。像这样的东西(可能是更好/更短的方式,但这是我先得到的)。

    A_v_B.txt: $$(addsuffix $$(suffix $$(lastword $$(subst _, ,$$@))),$$(firstword $$(subst _, ,$$@)) $$(lastword $$(basename $$(subst _, ,$$@))))
        @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 $@'
    

    应该有用。