如何在Makefile中解析版本号并将各段数字拆分到独立变量
Makefile 拆分版本号各段数字实现方案
你之前编写的awk命令未达预期,并非管道在Makefile中无法生效,核心原因是Makefile的变量展开规则:双引号包裹的内容里$1会被Makefile识别为内置变量,因该变量未定义会被替换为空值,最终传入awk的命令无法获取对应字段。
方案1:纯Makefile内置函数实现(推荐)
无需调用外部shell命令,无转义问题,跨环境兼容性最好:
# 定义原始版本号 VER := 10.11.12-0.1.2 # 第一步:把版本号中的横杠替换为点,统一分隔符格式 VER_UNIFY := $(subst -,.,$(VER)) # 第二步:把点替换为空格,按顺序取每段数字赋值给独立变量 A := $(word 1,$(subst ., ,$(VER_UNIFY))) B := $(word 2,$(subst ., ,$(VER_UNIFY))) C := $(word 3,$(subst ., ,$(VER_UNIFY))) D := $(word 4,$(subst ., ,$(VER_UNIFY))) E := $(word 5,$(subst ., ,$(VER_UNIFY))) F := $(word 6,$(subst ., ,$(VER_UNIFY))) # 测试目标,执行make test可验证结果 test: @echo "A=$(A) B=$(B) C=$(C) D=$(D) E=$(E) F=$(F)"
执行make test后输出结果为:A=10 B=11 C=12 D=0 E=1 F=2,完全符合拆分需求。
方案2:修正shell+awk调用写法
如果需要通过shell命令实现,必须对$符号做转义,同时调整引号写法避免Makefile提前展开变量:
VER := 10.11.12-0.1.2 # awk分隔符直接用[.-]同时匹配点和横杠,字段引用用$$转义 A := $(shell echo $(VER) | awk -F'[.-]' '{print $$1}') B := $(shell echo $(VER) | awk -F'[.-]' '{print $$2}') C := $(shell echo $(VER) | awk -F'[.-]' '{print $$3}') D := $(shell echo $(VER) | awk -F'[.-]' '{print $$4}') E := $(shell echo $(VER) | awk -F'[.-]' '{print $$5}') F := $(shell echo $(VER) | awk -F'[.-]' '{print $$6}')
写法注意点:
- awk脚本使用单引号包裹,避免双引号触发Makefile的变量提前展开
- awk的字段引用必须写
$$1而非$1,第一个$是告诉Makefile后续的$为字面量,传入shell后才会变成$1被awk正确识别 - 分隔符使用正则
[.-]同时匹配.和-两种分隔符,无需提前替换字符串
内容的提问来源于stack exchange,提问作者SD.
相关产品推荐
相关产品推荐

