前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >verrelcm:cmake项目版本发布脚本工具

verrelcm:cmake项目版本发布脚本工具

作者头像
10km
发布2022-04-13 11:09:49
4130
发布2022-04-13 11:09:49
举报
文章被收录于专栏:10km的专栏10km的专栏

最近经常设计C/C++的中间件,版本稳定了就要在git上打个标签(tag),修改CMakeLists.txt中的版本号,还要更新头文件中定义的版本号。更新一个版本号,需要修改两个地方,还要执行git几个命令,一统操作下要花几分钟,搞不好还会出错,要是漏掉点啥也不一定,毕竟手工操作嘛。 我做Java项目的时候,这都不是问题,因为maven的release插件可以自动帮我完成上面的所有操作,我只需要指定版本号就成了。 于是我就写了这个verrelcm.sh脚本

verrelcm

verrelcm.sh(https://gitee.com/l0km/verrelcm.git)脚本实现类似maven release插件的功能,方便开发者通过命令行更新C/C++项目版本号,避免手工修改文件可能造成的错误:

自动修改包含版本信息的CMakeLists.txt中的版本,并提交git仓库,生成版本标签,以及下一个快照版本号

版本号格式为 MAJOR.MINOR.PATCH(如1.0.0),参见脚本中 RLV_FMT_REG 正则表达式定义

运行前要确保所有的修改都已经提交

运行要求

git && bash shell

windows下可以使用git bash

CMakeLists.txt

verrelcm.sh需要从CMakeLists.txt中读取定义的正则表达式来解析文件中的版本号,所以要求在项目的CMakeLists.txt中添加如下代码(位置不限),参见CMakeLists.txt

代码语言:javascript
复制
##! 用于velrelcm.sh 的 变量搜索正则表达式, 不要轻易修改
##! @PRJNAME_REG@          (project\s*\(\s*)([[:alnum:]]+)(\s+.*\))
##! @VERSION_REG@          (project\s*\(\s*[[:alnum:]]+\s+VERSION\s+)(\S*)(.*\))
##! @DESC_REG@             (set\s*\(\s*VRTEST_VER_DESC\s+)(\S*)?(\s*\))
##! @SNAPSHOT_REG@         (set\s*\(\s*VRTEST_VER_SNAPSHOT\s+)(\S*)?(\s*\))
##! @BEANCH_REG@           (set\s*\(\s*VRTEST_SCM_BRANCH\s+)(\S*)?(\s*\))
##! @COMMIT_REG@           (set\s*\(\s*VRTEST_SCM_COMMIT\s+)(\S*)?(\s*\))
##! 用于头文件(header)中搜索版本定义的正则表达
##! @H_VERSION_MAJOR_REG@  (#define\s+VRTEST_VERSION_MAJOR\s+)(\S+)(\s*)
##! @H_VERSION_MINOR_REG@  (#define\s+VRTEST_VERSION_MINOR\s+)(\S+)(\s*)
##! @H_VERSION_PATCH_REG@  (#define\s+VRTEST_VERSION_PATCH\s+)(\S+)(\s*)

如果项目的头文件也定义了版本号,要求如下格式,参见src/vrtest.h:

代码语言:javascript
复制
#define VRTEST_VERSION_MAJOR 0
#define VRTEST_VERSION_MINOR 0
#define VRTEST_VERSION_PATCH 0

VRTEST_前缀可以修改为项目要求的名称,但要保持一致。

使用示例

fork 项目 https://gitee.com/l0km/verrelcm.git,并将fork的项目clone到本地,直接运行verrelcm.sh就能看到效果

代码语言:javascript
复制
$ ./verrelcm.sh
branch=master
commit_id=5cff4a7
TAG_PREFIX=
PRJNAME_REG=(project\s*\(\s*)([[:alnum:]]+)(\s+.*\))
VERSION_REG=(project\s*\(\s*[[:alnum:]]+\s+VERSION\s+)(\S*)(.*\))
VERSION_MAJOR_REG=
VERSION_MINOR_REG=
VERSION_PATCH_REG=
SNAPSHOT_REG=(set\s*\(\s*VRTEST_VER_SNAPSHOT\s+)(\S*)?(\s*\))
BEANCH_REG=(set\s*\(\s*VRTEST_SCM_BRANCH\s+)(\S*)?(\s*\))
COMMIT_REG=(set\s*\(\s*VRTEST_SCM_COMMIT\s+)(\S*)?(\s*\))
H_VERSION_MAJOR_REG=(#define\s+VRTEST_VERSION_MAJOR\s+)(\S+)(\s*)
H_VERSION_MINOR_REG=(#define\s+VRTEST_VERSION_MINOR\s+)(\S+)(\s*)
H_VERSION_PATCH_REG=(#define\s+VRTEST_VERSION_PATCH\s+)(\S+)(\s*)
VERSION=0.0.0
TAG_PREFIX=vrtest-
MAJOR_VERSION=0
MINOR_VERSION=0
PATCH_VERSION=0
input release version(输入发行版本号)[0.0.0]:1.0.0
release_version=1.0.0
input next release version(输入下一个发行版本号)[0.0.1]:1.1.0
next_relver=1.1.0
修改源码版本号(1.0.0) in /j/verrelcm/CMakeLists.txt
更新 /j/verrelcm/src/vrtest.h
提交对源码的修改 release_version=1.0.0
warning: LF will be replaced by CRLF in CMakeLists.txt.
The file will have its original line endings in your working directory
warning: LF will be replaced by CRLF in src/vrtest.h.
The file will have its original line endings in your working directory
[master 949af37] release 1.0.0
 2 files changed, 2 insertions(+), 2 deletions(-)
发行版本标签(release_tag=vrtest-1.0.0)
修改源码,改为下一个版本号(1.1.0),删除branch,commit_id
更新 /j/verrelcm/src/vrtest.h
提交对源码的修改
warning: LF will be replaced by CRLF in CMakeLists.txt.
The file will have its original line endings in your working directory
warning: LF will be replaced by CRLF in src/vrtest.h.
The file will have its original line endings in your working directory
[master 235b3e1] next version 1.1.0
 2 files changed, 2 insertions(+), 2 deletions(-)
Enumerating objects: 14, done.
Counting objects: 100% (14/14), done.
Delta compression using up to 8 threads
Compressing objects: 100% (8/8), done.
Writing objects: 100% (10/10), 929 bytes | 464.00 KiB/s, done.
Total 10 (delta 4), reused 0 (delta 0), pack-reused 0
remote: Powered by GITEE.COM [GNK-6.2]
To https://gitee.com/l0km/verrelcm.git
   5cff4a7..235b3e1  master -> master
Total 0 (delta 0), reused 0 (delta 0), pack-reused 0
remote: Powered by GITEE.COM [GNK-6.2]
To https://gitee.com/l0km/verrelcm.git
 * [new tag]         vrtest-1.0.0 -> vrtest-1.0.0

项目地址

verrelcm.sh脚本我已经上传到码云(GITEE),需要的直接从这里获取: https://gitee.com/l0km/verrelcm.git

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2022-02-13 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • verrelcm
    • 运行要求
      • CMakeLists.txt
        • 使用示例
          • 项目地址
          相关产品与服务
          消息队列 TDMQ
          消息队列 TDMQ (Tencent Distributed Message Queue)是腾讯基于 Apache Pulsar 自研的一个云原生消息中间件系列,其中包含兼容Pulsar、RabbitMQ、RocketMQ 等协议的消息队列子产品,得益于其底层计算与存储分离的架构,TDMQ 具备良好的弹性伸缩以及故障恢复能力。
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档