如何打印分支和目标设备的信息?
如何进行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 {
char hash[20];
char commit_log[64];
}GitVersion_t;
static GitVersion_t s_GitVersion = {
#include "git_log.txt"
};
OsApi_Printf(1,0,"Commit ID:%s\nDetail: %s",s_GitVersion.hash, s_GitVersion.commit_log);

方案三:用宏定义进行读取

注意:

  1. Android.mk对宏定义进行字符串赋值的时候,一定要注意用转义字符\
    例如:CFLAGS += -DMY_PATH=\"/etc/mycfg\"

  2. 编译一个宏定义后,就算Makefile里面删除了,也还会存在

  3. 在make.mk中定义一个自定义的mk变量,但是在子Makefile中引用这个变量不行,因为子Makefile文件的一开始会把变量全部清空

#ifdef TARGET_PRODUCT
OsApi_Printf(1,0, (char *)"TARGET_VERSION = %s", TARGET_PRODUCT);
#endif

方案四:利用mk脚本生成宏定义

  1. 首先获取git log的信息。
    # 脚本一(媒控的):
    git log -1 2> /dev/null # 打印最近一条commit信息
    head -n 1 # 取第一行
    # 脚本二:
    git log --pretty=format:"%H" -n 1 |cut -b -8
  2. 利用Makefile脚本生成文件
    makefile中call是调用函数的意思 后面的第一个参数是函数名,下面的参数就是函数的参数了
    第二句话是定义了一个函数,1是第一个参数,也就是说这个函数的作用就是往文件1中写入hello
    # function call
    $(call autogenerate_modesubversion,$(AUTO_SUBVERSION_FILE_NAME))
    # function define
    autogenerate_modesubversion = $(shell echo "hello" > $(1)
  3. 增加版本信息的宏定义,在文件中进行读取
    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))
  4. 注意提交代码的时候不要把生成的头文件提交上去。每次编译都会更新生成的版本文件,从而去更新编译时间和版本号。

附录(完整代码)

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_GIT_COMMIT := $(shell git -C $(current_make_path) rev-parse --short=8 HEAD 2>/dev/null)

MODULE_GIT_BRANCH := $(shell cd $(current_make_path) && git branch 2> /dev/null | grep "*" | awk ' {print $$2 } ')
ifeq ($(MODULE_GIT_BRANCH),)
MODULE_GIT_BRANCH := branch-unknow
endif

BranchDetached:= (detached
ifeq ($(MODULE_GIT_BRANCH),$(BranchDetached))
MODULE_GIT_BRANCH := $(shell cd $(current_make_path) && git branch -a 2> /dev/null | grep "\->" |cut -d '>' -f 2 | cut -d '/' -f 2 )
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 "\#ifndef _AUTO_MODSUBVER_H_" >> $(1) ; \
echo "\#define _AUTO_MODSUBVER_H_" >> $(1) ; \
echo "" >> $(1) ; \
echo "\#define MODULE_GIT_BRANCH \"$(MODULE_GIT_BRANCH)\"" >> $(1) ; \
echo "\#define MODULE_BUILD_DATE \"`date "+%Y-%m-%d %H:%M:%S"`\"" >> $(1) ; \
echo "\#define MODULE_GIT_COMMIT \"$(MODULE_GIT_COMMIT)\"" >> $(1) ; \
echo "\#define MODULE_SUBVERSION 0x$(MODULE_SUBVERSION)" >> $(1);\
echo "" >> $(1) ; \
echo "\#endif /* _AUTO_MODSUBVER_H_ */" >> $(1))