将 git 信息编译进可执行程序

脚本 build.sh

运行 build.sh 脚本会生成最新的头文件,其包含 git 信息:

1
2
3
4
5
6
7
8
#!/bin/sh
commit_ts=`git log -1 --format="%ct"`
commit_time=`date -d@$commit_ts +"%Y-%m-%d %H:%M:%S"`
current_time=`date +"%Y-%m-%d %H:%M:%S"`
git_version=`git log -1 --format="%h"`
sed s/MYVERSION/"version: $git_version commit: $commit_time build: $current_time"/g version.h.tmp > version.h
make clean
make

将脚本内容保存为 build.sh 每次提交源码之后,直接运行 build.sh 脚本即会生成最新的头文件,该头文件被编译到程序中,可以看到版本信息包含了最新的版本号,提交时间,编译时间。

模版文件 version.h.tmp

其中有一个模版文件 version.h.tmp,其内容如下:

1
2
3
#ifndef _VERSION_
#define _VERSION_ "MYVERSION"
#endif

头文件 version.h

运行 build.sh 之后生成的 version.h 文件类似如下:

1
2
3
#ifndef _VERSION_
#define _VERSION_ "version: 082472d commit: 2017-07-06 16:35:42 build: 2017-07-11 21:01:31"
#endif

在源文件中直接使用 VERSION 宏就可以啦,在 git 提交版本的时候应该将 version.h.tmp 模版文件添加到版本控制系统中,而脚本生成的 version.h 由于每次 build 都会变化,可以忽略掉。