如何在GNU Make中为依赖项添加后缀/前缀并复制规则?
问题描述
现有Makefile规则:
foo: bar baz baz: bar
想不借助外部脚本,直接在Makefile里自动生成下面带后缀的规则:
foo-suffix: bar-suffix baz-suffix baz-suffix: bar-suffix
而且这些规则得能被make正常识别,问这种需求用原生Makefile能不能做到?此前我是靠解析make -qprR的输出来实现的,但想找纯原生的方法。
解决方案
完全可以实现,靠Makefile自带的函数和语法就能搞定,给你两种常用的原生实现方式:
方法一:通用批量生成(适合规则多的场景)
先把原始规则定义成列表,再通过循环和变量替换自动生成带后缀的规则:
# 先把原始的目标-依赖规则列出来 ORIGINAL_RULES := \ foo: bar baz \ baz: bar # 定义要加的后缀 SUFFIX := -suffix # 定义生成规则的模板 define GEN_RULE # 拆分原始规则的目标和依赖,分别加后缀 $(firstword $(subst :, ,$1))$(SUFFIX): $(foreach dep,$(wordlist 2,$(words $1),$(subst :, ,$1)),$(dep)$(SUFFIX)) endef # 遍历原始规则,逐个生成带后缀的规则 $(foreach rule,$(ORIGINAL_RULES),$(eval $(call GEN_RULE,$(rule))))
方法二:针对固定目标直接生成(适合目标少的场景)
如果目标数量不多且固定,直接写静态规则会更简单:
SUFFIX := -suffix # 给原始目标和依赖逐个加后缀 foo$(SUFFIX): bar$(SUFFIX) baz$(SUFFIX) baz$(SUFFIX): bar$(SUFFIX)
核心逻辑说明
addsuffix(可替代手动拼接后缀)是Makefile内置函数,专门给字符串批量添加后缀;foreach用来循环遍历原始规则列表,eval则是把循环生成的规则代码交给make解析执行;subst、firstword、wordlist这些函数用来拆分原始规则里的目标和依赖部分,方便单独给每一项添加后缀。
内容的提问来源于stack exchange,提问作者supernun
相关产品推荐
相关产品推荐

