1. 项目代码根目录下添加一个cmake文件git_version.cmake,内容如下:
  1. # get git hash
  2. macro(get_git_hash _git_hash)
  3. set(ENV{GIT_DIR} ${PROJECT_SOURCE_DIR}/.git)
  4. execute_process(
  5. COMMAND git rev-parse --short HEAD
  6. OUTPUT_VARIABLE ${_git_hash}
  7. OUTPUT_STRIP_TRAILING_WHITESPACE
  8. ERROR_VARIABLE GET_GIT_VERSION_FAILED
  9. )
  10. #IF(GET_GIT_VERSION_FAILED)
  11. # MESSAGE(FATAL_ERROR ${GET_GIT_VERSION_FAILED})
  12. #ELSE(GET_GIT_VERSION_FAILED)
  13. # MESSAGE("-- Current Git Commit ID: ${_git_hash}")
  14. # add_definitions(-DDEFINED_GIT_CID)
  15. #ENDIF(GET_GIT_VERSION_FAILED)
  16. endmacro()
  17. # get git branch
  18. macro(get_git_branch _git_branch)
  19. set(ENV{GIT_DIR} ${PROJECT_SOURCE_DIR}/.git)
  20. execute_process(COMMAND git symbolic-ref --short -q HEAD
  21. #WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
  22. OUTPUT_VARIABLE ${_git_branch}
  23. OUTPUT_STRIP_TRAILING_WHITESPACE
  24. ERROR_QUIET
  25. )
  26. endmacro()
  27. # 生成版本描述字符串类似 TAG-X-gHASH
  28. macro(get_git_tag_hash _git_tag_hash)
  29. set(ENV{GIT_DIR} ${PROJECT_SOURCE_DIR}/.git)
  30. execute_process(COMMAND git describe --abbrev=6 --dirty --always --tags
  31. # WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
  32. OUTPUT_VARIABLE ${_git_tag_hash}
  33. OUTPUT_STRIP_TRAILING_WHITESPACE
  34. ERROR_QUIET
  35. )
  36. endmacro()
  37. # 获取最新 commit 日期,YYYY-MM-DD
  38. macro(get_git_date_time _git_date_time)
  39. set(ENV{GIT_DIR} ${PROJECT_SOURCE_DIR}/.git)
  40. execute_process(COMMAND git log -1 --format=%cd --date=short
  41. # WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
  42. OUTPUT_VARIABLE ${_git_date_time}
  43. OUTPUT_STRIP_TRAILING_WHITESPACE
  44. ERROR_QUIET
  45. )
  46. endmacro()
  1. 在根目录CMakeLists.txt中添加:
  1. set(GIT_HASH "")
  2. set(GIT_BRANCH "")
  3. set(GIT_DATETIME "")
  4. get_git_hash(GIT_HASH)
  5. get_git_branch(GIT_BRANCH)
  6. get_git_date_time(GIT_DATETIME)
  7. message(STATUS "git hash: ${GIT_HASH}, ${GIT_BRANCH}, ${GIT_DATETIME}")
  1. 在src目录增加一个 repo_version.h.cmake 的文件:
  1. #define MAGE_VERSION_MAJOR @MAGE_VERSION_MAJOR@
  2. #define MAGE_VERSION_MINOR @MAGE_VERSION_MINOR@
  3. #define MAGE_VERSION_PATCH @MAGE_VERSION_PATCH@
  4. #define MAGE_VERSION_GIT_HEAD_VERSION "@GIT_HASH@"
  5. #define MAGE_VERSION_GIT_BRANCH "@GIT_BRANCH@"
  6. #define MAGE_VERSION_GIT_DATETIME "@GIT_DATETIME@"

其中 major、minor 和 patch 是传统的软件版本规范,如果你的项目里不需要的话,可以删除掉,如果保留就需要在 CMake 中赋值。除了这 3 个之外,就是最重要的 "@MAGE_VERSION_GIT_HEAD_VERSION@",即我们从 git 里获取的版本信息,它要和 EXECUTE_PROCESS()指令的 OUTPUT_VARIABLE 的变量名保持一致,注意我们用双引号把它括起来当作一个字符串使用。

增加以下代码生成头文件:

  1. configure_file("src/repo_version.h.cmake" "repo_version.h")

运行 cmake,在当前目录下(准确的说是 cmake 的 PROJECT_BINARY_DIR 目录)就生成了 repo_version.h 文件:

  1. #define MAGE_VERSION_MAJOR
  2. #define MAGE_VERSION_MINOR
  3. #define MAGE_VERSION_PATCH
  4. #define MAGE_VERSION_GIT_HEAD_VERSION "ec99a2f"
  5. #define MAGE_VERSION_GIT_BRANCH "default_startup_param"
  6. #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. 《网页设计基础——CSS的四种引入方式详解》

    网页设计基础--CSS的四种引入方式详解     一.行内式:   规则: 1. 行内式是所有样式方法中最为直接的一种,它直接对HTML的标记使用style属性,然后将CSS代码直接写在其中.   格 ...

  2. Mybatis 一级缓存和二级缓存原理区别 (图文详解)

    Java面试经常问到Mybatis一级缓存和二级缓存,今天就给大家重点详解Mybatis一级缓存和二级缓存原理与区别@mikechen Mybatis缓存 缓存就是内存中的数据,常常来自对数据库查询结 ...

  3. linux系统安装Confluence

    转载网址:https://blog.yupaits.com/blog/record/linux-confluence.html#安装步骤 Confluence简介 Confluence是一个专业的企业 ...

  4. Grafana的基本概念

    Grafana基本概念 首先Grafana是一个通用的可视化工具.'通用'意味着Grafana不仅仅适用于展示Prometheus下的监控数据,也同样适用于一些其他的数据可视化需求.在开始使用Graf ...

  5. Grafana 入门知识介绍

    通过[Configuration]>[Plugins]添加插件 通过[Configuration]>[Data Sources]添加数据源(分析对象) 通过[Server Admin]&g ...

  6. 我的 Kafka 旅程 - 文件存储机制

    存储机制 Topic在每个Broker下存储所属的Partition,Partition下由 Index.Log 两类文件组成. 写入 Log 由多个Segment文件组成,每个Segment文件容量 ...

  7. 面向制造企业普适性ERP、MES类产品为什么那么难找?

    标准化与个性化之间的矛盾怎么可能通过普适性的ERP.MES系统来解决?为什么难?就跟你找一套适合所有人穿的衣服一样难,事实上这个比找衣服更难!人与人之间高矮胖瘦各不相同.肤色体型各有差异,把同一套衣服 ...

  8. PHP全栈开发(四): HTML 学习(1.基础标签+表格标签)

    简单的学习一下HTML 学习HTML采用在www.runoob.com上学习的方法. 而且该网站还提供在线编辑器. 然后HTML编辑器使用Notepad++ 记得上Emmet的官网http://emm ...

  9. 网络安全(一)主动进攻之DNS基础和ettercap实现DNS流量劫持

    alittlemc,个人原创,个人理解和观点.若有错误.不理解请与我联系,谢谢! 介绍了DNS的解析过程. DNS劫持的思路和实践. DNS 域名 以为live.bilibili.com为例子,从后到 ...

  10. RAID5 IO处理之条带读代码详解

    除了对齐读流程中读失败通过条带重试的场景会进入到条带读,当IO覆盖范围超过一个chunk时也会进入条带读(如向chunk为4K的RAID下发起始位置为1K大小为4K的IO),接下来我们就这部分逻辑进行 ...