如何打印分支和目标设备的信息?
如何进行Makefile的编写?
如何引用Makefile中的宏定义?
要求
能够获取到分支信息、编译时间
方案
下面有四种方案,下面的一种方案是上面方案的改进版
方案一:用fopen打开文件
git是编译服务器上的程序,git log也仅仅存在于服务器上,而代码的运行位置是在设备上。所以如果想要自动打印版本信息的话,log信息保存在设备的某个位置下,然后在代码中读取文件。
可以利用git log格式化输出
git log --pretty=format:"\"%h\",\"%s\"" -n 1 > source/debug/git_log.txt |
方案二:用头文件包含的方案
为了减少读取文件这种开销,可以把log信息放到头文件里面,具体可以参考高通camera 3A信息的头文件。注意:
发现#include必须要写在最前面,表达式中间不能有#,但是却有一个投机取巧的方法,就是定义一个结构体,将文档文件读取成结构体。
typedef struct { |
方案三:用宏定义进行读取
注意:
Android.mk对宏定义进行字符串赋值的时候,一定要注意用转义字符
\
例如:CFLAGS += -DMY_PATH=\"/etc/mycfg\"
编译一个宏定义后,就算Makefile里面删除了,也还会存在
在make.mk中定义一个自定义的mk变量,但是在子Makefile中引用这个变量不行,因为子Makefile文件的一开始会把变量全部清空
|
方案四:利用mk脚本生成宏定义
- 首先获取git log的信息。
脚本一(媒控的):
git log -1 2> /dev/null # 打印最近一条commit信息
head -n 1 # 取第一行
脚本二:
git log --pretty=format:"%H" -n 1 |cut -b -8 - 利用Makefile脚本生成文件
makefile中call是调用函数的意思 后面的第一个参数是函数名,下面的参数就是函数的参数了
第二句话是定义了一个函数,1是第一个参数,也就是说这个函数的作用就是往文件1中写入hello# function call
$(call autogenerate_modesubversion,$(AUTO_SUBVERSION_FILE_NAME))
# function define
autogenerate_modesubversion = $(shell echo "hello" > $(1) - 增加版本信息的宏定义,在文件中进行读取
current_makefile := $(lastword $(MAKEFILE_LIST))
current_make_path := $(patsubst %/,%,$(dir $(current_makefile:%/=%)))/..
# MODULE_SUBVERSION := $(shell cd $(current_make_path) && git log -1 2> /dev/null | head -n 1 | awk ' {print $$2 } ' | cut -b -8)
MODULE_SUBVERSION := $(shell cd $(current_make_path) && git log --pretty=format:"%H" -n 1 |cut -b -8)
ifeq ($(MODULE_SUBVERSION),)
MODULE_SUBVERSION := AA5555AA
endif
# module_auto_subversion_gen = $(shell echo "Do nothing..")
autogenerate_modesubversion = $(shell echo "/**" > $(1) ; \
echo " * Kedacom module subversion defines." >> $(1) ; \
echo " * Automatically generated file, DO NOT EDIT." >> $(1) ; \
echo " * Don't push it to repository." >> $(1) ; \
echo " *" >> $(1) ; \
echo " */" >> $(1) ; \
echo "\#define MODULE_SUBVERSION 0x$(MODULE_SUBVERSION)" >> $(1)) - 注意提交代码的时候不要把生成的头文件提交上去。每次编译都会更新生成的版本文件,从而去更新编译时间和版本号。
附录(完整代码)
current_makefile := $(lastword $(MAKEFILE_LIST)) |