gnu-make - 有没有办法扩展 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))
解决方案
重复:如何使用宏在 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 $< $@
推荐阅读
- google-api - 列出谷歌驱动器中所有可用的共享驱动器
- reference - system.copy 给出了对数组 pascal 的引用
- autohotkey - 使 GUI 随窗口移动
- dart - 如何在 Dart 中替换 unicode 转义字符
- sql - 如何通过在接下来的 23 天内将日期列增加 1 天来将值插入下表?
- visual-studio-code - Linux Mint 上的 VSCode,集成终端无法输入任何内容
- stack-overflow - 我们可以使用空手道工具自动化 Windows 服务吗?
- python - 如何将值从另一个数据帧映射到另一个数据帧的标头
- scala - 如何获取在 GROUP BY 子句中分组的元素的 Seq?
- reactjs - 在 react-native 中用 createStructuredSelector 替换 useSelector