LV02-05-Makefile-09-GIT与SVN版本号

本文主要是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

  • 获取全部详细的commit id
1
git rev-list HEAD

执行效果如下:

1
2
3
4
5
6
7
hk@vm:~/4nfs/openssl$ git rev-list HEAD
86a7a3d01ed683b468d5bf63e92ce95c03bffbe1
9973f4574ef0307435c1ff67f3ad070fd2b20e9e
6d034a0bf3c7c5bfaa9b757932139afca59c0d8c
eda907b1627beadf9572c11f6f8e828e2149d781
1b9cd78b0c38a59c2ce9b2414099ce83e0db8d80
8497f056c38ecff050428e20eb43739d8ff00eb4
  • 获取最新一次的commit id
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
##============================================================================#
# Copyright © hk. 2022-2025. All rights reserved.
# File name: Makefile
# Author : 苏木
# Date : 2024-08-12
# Version :
# Description:
##============================================================================#
##

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-list HEAD | awk 'NR==1')
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参数将宏传入工程。