使用可以使用双重评估在运行时计算变量名称,例如$($(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。
答案 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扩展,正如thiton在answer中建议的那样:
all: one.js two.js
one.js : a b
two.js : c b
%.js :
cat $^ > $@