Android传递宏给uboot或kernel

Android编译环境,lunch的时候会进行product和variant的选择,比如说lunch xxx-eng得到的结果如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
victor@victor-HP:~/master$ lunch xxx-eng 

Already installed latest Toochain
============================================
PLATFORM_VERSION_CODENAME=REL
PLATFORM_VERSION=3.0.0
TARGET_PRODUCT=xxx
TARGET_BUILD_VARIANT=eng
TARGET_BUILD_TYPE=release
TARGET_BUILD_APPS=
TARGET_ARCH=arm64
TARGET_ARCH_VARIANT=armv8-a
HOST_ARCH=x86
HOST_OS=linux
HOST_BUILD_TYPE=release
BUILD_ID=master
============================================

因此我们可以取得几个环境变量,TARGET_BUILD_VARIANT=engTARGET_PRODUCT=xxx,输入env命令就可以查看当前系统当前shell下的环境变量。我们想根据TARGET_BUILD_VARIANT的值为eng或者user来选择在uboot或kernel中开关某个功能。

解决思路:
lunch后我们可以获得TARGET_BUILD_VARIANT的值,判断其为eng或者user,然后相应的export出一个环境变量,最后在uboot或kernel中的Makefile中判断环境变量传递相应的宏。

export环境变量

build/envsetup.sh文件中的function lunch()函数的最后添加如下判断。

1
2
3
4
5
6
unset ENABLE_ALL_CONSOLE
if [ "$product"x = "xxx"x ] && [ "$variant"x = "eng"x ]
then
export ENABLE_ALL_CONSOLE=true
echo "export ENABLE_ALL_CONSOLE=true for: '$product'-'$variant'"
fi

function lunch()的函数是用户执行lunch xxx-eng调用的,unset ENABLE_ALL_CONSOLE是为了清除上次残留的环境变量,在这里我们增加对$product$variant的判断。


Makefile中添加环境变量的判断,如下:

1
2
3
ifeq ($(ENABLE_ALL_CONSOLE),true)
KBUILD_CPPFLAGS += -DCONFIG_ENABLE_ALL_CONSOLE
endif

KBUILD_CPPFLAGS中的变量添加-DCONFIG_ENABLE_ALL_CONSOLE的值。KBUILD_CPPFLAGS在编译kernel或uboot的时候会传递给gcc编译器,而gcc编译器支持-D的参数,用于定义一个宏。这样,我们就可以在uboot或kernel中的代码使用CONFIG_ENABLE_ALL_CONSOLE的宏了。

1
2
-D name
Predefine name as a macro, with definition 1.

Title:Android传递宏给uboot或kernel

Author:Victor Huang

Time:2019-03-17 / 16:03

Link:http://wowothink.com/8b524cfd/

License: Attribution-NonCommercial-NoDerivatives 4.0 International (CC BY-NC-ND 4.0)