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

时间:2014-08-10 21:35:04

标签: replace makefile

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

1 个答案:

答案 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)