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. Windows Admin Center无法访问

    近日,有一台安装了Windows Admin Center的服务器无法访问了.遇到错误ERR_HTTP2_INADEQUATE_TRANSPORT_SECURITY.本以为这是更新了Chromium内 ...

  2. 俄罗斯的 HTTPS 证书问题

    文章转载自:https://mp.weixin.qq.com/s/8EikwCvZgKt2TFsld-nKSA

  3. 解决zeal离线文档下载慢问题

    zeal简介 编程过程中难免会遇到不会用的关键字和方法,对我而言,在windows下,我使用Zeal这个软件进行离线文档查询. 问题 但是,在软件中下载DocSet(文档)会出现下载慢,或者下载不了的 ...

  4. ElastAlert监控日志告警Web攻击行为---tomcat和nginx日志json格式

    一.ELK安装 1.2 elk配置 logstash自定义配置文件,取名为filebeat_log.conf : input { beats { port => 5044 client_inac ...

  5. 1_Html

    一. 引言 1.1 HTML概念 网页, 是网站中的一个页面, 是构成网站的基本元素, 是承载各种网站应用的平台. 通俗的说, 网站就是由网页组成的, 通常我们看到的网页都是以html或html后缀结 ...

  6. 《Deep Feature Extraction and Classification of Hyperspectral Images Based on Convolutional Neural Networks》论文笔记

    论文题目<Deep Feature Extraction and Classification of Hyperspectral Images Based on Convolutional Ne ...

  7. 手把手教你使用LabVIEW人工智能视觉工具包快速实现图像读取与采集(含源码)

    目录 前言 一.工具包位置 二.图像采集与色彩空间转换 1.文件读写 2.实现图片读取 3.使用算子cvtColor实现颜色空间转换 三.从摄像头采集图像 1.Camera类 2.属性节点 3.实现摄 ...

  8. NSIS隐藏窗口标题栏自带的按钮(最大化,最小化,关闭X)

    这个问题实在八月份逛csdn论坛的时候偶然遇到的,当时比较好奇楼主为啥要隐藏关闭按钮,就顺口问了下,结果楼主已经弃楼,未给出原因,猜着可能是为了做自定义页面美化,无法改变按纽外观之类的,后来琢磨了下, ...

  9. SpringBoot课程学习(四)

    一.profile的多文档配置方式 1.profile文件方式:提供多个配置文件,每个代表一种环境 如: 1.application-dev.properties/yml 开发环境 2.applica ...

  10. Spring笔记三

    Spring-03 1. AOP 1.1 概念 ​ AOP为Aspect Oriented Programming的缩写,意为:面向切面编程.他是一种可以在不修改原来的核心代码的情况下给程序动态统一进 ...