github上的程序工程版本号加commit

2760阅读 0评论2018-08-17 乐百事2
分类:嵌入式

实现这个的思路是Makefile中获取到工程的git的commit信息,获取编译的日期,然后通过-D的方式把这些信息传递给程序中,如下Makefile中增加信息:


COMPILE_TIME = $(shell git log -1 --format="%ad" --date=short)
GIT_REVISION = $(shell git rev-parse --verify --short HEAD 2>/dev/null)
GIT_DIRTY    = $(shell git diff . 2>/dev/null)

ifneq "$(GIT_DIRTY)" ""
GIT_DIRTY_FLAG = "$(GIT_REVISION)-dirty"
else
GIT_DIRTY_FLAG = "$(GIT_REVISION)"
endif

CFLAGS  := $(addprefix -I, $(IDIR))
CFLAGS  += -Wall
CFLAGS  += -DCOMPILE_TIME="\"$(COMPILE_TIME)\""
CFLAGS  += -DGIT_REVISION="\"$(GIT_DIRTY_FLAG)\""

执行编译时候大概就是类似这样的:
arm-none-linux-gnueabi-gcc -I../include -Wall -DCOMPILE_TIME="\"2018-08-16\"" -DGIT_REVISION="\""efed795"\""   -c -o test.o test.c

通过这种方式可以把GIT_REVISION和COMPILE_TIME两个值以宏定义的方式传递给程序,这两个宏定义的赋值就是前面获取到的GIT_DIRTY_FLAG和COMPILE_TIME。在程序里面就可以直接用这两个宏定义了,直接可以打印出来。

后来想增加-dirty这样的方式,参考linux的kernel的版本号,我用了git diff .查看当前工程是否有文件变更,有的话就是-dirty版本,否则就是纯净可发布版本。不过这个地方有个问题,就是我没有修改原有工程时候,增加了新的程序文件,而且没有通过git add进去,这个时候git diff .还是判定为纯净版本,暂时没想到其他更好的办法,不过仔细分析一下,如果在工程里增加了文件,但是你没有修改Makefile和原来工程里的任何文件,貌似也没有影响,增加的文件对编译结果不产生任何影响,应该也是能用这种方式的。
上一篇:ubuntu10.04安装qt-arm-4.7.4
下一篇:没有了