本文主要是Makefile——将Git或者SVN版本号传入C语言工程的相关笔记,若笔记中有错误或者不合适的地方,欢迎批评指正😃。
点击查看使用工具及版本
PC端开发环境 | Windows | Windows11 |
Ubuntu | Ubuntu20.04.6的64位版本 |
VMware® Workstation 17 Pro | 17.0.0 build-20800274 |
终端软件 | MobaXterm(Professional Edition v23.0 Build 5042 (license)) |
Win32DiskImager | Win32DiskImager v1.0 |
Linux开发板环境 | Linux开发板 | 正点原子 i.MX6ULL Linux 阿尔法开发板 |
uboot | NXP官方提供的uboot,NXP提供的版本为uboot-imx-rel_imx_4.1.15_2.1.0_ga(使用的uboot版本为U-Boot 2016.03) |
linux内核 | linux-4.15(NXP官方提供) |
点击查看本文参考资料
点击查看相关文件下载
我们在写代码的时候经常会使用GIT或者SVN来管理工程,这样我们要是可以在C语言工程中添加版本号,这样出现bug的时候也能快速的找到当时开发的情况。
一、GIT版本号
这里先准备一个C语言的版本库,有如下提交记录:
1 2 3 4 5 6 7
| hk@vm:~/4nfs/openssl$ git mylog * [sumu] 86a7a3d : 加密解密扩展密钥独立开来、修复警告 (HEAD -> master, origin/master) (12 小时前) * [sumu] 9973f45 : 支持读取并打印44字节WAV头信息 (2 天前) * [qidaink] 6d034a0 : 修复一些小bug (2 天前) * [qidaink] eda907b : 编写音频WAV格式文件解密demo (2 天前) * [qidaink] 1b9cd78 : 添加aes_core.c源文件(openssl仓库提交记录:2f33265039cdbd0e4589c80970e02e208f3f94d2) (2 天前) * [qidaink] 8497f05 : 添加readme说明文件 (2 天前)
|
注意:这里的git mylog
是自定义的命令,可以通过git log
查看提交记录。
1. shell获取GIT相关信息
1.1 获取commit id
执行效果如下:
1 2 3 4 5 6 7
| hk@vm:~/4nfs/openssl$ git rev-list HEAD 86a7a3d01ed683b468d5bf63e92ce95c03bffbe1 9973f4574ef0307435c1ff67f3ad070fd2b20e9e 6d034a0bf3c7c5bfaa9b757932139afca59c0d8c eda907b1627beadf9572c11f6f8e828e2149d781 1b9cd78b0c38a59c2ce9b2414099ce83e0db8d80 8497f056c38ecff050428e20eb43739d8ff00eb4
|
1
| git rev-list HEAD | awk 'NR==1'
|
执行效果如下:
1 2
| hk@vm:~/4nfs/openssl$ git rev-list HEAD | awk 'NR==1' 86a7a3d01ed683b468d5bf63e92ce95c03bffbe1
|
- 获取最新一次commit id的简短commit id
1
| git rev-parse --short HEAD | awk 'NR==1'
|
执行效果如下:
1 2
| hk@vm:~/4nfs/openssl$ git rev-parse --short HEAD | awk 'NR==1' 86a7a3d
|
1.2 获取提交总数
获取最新一次提交是整个管理历史中第几次提交的命令如下:
1
| git rev-list HEAD | wc -l
|
执行效果如下:
1 2 3 4 5 6 7 8 9
| hk@vm:~/4nfs/openssl$ git rev-list HEAD | wc -l 6 hk@vm:~/4nfs/openssl$ git mylog * [sumu] 86a7a3d : 加密解密扩展密钥独立开来、修复警告 (HEAD -> master, origin/master) (12 小时前) * [sumu] 9973f45 : 支持读取并打印44字节WAV头信息 (2 天前) * [qidaink] 6d034a0 : 修复一些小bug (2 天前) * [qidaink] eda907b : 编写音频WAV格式文件解密demo (2 天前) * [qidaink] 1b9cd78 : 添加aes_core.c源文件(openssl仓库提交记录:2f33265039cdbd0e4589c80970e02e208f3f94d2) (2 天前) * [qidaink] 8497f05 : 添加readme说明文件 (2 天前)
|
1.3 获取远程仓库信息
我们这里也可以通过shell命令获取git远程关联仓库的链接:
1
| git remote -v | awk 'NR==1' | sed 's/[()]//g' | sed 's/\t/ /g' |cut -d " " -f2
|
执行效果如下:
1 2
| hk@vm:~/4nfs/openssl$ git remote -v | awk 'NR==1' | sed 's/[()]//g' | sed 's/\t/ /g' |cut -d " " -f2 git@gitee.com:sumumm/openssl.git
|
2. Makefile获取GIT相关信息
我们知道Makefile是可以执行shell命令的,所以我们可以在Makefile中使用如下命令获取GIT的相关版本信息
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
|
GIT_SHA = $(shell git rev-parse --short HEAD | awk 'NR==1') GIT_SEQ = $(shell git rev-list HEAD | wc -l) GIT_VER_INFO = $(GIT_SHA)-$(GIT_SEQ) GIT_SVR_PATH = $(shell git remote -v | awk 'NR==1' | sed 's/[()]//g' | sed 's/\t/ /g' |cut -d " " -f2)
print: @echo GIT_SHA=$(GIT_SHA) @echo GIT_SEQ=$(GIT_SEQ) @echo GIT_VER_INFO=$(GIT_VER_INFO) @echo GIT_SVR_PATH=$(GIT_SVR_PATH)
|
执行效果如下:
1 2 3 4 5
| hk@vm:~/4nfs/openssl$ make print GIT_SHA=86a7a3d GIT_SEQ=6 GIT_VER_INFO=86a7a3d-6 GIT_SVR_PATH=git@gitee.com:sumumm/openssl.git
|
3. 将GIT信息传入C工程
3.1 Makefile
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| GIT_SHA = $(shell git rev-parse --short HEAD | awk 'NR==1') GIT_SEQ = $(shell git rev-list HEAD | wc -l) GIT_VER_INFO = $(GIT_SHA)-$(GIT_SEQ) GIT_SVR_PATH = $(shell git remote -v | awk 'NR==1' | sed 's/[()]//g' | sed 's/\t/ /g' |cut -d " " -f2)
ifneq ($(GIT_VER_INFO),) CFLAGS += -DGIT_VERSION=\"$(GIT_VER_INFO)\" else CFLAGS += -DGIT_VERSION=\"unknown\" endif
ifneq ($(GIT_SVR_PATH),) CFLAGS += -DGIT_PATH=\"$(GIT_SVR_PATH)\" else CFLAGS += -DGIT_PATH=\"unknown\" endif
|
3.2 C语言工程
1 2 3 4 5 6
| #include <stdio.h> int main(int argc, const char *arhv[]) { printf("*** Build Time: %s %s,Git Version: %s Git Remote: ***\n", __DATE__, __TIME__, GIT_VER_INFO, GIT_SVR_PATH); return 0; }
|
4. 使用实例
可以看这个仓库:在C工程中添加Git版本信息打印 · 1a7ff22 · 苏木/openssl - Gitee.com
二、SVN版本号
由于SVN用的不多,这里就不详细写了,原理和GIT是一样的,都是通过gcc的-D参数将宏传入工程。