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

Makefile如何为两类文件列表设置组合目标的前置依赖

Makefile多依赖组合目标的实现方案

方案1:调整二次展开实现

你的原有思路是可行的,只需要修正二次展开的变量转义和依赖拆分逻辑即可。二次展开阶段需要用$$前缀保留变量到二次解析时再求值,正确写法如下:

.SECONDEXPANSION:
$(TARGETS): $$(word 1,$$(subst _, ,$$(basename $$@))).xx $$(word 2,$$(subst _, ,$$(basename $$@))).yy
	run_script $^

逻辑说明:

  • $$(basename $$@) 先去掉目标的.output后缀,得到{input}_{config}格式的词干
  • $$(subst _, ,...) 把下划线替换为空格,将词干拆分为两个独立的词
  • $$(word 1,...) 取第一个词拼接.xx得到输入文件路径,$$(word 2,...)取第二个词拼接.yy得到配置文件路径

方案2:更易维护的显式规则生成(自底向上推荐方案)

如果不想处理二次展开的转义问题,更推荐用eval动态生成所有规则,逻辑更直观,调试成本更低:

# 定义单条目标的规则模板
define GEN_RULE
$1_$2.output: $1.xx $2.yy
	run_script $$^
endef

# 遍历所有组合生成规则
$(foreach input,$(INPUTS),$(foreach config,$(CONFIGS),$(eval $(call GEN_RULE,$(input),$(config)))))

这种方式不需要提前定义TARGETS变量也能正常工作,如果需要统一清理所有生成的文件,还是可以保留你原来的TARGETS定义,给.PHONY的clean目标使用。

注意:如果你的输入文件名或者配置文件名本身包含下划线,上述两种拆分方式都会出错,这种情况下建议你换用其他不会出现在文件名中的分隔符(比如+、@)来拼接目标名。

内容的提问来源于stack exchange,提问作者nos

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 13:09:04