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

相关推荐
十二3 小时前
【洛谷题解】P1083 [NOIP 2012 提高组] 借教室(二分答案 + 差分)
数据结构·c++·算法·蓝桥杯
D e re k ZH5 小时前
C++ 从零入门(一):基础语法与程序结构
数据结构·c++·算法
zjxtxdy7 小时前
C++面向对象程序开发-类与对象
开发语言·c++
東隅已逝,桑榆非晚8 小时前
算法6. 双指针法-查找总价格为目标的两个商品
c++·学习·算法
qq_406981039 小时前
c++拷贝构造函数
开发语言·c++
H.莓飛11 小时前
【C++】【STL】vector_OJ题
linux·服务器·开发语言·数据结构·c++·visual studio
Rabitebla11 小时前
【Linux操作系统】进程篇(十一):进程程序替换——从底层原理到 exec 函数族
linux·服务器·c++·笔记·学习·算法
沫璃染墨12 小时前
从零入门计算机网络系列(十五):TCP可靠传输机制详解——从序号与确认应答到乱序处理
服务器·网络·c++·tcp/ip·tcp
青少儿编程课堂12 小时前
蓝桥杯·全国青少年信息素养大赛·电子学会Python/C++考级:Bellman-Ford与SPFA含负权最短路及负环检测全解析
c++·python·算法·bfs·信息学竞赛
旖旎夜光12 小时前
【C++ 基础入门】类和对象(下):初始化列表、static 成员、友元与内部类
c++·笔记·学习