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 版本号。

相关推荐
BestOrNothing_20157 分钟前
C++ 内存泄漏的“真实成本”: 内存单位换算、堆分配开销与工程级判断
c++·内存管理·内存泄漏·堆内存·raii·内存换算·异常安全
WBluuue1 小时前
Codeforces Global 31 Div1+2(ABCD)
c++·算法
zmzb01031 小时前
C++课后习题训练记录Day58
开发语言·c++
Sunsets_Red1 小时前
待修改莫队与普通莫队优化
java·c++·python·学习·算法·数学建模·c#
爱学习的梵高先生2 小时前
C++:友元
开发语言·c++
星火开发设计2 小时前
深度优先搜索(DFS)详解及C++实现
c++·学习·算法·计算机·深度优先·大学生·期末考试
郝学胜-神的一滴2 小时前
Linux线程错误调试指南:从原理到实践
linux·服务器·开发语言·c++·程序人生
weixin_461769402 小时前
3. 无重复字符的最长子串
c++·算法·滑动窗口·最长字串
Morwit3 小时前
【力扣hot100】 312. 戳气球(区间dp)
c++·算法·leetcode
Q741_1473 小时前
C++ 栈 模拟 力扣 394. 字符串解码 每日一题 题解
c++·算法·leetcode·模拟·