我有一个正在处理的现有项目,当前 make 文件中有一行
VERSION := $(shell ${GIT} describe --tags --always)
它最终将类似于 v2.3-9-gcdf3820
的字符串存储到 VERSION
变量中。该变量最终用于在打包过程中命名文件。
我想做的是让 make 写出一个具有以下格式的 Example.version
文件。
{
"NAME":"Examle",
"VERSION":
{
"MAJOR":2,
"MINOR":3,
"PATCH":0,
"BUILD":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
如何拆分字符串并从 make
中删除前导 v
?
最佳答案
虽然我完全同意 @MadScientist 的观点,即 make 并不是最适合此任务,并且小型 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)
关于replace - 执行 MAKE 时文件中的字符串替换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25233216/