Есть ли способ расширить макросы Makefile для создания правила? - PullRequest
0 голосов
/ 24 сентября 2018

В этом примере make-файла:

EXTERNAL_TXT_FILES:= a/A.txt a/b/B.txt a/b/c/C.txt

EXTERNAL_TXT_NAMES:= $(notdir $(EXTERNAL_TXT_FILES))

DEST_TXT_FILES:= $(addprefix txt/, $(EXTERNAL_TXT_NAMES))

.PHONY:all
all: $(DEST_TXT_FILES)

$(DEST_TXT_FILES):
    cp $< $@

txt/A.txt: a/A.txt
txt/B.txt: a/b/B.txt
txt/C.txt: a/b/c/C.txt

видно, что последние три строки являются формульными.

Есть ли способ переписать этот Makefile так, чтобы фиксированные целевые элементы DEST_TXT_FILES могли зависеть от элементов EXTERNAL_TXT_FILES, из которых они получены, без необходимости явновыписать их?

Для тестирования:

$ mkdir -p a/b/c txt && rm -f txt/* && touch a/A.txt a/b/B.txt a/b/c/C.txt && make

Я надеялся, что замена трех последних строк make-файла чем-то вроде этогобудет работать:

foreach (FILE, $(EXTERNAL_TXT_FILES), $(addprefix txt/, $(notdir $(FILE))) : $(FILE))

1 Ответ

0 голосов
/ 24 сентября 2018

Дублировано: Как я могу использовать макросы для генерации нескольких целей / правил Makefile внутри foreach?Таинственное поведение

Мое решение:

EXTERNAL_TXT_FILES:= a/A.txt a/b/B.txt a/b/c/C.txt

EXTERNAL_TXT_NAMES:= $(notdir $(EXTERNAL_TXT_FILES))

DEST_TXT_FILES:= $(addprefix txt/, $(EXTERNAL_TXT_NAMES))

.PHONY:all
all: $(DEST_TXT_FILES)

define DUMMY_RULE
$(addprefix txt/, $(notdir $(1))): $(1)
endef

$(foreach FILE, $(EXTERNAL_TXT_FILES), $(eval $(call DUMMY_RULE, $(FILE))))

$(DEST_TXT_FILES):
    cp $< $@
...