Linux C++目标中添加git版本信息


  1. 项目代码根目录下添加一个cmake文件git_version.cmake,内容如下:
# get git hash
macro(get_git_hash _git_hash)
    set(ENV{GIT_DIR} ${PROJECT_SOURCE_DIR}/.git)
    execute_process(
        COMMAND git rev-parse --short HEAD
        OUTPUT_VARIABLE ${_git_hash}
        OUTPUT_STRIP_TRAILING_WHITESPACE
        ERROR_VARIABLE GET_GIT_VERSION_FAILED
    )
    #IF(GET_GIT_VERSION_FAILED)
    #    MESSAGE(FATAL_ERROR ${GET_GIT_VERSION_FAILED})
    #ELSE(GET_GIT_VERSION_FAILED)
    #    MESSAGE("-- Current Git Commit ID: ${_git_hash}")
    #    add_definitions(-DDEFINED_GIT_CID)
    #ENDIF(GET_GIT_VERSION_FAILED)
endmacro()

# get git branch
macro(get_git_branch _git_branch)
    set(ENV{GIT_DIR} ${PROJECT_SOURCE_DIR}/.git)
    execute_process(COMMAND git symbolic-ref --short -q HEAD
        #WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
        OUTPUT_VARIABLE ${_git_branch}
        OUTPUT_STRIP_TRAILING_WHITESPACE
        ERROR_QUIET
    )
endmacro()

# 生成版本描述字符串类似 TAG-X-gHASH
macro(get_git_tag_hash _git_tag_hash)
    set(ENV{GIT_DIR} ${PROJECT_SOURCE_DIR}/.git)
    execute_process(COMMAND git describe --abbrev=6 --dirty --always --tags
        # WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
        OUTPUT_VARIABLE  ${_git_tag_hash}
        OUTPUT_STRIP_TRAILING_WHITESPACE
        ERROR_QUIET
    )
endmacro()

# 获取最新 commit 日期,YYYY-MM-DD
macro(get_git_date_time _git_date_time)
    set(ENV{GIT_DIR} ${PROJECT_SOURCE_DIR}/.git)
    execute_process(COMMAND git log -1 --format=%cd --date=short
        # WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
        OUTPUT_VARIABLE  ${_git_date_time}
        OUTPUT_STRIP_TRAILING_WHITESPACE
        ERROR_QUIET
    )
endmacro()
  1. 在根目录CMakeLists.txt中添加:
set(GIT_HASH "")
set(GIT_BRANCH "")
set(GIT_DATETIME "")
get_git_hash(GIT_HASH)
get_git_branch(GIT_BRANCH)
get_git_date_time(GIT_DATETIME)
message(STATUS "git hash: ${GIT_HASH}, ${GIT_BRANCH}, ${GIT_DATETIME}")
  1. 在src目录增加一个 repo_version.h.cmake 的文件:
#define MAGE_VERSION_MAJOR @MAGE_VERSION_MAJOR@
#define MAGE_VERSION_MINOR @MAGE_VERSION_MINOR@
#define MAGE_VERSION_PATCH @MAGE_VERSION_PATCH@
#define MAGE_VERSION_GIT_HEAD_VERSION "@GIT_HASH@"
#define MAGE_VERSION_GIT_BRANCH "@GIT_BRANCH@"
#define MAGE_VERSION_GIT_DATETIME "@GIT_DATETIME@"

其中 major、minor 和 patch 是传统的软件版本规范,如果你的项目里不需要的话,可以删除掉,如果保留就需要在 CMake 中赋值。除了这 3 个之外,就是最重要的 "@MAGE_VERSION_GIT_HEAD_VERSION@",即我们从 git 里获取的版本信息,它要和 EXECUTE_PROCESS()指令的 OUTPUT_VARIABLE 的变量名保持一致,注意我们用双引号把它括起来当作一个字符串使用。
增加以下代码生成头文件:

configure_file("src/repo_version.h.cmake" "repo_version.h")

运行 cmake,在当前目录下(准确的说是 cmake 的 PROJECT_BINARY_DIR 目录)就生成了 repo_version.h 文件:

#define MAGE_VERSION_MAJOR 
#define MAGE_VERSION_MINOR 
#define MAGE_VERSION_PATCH 
#define MAGE_VERSION_GIT_HEAD_VERSION "ec99a2f"
#define MAGE_VERSION_GIT_BRANCH "default_startup_param"
#define MAGE_VERSION_GIT_DATETIME "2022-01-26"

转发自 让代码说话:如何把版本信息注入到代码中

  • Utility.cmake
  • 在 CMake C\C++ 项目中使用 Git 仓库版本号