#makefile #gnu-make
#makefile #gnu-make
Вопрос:
Есть ли в makefile какой-либо способ указать один и тот же элемент списка (я думаю, это правильный термин) более одного раза? Например, имея список с 3 файлами A.txt B.txt C.txt
, я хотел бы создать целевые объекты на основе этих элементов, которые содержались бы в каталоге, где шаблон должен был бы повторяться дважды: A/A-rambo B/B-rambo C/C-rambo
.
Я пытался:
TXT = A.txt B.txt C.txt
DIR := $(patsubst %.txt,%,$(TXT))
OUT := $(patsubst %,%/%-rambo,$(DIR))
$(info $(OUT))
но это выводит, A/%-rambo B/%-rambo C/%-rambo
где второй %
не заменяется.
И так же OUT := $(patsubst %,$(addsuffix /%-rambo,%),$(DIR))
Комментарии:
1. Вы хотите создать правила для этих целей? Обычные правила, или правило шаблона , или статическое правило шаблона , или что?
2. Затем я хотел бы создать шаблонное правило, чтобы каждый файл в
OUT
создавался в правиле, использующем соответствующийTXT
.
Ответ №1:
Make не может обработать шаблонное правило с двумя подстановочными знаками в целевом имени, даже если они должны иметь одинаковое значение.
Существует более одного способа получить желаемый эффект, но ни один из них не идеален. Я бы предложил создать правило для каждого txt
файла:
define template
$(1)/$(1)-rambo: $(1).txt
@echo building $$@ from $$^
endef
STEMS := A B C
$(foreach x,$(STEMS),$(eval $(call template,$(x))))
Комментарии:
1. Похоже, что он не повторяется полностью
STEMS
; я просто получаю одну напечатанную строку:building A/A-rambo from A.txt
, правильно, но остальные дляB
иC
отсутствуют.2. @PedroA: «Отсутствует»? Я подозреваю, что это просто не вызывает два других правила. Попробуйте
make B/B-rambo
и посмотрите, что получится.
Ответ №2:
Попробуйте:
OUT := $(foreach T,$(TXT),$(T:.txt=)/$(T:.txt=-rambo))
Комментарии:
1. Спасибо, это сработало, но тогда я не могу сделать из него цель:
./make:10: *** target pattern contains no
%’. Остановить.`.2. Извините, я не знаю, что вы имеете в виду, говоря «не могу сделать из этого цель». Ничто в вашем вопросе не показывает никаких целей. Что ты пытаешься сделать?