Makefile:使用带有计算名称的变量作为先决条件

时间:2012-01-05 14:21:11

标签: makefile

使用可以使用双重评估在运行时计算变量名称,例如$($(var))

我很感兴趣,如果有可能以某种方式使这项工作:

one.js_DEPS=a b
two.js_DEPS=c b

all: one.js two.js

%.js: $(%.js_DEPS)
    cat $^ > $@

我可以通过声明两个具有显式依赖关系的规则来完成这项工作,如下所示:

one.js: $(one.js_DEPS)

但这似乎有点反DRY。所以我想知道我是否想念一些东西,因为make似乎并不理解我。我使用GNU Make 3.81。

2 个答案:

答案 0 :(得分:2)

%隐式规则在make中属于二等公民,因为变量扩展似乎发生在隐式规则扩展之前。因此,在上面的Makefile中,$(%.js_DEPS)%被替换之前被扩展为空字符串。

替代:

 %.js: %.js_DEPS
     cat $^ > $@

 %.js_DEPS :
     cat $^ > $@

 .INTERMEDIATE: one.js_DEPS two.js_DEPS

或简单地说:

 one.js : a b
 two.js : c d
 %.js :
     cat $^ > $@

答案 1 :(得分:1)

可以使用Secondary Expansion完成此操作。

JS := one.js two.js

all: $(JS)

.SECONDEXPANSION:

one.js_DEPS := a b
two.js_DEPS := c b

$(JS) : $$($$(@F)_DEPS)
    cat $^ > $@

但实际上,可以很简单地实现目标,而不使用任何GNU Make扩展,正如thitonanswer中建议的那样:

all: one.js two.js

one.js : a b
two.js : c b

%.js :
    cat $^ > $@