是否可以过滤静态模式规则中的先决条件?

时间:2012-06-28 04:26:23

标签: makefile gnu-make

我试图将$(all_possible_inputs)限制为$(related_inputs)。 $(all_possible_inputs)是来自其他包含的makefile的多个文件的串联。以下函数正确(perl脚本知道如何忽略额外的输入),但是如果单个输入发生更改,则会重建所有内容:

$(step2_outputs): $(data)/%.step2: $(routines)/step2.%.pl $(all_possible_inputs)
        perl $^ > $@

更新:过滤器必须匹配多个* .step1文件。如果step1产生:

A.foo.step1
A.bar.step1
B.foo.step1
B.bar.step1
B.baz.step1

然后step2的规则应扩展为:

A.step2: routines/step2.A.pl A.foo.step1 A.bar.step1
B.step2: routines/step2.B.pl B.foo.step1 B.bar.step1 B.baz.step1

从逻辑上讲,这就是我想要的工作:

$(step2_outputs): $(data)/%.step2: $(routines)/step2.%.pl $(filter $(data)/%.*.step1,$(all_possible_inputs))
        perl $^ > $@

%应该与静态模式规则词干匹配。 *应该是一个通配符(我知道它不起作用)。我认为问题是过滤器重新调整'%',因此过滤器表达式失败。我认为它可以通过Secondary Expansion解决,但我试过了,过滤器仍然返回空字符串:

更新:我根据Beta的好建议将示例切换为使用$$ *:

.SECONDEXPANSION:
$(step2_outputs): $(data)/%.step2: $(routines)/step2.%.pl $$(filter $(data)/$$*.%.step1,$(all_possible_inputs))
        perl $^ > $@

这是在linux环境中运行gnu make 3.81。

1 个答案:

答案 0 :(得分:3)

您的第三种方法适用于我,但您可以尝试:而不是%(在第一阶段展开)使用$$*

.SECONDEXPANSION:
$(step2_outputs): $(data)/%.step2: $(routines)/step2.%.pl $$(filter $(data)/$$*.step1,$(all_possible_inputs))
    perl $^ > $@