You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 17:12:35