如何在Makefile中定义函数以消除代码重复?
在Makefile中提取重复逻辑为函数的方法
当然可以!Makefile支持多种代码复用方式,正好能解决你这种重复逻辑的问题。下面给你两种最适配你场景的方案:
方案1:使用自定义函数(define指令)
你可以用define封装重复的复制逻辑为一个函数,然后在需要的目标里直接调用,这样既能消除重复,也方便后续统一修改逻辑。
修改后的Makefile示例:
# 定义封装复制逻辑的自定义函数 define copy_logic ifeq ($(COPY), ) @echo "Not copying" else @echo "Copying to: $(COPY)" mv $(WORKDIR) $(COPY) endif endef .PHONY: do-something-one-dependent do-something-one-dependent: <some logic> .PHONY: do-something-two-dependent do-something-two-dependent: <some different logic> .PHONY: do-something-one do-something-one: do-something-one-dependent $(call copy_logic) .PHONY: do-something-two do-something-two: do-something-two-dependent $(call copy_logic)
关键细节说明:
define用于定义多行函数,必须用endef标记结束- 通过
$(call 函数名)调用自定义函数,函数内的变量(比如$(COPY)、$(WORKDIR))会自动使用当前上下文的取值 - 注意:Makefile的命令行必须用Tab键缩进,不能用空格,否则会触发语法错误
方案2:使用模式规则(更简洁的复用方式)
因为你的两个目标结构高度相似(do-something-X依赖do-something-X-dependent,后续执行相同逻辑),还可以用模式规则实现复用,这种方式不需要显式定义函数,代码更紧凑。
修改后的Makefile示例:
.PHONY: do-something-one-dependent do-something-one-dependent: <some logic> .PHONY: do-something-two-dependent do-something-two-dependent: <some different logic> # 模式规则:匹配所有do-something-%格式的目标 .PHONY: do-something-one do-something-two do-something-%: do-something-%-dependent ifeq ($(COPY), ) @echo "Not copying" else @echo "Copying to: $(COPY)" mv $(WORKDIR) $(COPY) endif
关键细节说明:
%是通配符,会自动匹配目标中的可变部分(比如one、two),并同步替换到依赖的对应位置- 只需要写一次重复逻辑,就能覆盖所有符合模式的目标;后续如果新增类似目标(比如
do-something-three),只需要添加对应的do-something-three-dependent目标即可,无需修改重复逻辑
额外小提示
- 建议在
echo前加上@符号,这样Makefile不会打印命令本身,只会显示命令执行的输出,让日志更清爽 - 如果复制逻辑需要传递参数、逻辑更复杂,优先选自定义函数;如果只是结构相似的目标,模式规则会更简洁高效
内容的提问来源于stack exchange,提问作者ealeon
相关产品推荐
相关产品推荐

