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

