我们自己会开发一些sdk以动态库的形式发布出去,为了便于问题回溯,我们会手动加上版本号来管理,或者在代码里面加上诸如__DATE__和__TIME__这样的宏来打印出代码编译时候的时间信息,但是如果commit比较频繁,这样还是很难将时间和源代码的版本精确对应起来,这里介绍一种方法,可以自动得获取git commit的sha1信息,将其自动化地编译进sdk。
-
目标:自动化打印sdk编译时候的git commit sha1信息
-
限制条件:1. 自动化;2.精确;3. 不可以影响系统正常运行。
欢迎探讨,本文持续维护。
-
操作系统:Ubuntu 16.04 LTS
-
编译器:gcc version 5.4.0 20160609 (Ubuntu 5.4.0-6ubuntu1~16.04.10)
这里为了讨论方便,约定sdk库由sdk.cpp编译而成,sdk头文件为sdk.h,应用程序由main.cpp编译而成,中间调用sdk的接口。
目录结构如下:
代码内容如下:
结果分析:
首先在Makefile中用git log, head和cut命令获取当前代码的git commit sha1值,然后将其赋给GIT_COMMIT_SHA1宏,最后通过gcc的-D选项将其告诉编译器。这样就可以在代码里面跟自己定义的字符串一样使用这个GIT_COMMIT_SHA1宏了。
注意,一定要在代码commit后再编译,这样才能使当前仓库最新commit sha1值和代码一致。
本文分享了一种将git commit sha1值自动编译进elf文件的方法,并做了简单的原理介绍,其他版本工应该也可以找到类似的方法。