实现这个的思路是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和原来工程里的任何文件,貌似也没有影响,增加的文件对编译结果不产生任何影响,应该也是能用这种方式的。
阅读(2477) | 评论(0) | 转发(0) |