我有一个正在处理的现有项目,目前在make文件中有一行
VERSION := $(shell ${GIT} describe --tags --always)
最终将类似于v2.3-9-gcdf3820
的字符串存储到VERSION
变量中。该变量最终用于在打包过程中命名文件。
我想做的是写出一个Example.version
文件,其格式如下。
{
"NAME":"Examle",
"VERSION":
{
"MAJOR":2,
"MINOR":3,
"PATCH":0,
"BUILD":0
}
}
因此它需要版本号直到第一个-
,然后用0和0填充其余的版本号。 describe
的结果可能包含1到4个版本号,所以我想要灵活。
问题是我现在不知道接下来应该怎么做了。我制作了一个Example.version.template
文件
{
"NAME":"Examle",
"VERSION":
{
"MAJOR":{MAJOR},
"MINOR":{MINOR},
"PATCH":{PATCH},
"BUILD":{BUILD}
}
}
我知道如何读取文件并从makefile中写出文件,我知道如何在拥有每个变量后替换文本。我不知道怎么做的是如何将v2.3-9-gcdf3820
转为相当于
MAJOR := 2
MINOR := 3
PATCH := 0
BUILD := 0
如何从v
内拆分我的字符串并删除前导make
?
答案 0 :(得分:2)
虽然我完全同意@MadScientist认为最不适合这项任务,并且一个小的shell脚本可能是更好的选择,但是可以使用make来进行这种操作(假设有输入值)本身。
$ cat desc.mk
define p
$(info $1:$($(1)):)
endef
raw := v2.3-9-gcdf3820
$(call p,raw)
split := $(subst -, ,$(raw))
$(call p,split)
ver := $(subst v,,$(word 1,$(split)))
$(call p,ver)
versplit := $(subst ., ,$(ver))
$(call p,versplit)
MAJOR := $(or $(word 1,$(versplit)),0)
$(call p,MAJOR)
MINOR := $(or $(word 2,$(versplit)),0)
$(call p,MINOR)
PATCH := $(or $(word 3,$(versplit)),0)
$(call p,PATCH)
BUILD := $(or $(word 4,$(versplit)),0)
$(call p,BUILD)
all: ;
$ make -qf desc.mk
raw:v2.3-9-gcdf3820:
split:v2.3 9 gcdf3820:
ver:2.3:
versplit:2 3:
MAJOR:2:
MINOR:3:
PATCH:0:
BUILD:0:
使用git describe --tags --always --abbrev=0
从一开始就让git放弃-9-gcdf3820
(或其他)可能也是有意义的(至少对于这种用法而言),因为这样可以消除大量的工作需要的。
编辑:来自@laune的一点点聪明才能得到最后几行清理:
versplit := $(subst ., ,$(ver)) 0 0 0 0
MAJOR := $(word 1,$(versplit))
$(call p,MAJOR)
MINOR := $(word 2,$(versplit))
$(call p,MINOR)
PATCH := $(word 3,$(versplit))
$(call p,PATCH)
BUILD := $(word 4,$(versplit))
$(call p,BUILD)