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
相关产品推荐
相关产品推荐

