2017-08-08 21 views
0

我正在使用一个旧版库,并试图在一些单元测试中努力帮助我进行开发。在这方面,我发现如果我可以在依赖关系上创建特定于目标的过滤器,那么将使它们的makefile适合我的单元测试更容易一些。目前,我会做这样的事情makefile中的目标的自定义依赖过滤器

var_list = input1 input2 
    out_list = $(var_list:%=%.txt) 

    all_deps = dep1 dep2 dep3 

    input1_filter = dep2 
    input2_filter = dep1 dep3 

    all: $(out_list) 

    input1.txt: %.txt: % $(filter-out $(input1_filter),$(all_deps)) 
     @echo "reqs = $?" 
     @echo "$< > [email protected]" 
     @echo $< > [email protected] 

    input2.txt: %.txt: % $(filter-out $(input2_filter),$(all_deps)) 
     @echo "reqs = $?" 
     @echo "$< > [email protected]" 
     @echo $< > [email protected] 

    clean: 
     @rm $(out_list) 

显然,以规则为input1.txtinput2.txt几乎是一样的,所以这将是巨大的,如果一个能写

var_list = input1 input2 
    out_list = $(var_list:%=%.txt) 

    all_deps = dep1 dep2 dep3 

    input1_filter = dep2 
    input2_filter = dep1 dep3 

    all: $(out_list) 

    $(out_list): %.txt: % $(filter-out $(%_filter),$(all_deps)) 
     @echo "reqs = $?" 
     @echo "$< > [email protected]" 
     @echo $< > [email protected] 

    clean: 
     @rm $(out_list) 

这意味着对于每一个目标我做,我只需要指定一个相应的_filter变量,其余的将由makefile来完成。但是我仍然无法获得这个工作。我发现可以在规则的主体中引用这些变量,例如,可以在主体中写入$(filter-out $($<_filter),$(all_deps)),但不能在依赖列表中写入。

+0

我从来没见过? –

+0

对不起,这只是一个错字,应该是$,我会修复它 –

回答

1

foreach-eval-call(GNU只作)是一个选项:

var_list = input1 input2 
out_list = $(var_list:%=%.txt) 

all_deps = dep1 dep2 dep3 

input1_filter = dep2 
input2_filter = dep1 dep3 

all: $(out_list) 

define MY_rule 
$(1).txt: $(1) $$(filter-out $$($(1)_filter),$$(all_deps)) 
    @echo "reqs = $$?" 
    @echo "$$< > [email protected]" 
    @echo $$< > [email protected] 
endef 
$(foreach v,$(var_list),$(eval $(call MY_rule,$(v)))) 

clean: 
    @rm $(out_list) 

注重双$$,它们是重要的。有关此构造的详细解释,请参阅this other answer以获得类似的问题。

编辑:函数应该这样`&(filter_out ...`之前(我的意思是,'&'标志调用使函数)是什么让您使用的是过滤出

+0

是的,似乎工作,谢谢。所以我想没有办法扩展依赖关系中的模式子,并且它也评估我也修复了一些你最初是我的拼写错误的答案错误 –

+0

@JonasGlesaaen我不明白你的问题你是什么意思* *依赖*中的模式子*和*评估* *? –

+0

基本上,当编写依赖关系时,我期望$(%_ filter)模式匹配$(input1_filter)(因为在这种情况下,词干应该是input1或input2),然后查找它,但似乎并非如此。也许它会将本地文件夹放在主干上?例如。该词干实际上是./input1,这意味着它匹配$(./ input1_filter),它不是一个变量。 –