有没有办法扩展 Makefile 宏来创建规则?
Is there a way to expand Makefile macros to create a rule?
在此生成文件示例中:
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
我希望用类似这样的东西替换 makefile 的最后三行会起作用:
foreach (FILE, $(EXTERNAL_TXT_FILES), $(addprefix txt/, $(notdir $(FILE))) : $(FILE))
重复:How can I use macros to generate multiple Makefile targets/rules inside foreach? Mysterious behaviour
我的解决方案:
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 $< $@
在此生成文件示例中:
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
我希望用类似这样的东西替换 makefile 的最后三行会起作用:
foreach (FILE, $(EXTERNAL_TXT_FILES), $(addprefix txt/, $(notdir $(FILE))) : $(FILE))
重复:How can I use macros to generate multiple Makefile targets/rules inside foreach? Mysterious behaviour
我的解决方案:
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 $< $@