赞
踩
今天使用 Visual Studio Code,点击关于Visual Studio Code
会呈现版本的Git commit SHA1值,这个对于查看一个发布的程序对应的源码十分的方便和精确,可以在非常方便的直接checkout出来对应程序对应的源码版本。
对于Linux C/C++程序,如果想做到这样的效果,把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值了,方便快速查看其对应的源码版本 ?
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。