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

相关推荐
拳里剑气1 小时前
C++算法:BFS解决FloodFill算法
c++·算法·bfs·宽度优先
爱写代码的小朋友2 小时前
从零开始学 Win32 API:C++ 窗口编程实战(VS Code + MinGW-w64 命令行详解)
开发语言·c++
小小晓.2 小时前
C++:语句和作用域
开发语言·c++
fqbqrr2 小时前
2607C++,soui,xplayer视频播放器
c++·soui
zh路西法3 小时前
【10天速通ROS2-PX4无人机】(四) 关掉GPS和气压计,纯激光定位还能飞吗
c++·无人机·px4·ros2·卡尔曼滤波·fastlio2
yyds_yyd_100864 小时前
1464. 数组中两元素的最大乘积(2026.07.27)
数据结构·c++·算法·leetcode
王老师青少年编程6 小时前
csp信奥赛C++高频考点专项训练:【排序算法】案例7:最高分数的学生姓名
c++·排序算法·csp·高频考点·信奥赛·最高分数的学生姓名
库克克6 小时前
【C++】set 与multiset
开发语言·c++
Mortalbreeze7 小时前
深入 Linux Socket 编程:端口号、网络字节序与 struct sockaddr 详解
linux·服务器·网络·c++
繁星蓝雨8 小时前
C++设计原理——异常处理
java·c++·异常处理·noexcept·throw·try catch