为了自动化管理发布版本,C/C++项目中通常会考虑使用Git版本信息作为程序版本信息。CMake构建项目时获取Git版本信息得核心思路是利用CMake中execute_process函数调用Git命令获取仓库版本状态信息,然后将信息通过add_definitions定义相应宏,在代码中直接使用宏定义即可。第二种方案是将获取的Git版本信息通过file命令输出到一个头文件中,程序需要使用版本信息的,包含头文件并使用对应宏即可。
macro(Get_CommitID APP_COMMITID)
find_package(Git QUIET) # 查找Git,QUIET静默方式不报错
if(GIT_FOUND)
execute_process( # 执行一个子进程
COMMAND ${GIT_EXECUTABLE} rev-parse --short HEAD # 命令
OUTPUT_VARIABLE ${APP_COMMITID} # 输出字符串存入变量
OUTPUT_STRIP_TRAILING_WHITESPACE # 删除字符串尾的换行符
ERROR_QUIET # 对执行错误静默
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} # 执行路径
)
endif()
endmacro()
macro(Get_UtilsCommitID GIT_UTILSCOMMITID)
find_package(Git QUIET) # 查找Git,QUIET静默方式不报错
if(GIT_FOUND)
execute_process( # 执行一个子进程
COMMAND ${GIT_EXECUTABLE} rev-parse --short HEAD # 命令
OUTPUT_VARIABLE ${GIT_UTILSCOMMITID} # 输出字符串存入变量
OUTPUT_STRIP_TRAILING_WHITESPACE # 删除字符串尾的换行符
ERROR_QUIET # 对执行错误静默
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/../Utils/ # 执行路径
)
endif()
endmacro()
macro(Get_GitCommited_Date GIT_COMMITED_DATE)
find_package(Git QUIET) # 查找Git,QUIET静默方式不报错
if(GIT_FOUND)
execute_process( # 执行一个子进程
COMMAND ${GIT_EXECUTABLE} log -1 --format=%cd --date=short # 命令
OUTPUT_VARIABLE ${GIT_COMMITED_DATE} # 输出字符串存入变量
OUTPUT_STRIP_TRAILING_WHITESPACE # 删除字符串尾的换行符
ERROR_QUIET # 对执行错误静默
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} # 执行路径
)
endif()
endmacro()
macro(Get_GitVersion GIT_VERSION)
find_package(Git QUIET) # 查找Git,QUIET静默方式不报错
if(GIT_FOUND)
execute_process( # 执行一个子进程
COMMAND ${GIT_EXECUTABLE} describe --abbrev=0 # 命令
OUTPUT_VARIABLE ${GIT_VERSION} # 输出字符串存入变量
OUTPUT_STRIP_TRAILING_WHITESPACE # 删除字符串尾的换行符
ERROR_QUIET # 对执行错误静默
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} # 执行路径
)
endif()
endmacro()
set(APP_COMMITID "")
Get_CommitID(APP_COMMITID)
message(STATUS "AppCommitID is ${APP_COMMITID}")
set(UTILS_COMMITID "")
Get_UtilsCommitID(UTILS_COMMITID)
message(STATUS "UtilsCommitID is ${UTILS_COMMITID}")
set(GIT_COMMITED_DATE "")
Get_GitCommited_Date(GIT_COMMITED_DATE)
message(STATUS "GitCommitedDate is ${GIT_COMMITED_DATE}")
set(GIT_VERSION "")
Get_GitVersion(GIT_VERSION)
message(STATUS "GitvERSION is ${GIT_VERSION}")
add_definitions(-DAPP_COMMITID=\"${APP_COMMITID}\")
add_definitions(-DUTILS_COMMITID=\"${UTILS_COMMITID}\")
add_definitions(-DGIT_COMMITED_DATE=\"${GIT_COMMITED_DATE}\")
add_definitions(-DGIT_VERSION=\"${GIT_VERSION}\")
file(WRITE ${PROJECT_BINARY_DIR}/GitVersion.h
"#define APP_COMMITID \"${APP_COMMITID}\"\n#define UTILS_COMMITID \"${UTILS_COMMITID}\"\n#define GIT_VERSION \"${GIT_VERSION}\"\n#define GIT_COMMITED_DATE \"${GIT_COMMITED_DATE}\"\n")
CMake输出信息:
-- AppCommitID is 884665f
-- UtilsCommitID is c569dc1
-- GitCommitedDate is 2022-03-03
-- GitVersion is 0.5.0
GitVersion.h文件如下:
#define APP_COMMITID "884665f"
#define UTILS_COMMITID "c569dc1"
#define GIT_VERSION "0.5.0"
#define GIT_COMMITED_DATE "2022-03-03"