当前位置:   article > 正文

Linux C/C++ 把Git commit SHA1值编译到程序中来方便查看版本_c++怎么把commitid写到代码里

c++怎么把commitid写到代码里

今天使用 Visual Studio Code,点击关于Visual Studio Code会呈现版本的Git commit SHA1值,这个对于查看一个发布的程序对应的源码十分的方便和精确,可以在非常方便的直接checkout出来对应程序对应的源码版本。

对于Linux C/C++程序,如果想做到这样的效果,把SHA1值放到构建的产品,也非常简单。有两种办法:

  • 如果程序对外发布包含有很多的文件,可以有个文本文件专门存放build时的Git commit SHA1。
  • 如果产品只对外提供一些可执行文件或动态链接库,那么可以通过编译宏的办法把Git commit SHA1直接编译到二进制文件中。

下面重点介绍一下上面说的第二种方法,如何把Git commit SHA1值直接编译到对应的二进制文件中。假设有下面一个产品的Git仓库,目录结构非常简单如下:

root@ubuntu:/media/psf/Home/iLearn/project# tree
.
├── main.c
└── Makefile

0 directories, 2 files
root@ubuntu:/media/psf/Home/iLearn/project#
root@ubuntu:/media/psf/Home/iLearn/project# git log
commit 444712dc00e25a438b59fbecfe5ba7c6d21a54a9
Author: Michael <michael@gmail.com>
Date:   Sat Mar 10 22:17:14 2018 +0800

    Project init.
root@ubuntu:/media/psf/Home/iLearn/project#
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

这个库里面只有1个C源文件,代码如下:

#include <stdio.h>

int main()
{
    printf("build_sha1:\t%s\nbuild_time:\t%s %s\n",
           GIT_COMMIT_SHA1, __DATE__, __TIME__);
    return 0;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

对应的Makefile如下:

GIT_COMMIT_SHA1 = `git log -n 1 | head -n 1 | cut -d ' ' -f 2`
# 编译参数: Git commit SHA1
CFLAGS = -DGIT_COMMIT_SHA1=\"$(GIT_COMMIT_SHA1)\"
# 编译参数:如优化等级,调试信息,打开所有告警等等
CFLAGS += -O2 -g -Wall   

test : main.c
	gcc $^ $(CFLAGS) -o $@

.PHONY: clean
clean:
	rm test

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

如果使用CMake,可以用如下的脚本:

cmake_minimum_required(VERSION 3.10)

execute_process(
    COMMAND bash "-c" "git log|head -n 1|awk '{printf $2}'"
    OUTPUT_VARIABLE GIT_COMMIT
)

add_definitions(-DGIT_COMMIT_SHA1="${GIT_COMMIT}")
add_executable(main main.c)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

编译运行结果如下:

root@ubuntu:/media/psf/Home/iLearn/project# make
gcc main.c -DGIT_COMMIT_SHA1=\"`git log -n 1 | head -n 1 | cut -d ' ' -f 2`\"     -O2 -g -Wall    -o test
root@ubuntu:/media/psf/Home/iLearn/project# ./test
build_sha1:	444712dc00e25a438b59fbecfe5ba7c6d21a54a9
build_time:	Mar 11 2018 17:06:18
  • 1
  • 2
  • 3
  • 4
  • 5

可以发现,程序里已经包含了build的时间和Git commit SHA1值了,方便快速查看其对应的源码版本 ?

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/盐析白兔/article/detail/598550
推荐阅读
相关标签
  

闽ICP备14008679号