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

Makefile变量名使用%模式实现同配方多目标构建问题咨询

解决方案

你遇到的是Make模式规则中变量展开优先级高于%匹配的问题,下面提供两种简单可落地的实现方案:

方案1:使用二次展开(最简洁)

借助Make内置的.SECONDEXPANSION特殊目标,让依赖部分的变量在%匹配完成后做二次展开即可,不需要修改现有变量定义结构:

target1:=a_5_2 a_3_5 a_6_2 a_0_0 a_9_1
target2:=a_2_2 a_1_3 a_5_9 a_2_7 a_3_6
target3:=a_2_3 a_6_5 a_9_0 a_3_4 a_3_9
target4:=a_7_8 a_8_2 a_4_8 a_7_1 a_0_7

# 开启二次展开特性,需放在对应规则之前
.SECONDEXPANSION:
output%.txt: $$(target$$*)
	cat $^ > $@  # 可替换为实际构建逻辑

说明:代码中双$是为了在第一次普通展开时逃逸,第一次展开后依赖会变为$(target$*);到二次展开阶段,$*已经被替换为%匹配到的数字(1/2/3/4),就能正确取到对应targetN变量的值作为依赖。

方案2:循环批量生成规则

如果你不想依赖二次展开特性,也可以用循环提前生成所有目标的规则,不存在展开顺序冲突,适合规则逻辑更复杂的场景:

target1:=a_5_2 a_3_5 a_6_2 a_0_0 a_9_1
target2:=a_2_2 a_1_3 a_5_9 a_2_7 a_3_6
target3:=a_2_3 a_6_5 a_9_0 a_3_4 a_3_9
target4:=a_7_8 a_8_2 a_4_8 a_7_1 a_0_7

# 定义所有输出文件的编号,后续加新目标只需往这里加数字
OUTPUT_NUM := 1 2 3 4

# 定义构建规则模板
define build_rule
output$(1).txt: $(target$(1))
	cat $$^ > $$@
endef

# 循环展开生成所有目标的规则
$(foreach n,$(OUTPUT_NUM),$(eval $(call build_rule,$(n))))

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 16:39:03