如何在Makefile中仅定义一次字符串替换规则并复用至多个目标?
简化Makefile中重复的路径替换规则
问题
我希望维护一组可复用的前置依赖列表,但当前的Makefile需要在变量赋值和目标规则中重复编写$(objdir)/$(variantN)/%.o这类字符串替换逻辑。想知道能不能只定义一次这类替换规则,以及正确的实现方式。
当前使用的Makefile代码:
variant1 := X variant2 := Y objdir := obj src := a/some.c b/other.c obj_v1 := $(src:%.c=$(objdir)/$(variant1)/%.o) obj_v2 := $(src:%.c=$(objdir)/$(variant2)/%.o) all: $(obj_v1) $(obj_v2) $(obj_v1): $(objdir)/$(variant1)/%.o: %.c @echo v1 $< $(@D)/ $@ $(obj_v2): $(objdir)/$(variant2)/%.o: %.c @echo v2 $< $(@D)/ $@
可行的实现方式
方法1:用宏定义复用转换逻辑
通过define创建通用宏,一次性生成每个变体的目标文件列表和编译规则,后续新增变体只需调用宏即可:
variant1 := X variant2 := Y objdir := obj src := a/some.c b/other.c # 定义通用的变体配置宏,参数1是变体标识(如v1),参数2是变体值(如X) define setup_variant obj_$(1) := $$(src:%.c=$(objdir)/$(2)/%.o) all: $$(obj_$(1)) $$(obj_$(1)): $(objdir)/$(2)/%.o: %.c @echo $(1) $$< $$(@D)/ $$@ endef # 为每个变体实例化配置 $(eval $(call setup_variant,v1,$(variant1))) $(eval $(call setup_variant,v2,$(variant2)))
方法2:通用模式规则+自动变量
如果不需要单独维护每个变体的目标文件列表,可以直接用通用模式规则配合自动变量简化:
variant1 := X variant2 := Y objdir := obj src := a/some.c b/other.c # 一次性生成所有变体的目标文件 all: $(foreach var,$(variant1) $(variant2),$(src:%.c=$(objdir)/$(var)/%.o)) # 通用规则匹配所有变体的目标文件 $(objdir)/%/%.o: %.c @echo $(notdir $(dir $@)) $< $(@D)/ $@
内容的提问来源于stack exchange,提问作者olh
相关产品推荐
相关产品推荐

