2016-07-26 1 views
0

У меня есть несколько целей с разными предпосылками, но одно и то же правило здания, которое я хочу повторно использовать для всех моих целей.

Вот Makefile я написал для этой задачи:

test1 := a b 
test2 := b c 

all: test1 test2 

test1 test2: $([email protected]) 
    @echo [email protected] 
    @echo $([email protected]) 
    @echo $^ 

Если я бегу make я получить следующий вывод:

test1 
a b 

test2 
b c 

Что я ожидаю:

test1 
a b 
a b 
test2 
b c 
b c 

Как вы можете видеть, проблема $^пуста. Похоже, я не могу использовать $([email protected]) в правой части правила, потому что он просто расширяется до нуля, поэтому $^ пуст, и поэтому make даже не предупредит меня, что нет целей для ab и c. Обратите внимание, что внутри тела $ ($ @) работает так, как ожидалось.

Я хочу $([email protected]) быть equivalet к $(test1), когда я звоню make test1 и к $(test2), когда я звоню make test2 так что мой Makefile будет эквивалентен следующим Makefile:

test1 := a b 
test2 := b c 

all: test1 test2 

test1: $(test1) 
    <build-command> 

test2: $(test2) 
    <the same build-command> 

Но я не хочу повторять эти 2 строки для каждого testn У меня есть одно правило сборки для разных целей с разными зависимостями.

ответ

2

Ваш вопрос очень неясен, но я возьму на него удар. Я думаю, что это то, что вы хотите:

all: test1 test2 

test1: a b 
test2: b c 

test1 test2: 
    @echo building [email protected] from $^ 

a b c d: 
    @echo how to build [email protected]?... 

EDIT:

Хорошо, теперь это начинает выглядеть как XY problem.

Если вы хотите, это одно правило, которое будет охватывать все ваши цели testn, то, что я написал выше, сделает это.

Если то, что вы хотите, чтобы расширить переменную, имя которого имя цели, в списке предварительного условия цели (который поражает меня как неясное решение в поисках проблемы), то это будет делать это:

.SECONDEXPANSION: 
test1: $$([email protected]) 
    @echo building [email protected] from $^ 
+0

извините, если неясно, я обновил вопрос, надеюсь, что сейчас лучше – DartLenin

+0

спасибо, этот волшебный второй вариант был именно тем, что я искал – DartLenin