2016-09-14 9 views
0

Я хотел бы иметь следующие правила:GNU сделать не строит цель

foo_% bar_%: 
     @echo "Complex building instructions for [email protected]" 

all: foo_xyz bar_xyz 

, а затем запустить «сделать все» и получите:

Complex building instructions for foo_xyz 
Complex building instructions for bar_xyz 

Однако, поскольку «%» соответствует одна и та же строка дважды (xyz), она только «построена» в первый раз, поэтому все, что я получаю, это первая строка.

Есть ли способ заставить GNU make выполнить «эхо» дважды, когда «$ @» отличается во второй раз? В конце концов, поскольку $ @ отличается, инструкции по сборке разные:/

ответ

1

Как вы заметили, несколько целей шаблона ведут себя иначе, чем обычные цели: Make рассмотрит рецепт, ответственный за создание всех паттернов.

Способ решения этой проблемы является использование определения:

define complex-rule 
$1: 
    @echo "Complex building instructions for [email protected]" 
endef 

$(eval $(call complex-rule,foo_%)) 
$(eval $(call complex-rule,bar_%)) 

all: foo_xyz bar_xyz 

Обратите внимание, что, так как это будет eval ред, я спасся [email protected] к [email protected], потому что я хочу, чтобы быть расширен при запуске рецепт, не когда я eval это. С другой стороны, я не избежал $1, потому что я хочу, чтобы первый аргумент расширялся на call.

Смежные вопросы