replace - 执行 MAKE 时文件中的字符串替换

标签 replace makefile

我有一个正在处理的现有项目,当前 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/

相关文章:

c - 帮我创建一个 Makefile

c++ - Makefile: (.text+0x20): 对 `main' 的 undefined reference collect2: 错误: ld 返回 1 退出状态

ruby - 进行一次 gsub 调用而不是五次

C# 用正则表达式替换

powershell - 为什么 -replace 没有按预期工作?

if-statement - 如果条件在 Makefile 中,在目标中

c++ - 如何强制重新编译 Makefile 中的单个文件?

mysql - MySQL可以替换多个字符吗?

java - 查找并删除eclipse java中的所有getter方法

c++11 - CppuTest 使用 C++11 版本构建