cmake编译时候加入git的版本号和分支名字

复制代码
# get git hash
macro(get_git_hash _git_hash)
    find_package(Git QUIET)
    if(GIT_FOUND)
      execute_process(
        COMMAND ${GIT_EXECUTABLE} log -1 --pretty=format:%H
        OUTPUT_VARIABLE ${_git_hash}
        OUTPUT_STRIP_TRAILING_WHITESPACE
        ERROR_QUIET
        WORKING_DIRECTORY
          ${CMAKE_CURRENT_SOURCE_DIR}
        )
    endif()
endmacro()

# get git branch
macro(get_git_branch _git_branch)
    find_package(Git QUIET)
    if(GIT_FOUND)
      execute_process(
        COMMAND ${GIT_EXECUTABLE} symbolic-ref --short -q HEAD
        OUTPUT_VARIABLE ${_git_branch}
        OUTPUT_STRIP_TRAILING_WHITESPACE
        ERROR_QUIET
        WORKING_DIRECTORY
          ${CMAKE_CURRENT_SOURCE_DIR}
        )
    endif()
endmacro()

# 获取当前的GIT_HASH
set(GIT_HASH "unknown")
get_git_hash(GIT_HASH)
add_definitions(-DMY_GIT_VERSION="${GIT_HASH}")

# 获取当前的分支
set(GIT_BRANCH "unknown")
get_git_branch(GIT_BRANCH)
add_definitions(-DMY_GIT_BRANCH="${GIT_BRANCH}")
cpp 复制代码
#define STRING(R) #R
#define AS_STRING(R) STRING(R)
std::cout<<"git version:"<<AS_STRING(GIT_VERSION)<<" git branch:"<<AS_STRING(GIT_BRANCH));

AS_STRING(GIT_VERSION)这句只会展开成GIT_VERSION,而不会再往下一层把GIT_VERSION也展开成一个具体的数值,因此,我们定义一个STRING(GIT_VERSION)的宏做中间转换,就能正常把AS_STRING(GIT_VERSION)展开STRING(GIT_VERSION),最终展开成具体的git 版本号。

相关推荐
Mr_WangAndy12 分钟前
C++设计模式_行为型模式_责任链模式Chain of Responsibility
c++·设计模式·责任链模式·行为型模式
时间之里41 分钟前
【c++】:Lambda 表达式介绍和使用
开发语言·c++
汉克老师1 小时前
GESP2025年9月认证C++四级( 第三部分编程题(1)排兵布阵)
c++·算法·gesp4级·gesp四级
·心猿意码·2 小时前
C++智能指针解析
开发语言·c++
property-3 小时前
C++中#define和const的区别
开发语言·c++
怎么没有名字注册了啊4 小时前
查找成绩(数组实现)
c++·算法
AI+程序员在路上5 小时前
QT6中Combo Box与Combo BoxFont 功能及用法
c++·qt
L_09075 小时前
【Algorithm】Day-4
c++·算法·leetcode
煜3646 小时前
C++异常与智能指针
开发语言·c++
光头闪亮亮6 小时前
ZBar 环境搭建与快速入门指南
c++