Makefile: использование переменной с вычисленным именем в качестве предварительного условия - PullRequest
1 голос
/ 05 января 2012

В Make можно вычислять имена переменных во время выполнения, используя двойную оценку, например $($(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)

Но это выглядит немного анти-СУХОЙ.Так что мне интересно, что я что-то упустил, потому что make, кажется, не понимает меня.Я использую GNU Make 3.81.

Ответы [ 2 ]

2 голосов
/ 05 января 2012

% и неявные правила в некоторой степени являются гражданами второго сорта в 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 голос
/ 05 января 2012

Это можно сделать, используя Вторичное расширение .

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 предложил в своем ответе :

all: one.js two.js

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

%.js :
    cat $^ > $@
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...