在写代码的时候,总是需要添加一个版本号,用于后续的版本管理
我常遇到的一个问题是,开发过程中,不一定会记得这件事情,导致有时候会出现同样的版本
于是希望有一个方式,能在编译代码的时候自动生成一个版本号
1.创建update_version.cmake文件
# 设置项目版本号
set(PROJECT_VERSION_MAJOR 1)
set(PROJECT_VERSION_MINOR 0)
# 读取 version.h 文件
if(EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/version.h")
# 读取 PROJECT_VERSION_PATCH 的值
file(READ "version.h" VERSION_H_CONTENTS)
string(REGEX MATCH "PROJECT_VERSION_PATCH \"([0-999]+)\"" _match ${VERSION_H_CONTENTS})
set(PROJECT_VERSION_PATCH ${CMAKE_MATCH_1})
message(STATUS "Read patch: ${PROJECT_VERSION_PATCH}")
# 将 PROJECT_VERSION_PATCH 值加 1
math(EXPR PROJECT_VERSION_PATCH "${PROJECT_VERSION_PATCH} + 1")
set(PROJECT_VERSION "${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}.${PROJECT_VERSION_PATCH}")
message(STATUS "更新版本号: ${PROJECT_VERSION}")
else()
set(PROJECT_VERSION_PATCH 1)
endif()
# 获取编译日期
string(TIMESTAMP PROJECT_COMPILE_YEAR "%Y" UTC)
string(TIMESTAMP PROJECT_COMPILE_MONTH "%m" UTC)
string(TIMESTAMP PROJECT_COMPILE_DAY "%d" UTC)
string(TIMESTAMP PROJECT_COMPILE_TIME "%Y-%m-%d %H:%M:%S" UTC)
# 生成版本文件
configure_file(version.h.in ${CMAKE_CURRENT_SOURCE_DIR}/version.h @ONLY)
2.创建version.h.in文件
#ifndef VERSION_H
#define VERSION_H
#define PROJECT_VERSION_MAJOR "@PROJECT_VERSION_MAJOR@"
#define PROJECT_VERSION_MINOR "@PROJECT_VERSION_MINOR@"
#define PROJECT_VERSION_PATCH "@PROJECT_VERSION_PATCH@"
#define PROJECT_VERSION "@PROJECT_VERSION@"
#define PROJECT_COMPILE_YEAR "@PROJECT_COMPILE_YEAR@"
#define PROJECT_COMPILE_MONTH "@PROJECT_COMPILE_MONTH@"
#define PROJECT_COMPILE_DAY "@PROJECT_COMPILE_DAY@"
#define PROJECT_COMPILE_TIME "@PROJECT_COMPILE_TIME@"
#endif
3.创建version.h文件
无内容
4.修改cmakelist.txt文件
# 创建自定义目标, 执行 update_version.cmake 脚本
add_custom_target(
update_version
COMMAND ${CMAKE_COMMAND} -D GIT_VERSION=${GIT_VERSION} -P ${CMAKE_CURRENT_SOURCE_DIR}/update_version.cmake
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
)
add_dependencies(${PROJECT_NAME} update_version)
5.使用效果
会在目录下自动生成一个版本头文件
重新编译一下
版本文件会自动更新