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"

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

Linux C++目标中添加git版本信息的更多相关文章

  1. Spring Boot中使用Actuator的/info端点输出Git版本信息

    对于Spring Boot的Actuator模块相信大家已经不陌生了,尤其对于其中的/health./metrics等强大端点已经不陌生(如您还不了解Actuator模块,建议先阅读<Sprin ...

  2. Linux下查看网卡驱动和版本信息

    Linux下查看网卡驱动和版本信息 查看网卡生产厂商和信号 查看基本信息:lspci 查看详细信息:lspci -vvv # 3个小写的v 查看网卡信息:lspci | grep Ethernet 查 ...

  3. 如何在Android Studio中添加注释模板信息?

    如何在Android Studio中添加注释模板信息? 在开发程序的时候,我们一般都会给文件自动添加上一些关于文件的注释信息,比如开发者的名字,开发的时间,开发者的联系方式等等.那么在android ...

  4. webstorm2017中添加git

    1.pc中先安装git 2.在webstorm中选择VCS -> Checkout from Version Control -> Git Git Repository URL:  [gi ...

  5. 详解在Visual Studio中使用git版本系统[转]

    这篇教程的预期,是希望没有任何版本使用基础的新手也可以掌握,所以细节较多,不当之处,欢迎指正. 一 .安装 git 开发工具 如果要使用 git 进行版本管理,其实使用 git 命令行工具就完全足够了 ...

  6. 详解在visual studio中使用git版本系统(图文)

    很多人已经在使用git(或正在转移到git上),在github.com上,也看到园子里不少同学的开源项目,非常不错.但相关教程似乎不多,所以趁着我自己的开源项目源码托管(https://github. ...

  7. 在visual studio中使用git版本系统(zz)

    第一部分: 安装 git 开发工具 如果要使用 git 进行版本管理,其实使用 git 命令行工具就完全足够了,图形化工具(无论是 git extentions ,还是TortoiseGit),都只不 ...

  8. 【转】详解在visual studio中使用git版本系统(图文)

    http://blog.csdn.net/wojilu/article/details/6976230 很多人已经在使用git(或正在转移到git上),在github.com上,也看到不少国内同学的开 ...

  9. Windows XP 下如何使用Qt Creator中的Git版本控制功能

     原文地址:http://www.qtcn.org/bbs/simple/?t16960.html Qt Creator是针对Qt应用开发平台专门设计的IDE开发工具,集成了很多功能,分别有win ...

  10. linux下nginx编译安装、版本信息修改

    环境 centos 7 安装依赖包 yum install -y gcc gcc-c++ glibc glibc-devel pcre pcre-devel zlib zlib-devel opens ...

随机推荐

  1. session 总结

    session 总结(单节点场景) session 称作域对象,一般保存在当前服务器的内存中,如果有很多session也会部分不常用的session"钝化"到磁盘中,若磁盘中的se ...

  2. spring native 初体验实现 小米控制美的空调

    目前关于 spring native 分享的文章还比较少 写这篇文章的主要目前是分享一下自己写的一个 小米控制美的空调 的程序 集成 spring native 过程中碰到的一些问题和解决方法 先放地 ...

  3. 002-ImageNetClassificationDeep2017

    ImageNet classification with deep convolutional neural networks #paper 1. paper-info 1.1 Metadata Au ...

  4. Kubernetes 日志:搭建 EFK 日志系统

    Kubernetes 中比较流行的日志收集解决方案是 Elasticsearch.Fluentd 和 Kibana(EFK)技术栈,也是官方现在比较推荐的一种方案. Elasticsearch 是一个 ...

  5. 在k8s中部署前后端分离项目进行访问的两种配置方式

    第一种方式 (1) nginx配置中只写前端项目的/根路径配置 前端项目使用的Dockerfile文件内容 把前端项目编译后生成的dist文件夹放在nginx的html默认目录下,浏览器访问前端项目时 ...

  6. shell下cat EOF中变量$处理

    在使用cat EOF中出现$变量通常会直接被执行,显示执行的结果.若想保持$变量不变需要使用 \ 符进行注释 [root@localhost ~]# cat >> aa.txt <& ...

  7. Docker网络详解——原理篇

    安装Docker时,它会自动创建三个网络,bridge(创建容器默认连接到此网络). none .host 网络模式 简介 Host 容器将不会虚拟出自己的网卡,配置自己的IP等,而是使用宿主机的IP ...

  8. Alertmanager篇

    报一直是整个监控系统中的重要组成部分,Prometheus监控系统中,采集与警报是分离的.警报规则在 Prometheus 定义,警报规则触发以后,才会将信息转发到给独立的组件 Alertmanage ...

  9. 30分钟掌握 Webpack

    本文基于:峰华前端工程师--30分钟掌握Webpack 为什么使用 Webpack 在我们进行传统网页开发中,会在 index.html 中引入大量的 js 和 css 文件,不仅可能会导致命名冲突, ...

  10. SpringBoot 常用读取配置文件的 3 种方法!

    我们在SpringBoot框架进行项目开发中该如何优雅的读取配置呢?或者说对于一些List或者Map应该如何配置呢? 本篇主要解决如下几个问题: 1.Spring Boot有哪些常用的读取配置文件方式 ...