Повторить элемент из списка

#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. Извините, я не знаю, что вы имеете в виду, говоря «не могу сделать из этого цель». Ничто в вашем вопросе не показывает никаких целей. Что ты пытаешься сделать?