首页 > 解决方案 > 有没有办法扩展 Makefile 宏来创建规则?

问题描述

在此生成文件示例中:

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))

标签: gnu-make

解决方案


重复:如何使用宏在 foreach 中生成多个 Makefile 目标/规则?神秘行为

我的解决方案:

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 $< $@

推荐阅读