Linux C/C++ 把Git commit SHA1值编译到程序中来方便查看版本

今天使用 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个C源文件,代码如下:

#include <stdio.h>

int main()
{
    printf("build_sha1:\t%s\nbuild_time:\t%s %s\n",
           GIT_COMMIT_SHA1, __DATE__, __TIME__);
    return 0;
}

对应的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

编译运行结果如下:

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

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

猜你喜欢

转载自blog.csdn.net/thisinnocence/article/details/79517984