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

如果使用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)

编译运行结果如下:

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值了,方便快速查看其对应的源码版本 ?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值