makefiles中目标的自定义依赖项筛选器

makefiles中目标的自定义依赖项筛选器,makefile,gnu-make,Makefile,Gnu Make,我正在使用一个遗留库,并试图加入一些单元测试来帮助我进行开发。在使用它的过程中,我发现如果我可以在依赖项上创建特定于目标的过滤器,那么就可以更容易地使它们的makefile适应我的单元测试。现在我会做这样的事情 var_list = input1 input2 out_list = $(var_list:%=%.txt) all_deps = dep1 dep2 dep3 input1_filter = dep2 input2_filter = dep

我正在使用一个遗留库,并试图加入一些单元测试来帮助我进行开发。在使用它的过程中,我发现如果我可以在依赖项上创建特定于目标的过滤器,那么就可以更容易地使它们的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 "$< > $@"
        @echo $< > $@

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

    clean:
       @rm $(out_list)

这意味着,对于我创建的每个目标,我只需要指定一个相应的
\u filter
变量,makefile将处理其余的部分。然而,我仍然没能让它工作。我发现可以在规则主体中引用这些变量,例如,可以写入
$(过滤掉$($
foreach eval call
(仅GNU make))是一个选项:

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 "$$< > $$@"
    @echo $$< > $$@
endef
$(foreach v,$(var_list),$(eval $(call MY_rule,$(v))))

clean:
   @rm $(out_list)
var\u list=input1 input2
输出列表=$(变量列表:%=%.txt)
所有部门=部门1部门2部门3
输入1_过滤器=dep2
输入2_过滤器=dep1 dep3
全部:$(外部列表)
定义我的规则
$(1).txt:$(1)$(过滤掉$($(1)\过滤),$(所有部门))
@echo“需求=$$?”
@回显“$$<>$$@”
@echo$$<>$$@
恩德夫
$(foreach v,$(var_list),$(eval$(调用MY_规则,$(v)))
清洁:
@rm$(外部列表)
请注意双精度
$$
,它们很重要。有关此构造的详细说明,请参阅类似问题


编辑:该函数应该被过滤掉

我以前从未见过这个
&(过滤掉…
)(我的意思是,
&
符号调用make函数)。你用的是什么牌子的?对不起,那只是一个拼写错误,应该是$,我会修正的。是的,这似乎很有效,谢谢。所以我想没有办法扩展依赖项中的模式子,也无法让它评估某些内容。我还修正了你答案中一些原本是我的拼写错误。@JonasGlesaaen我不懂你的意思。@JonasGlesaaen我们的问题。你所说的依赖项内部的模式子是什么意思?基本上,在编写依赖项时,我希望$(\u filter)模式匹配$(input1\u filter)(在这种情况下,stem应该是input1或input2),然后将进行查找,但情况似乎并非如此。可能它将本地文件夹前置到干?例如,干实际上是./input1,这意味着它与$(./input1_filter)匹配,这不是一个变量。@JonasGlesaaen我的错误:我迭代了
out\u list
,而不是
var\u list
。修复了。谢谢,我自己发现了这一点,并在尝试使您的解决方案生效时在本地对其进行了更改。所以在我接受答案之前,您知道为什么$(\u过滤器)没有达到我预期的效果,或者有没有办法让这种逻辑起作用?
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 "$$< > $$@"
    @echo $$< > $$@
endef
$(foreach v,$(var_list),$(eval $(call MY_rule,$(v))))

clean:
   @rm $(out_list)