1)source build/envsetup.sh
前面说过一般envsetup.sh一般做了如下几件事情:
1)加载编译时我们使用的基本函数命令:help、lunch、m、mm、mmm等。
2)查找vendor/厂商目录、device/厂商目录下的vendorsetup.sh,加载执行,添加厂商自己定义的产品编译选项。
3)一般Android原生代码里面可能会添加两个系统的默认选项:
add_lunch_combo generic-eng
add_lunch_combo simulator
2)查找vendorsetup.sh进行加载
在envsetup.sh结尾的地方,我们看到:
# Execute the contents of any vendorsetup.sh files we can find.
for f in `/bin/ls vendor/*/vendorsetup.sh vendor/*/*/vendorsetup.sh device/*/*/vendorsetup.sh 2> /dev/null`
do
echo "including $f"
. $f
done
unset f
addcompletions
查找vendor 以及device目录下的厂商自己 定义的vendorsetup.sh加载执行。所以如果我们自己需要定义自己的产品选项的话,就需要在vendor下创建自己公司的名字,然后新建一个vendorsetup.sh,里面添加上自己的产品编译选项。
如:我的fsl项目:
device/fsl/imx6/vendorsetup.sh内容:
add_lunch_combo sabresd_6dq-eng
add_lunch_combo sabresd_6dq-user
add_lunch_hadrware SboxF140AV01
add_lunch_hardware SboxF140CV01
add_lunch_project BASE
add_lunch_prohect Danoo
............
这里我们先看看函数add_lunch_combo内容:
# Clear this variable. It will be built up again when the vendorsetup.sh # files are included at the end of this file. unset LUNCH_MENU_CHOICES function add_lunch_combo() { local new_combo=$1 local c for c in ${LUNCH_MENU_CHOICES[@]} ; do if [ "$new_combo" = "$c" ] ; then return // 判断全局数组LUNCH_MENU_CHOICES中如果已经存在添加的选项,则直接返回 fi done // 否则将添加选项,添加到全局数组LUNCH_MENU_CHOICES中 LUNCH_MENU_CHOICES=(${LUNCH_MENU_CHOICES[@]} $new_combo) echo "${LUNCH_MENU_CHOICES[@]}" }
3)lunch选择
lunch是envsetup.sh中定义的一个命令,用来让用户选择编译选项,定义自己的product,和一些全局变量的。
下面我们来看看具体lunch内容是什么:
function lunch() { local answer //声明一个局部变量answer if [ "$1" ] ; then answer=$1 else // 如果没有传参数,如:lunch,则打印出所有的target product菜单选项供用户选择 print_lunch_menu echo -n "Which would you like? [1] " read answer // 从标准输入获取选项 fi local selection= if [ -z "$answer" ] then answer=1 // 如果用户没有输入任何选项,默认为第一个 selection=${LUNCH_MENU_CHOICES[$(($answer-1))]} elif (echo -n $answer | grep -q -e "^[0-9][0-9]*$") //如果用户输入的是数字索引 then if [ $answer -le ${#LUNCH_MENU_CHOICES[@]} ] // 判断用户输入是否为有效的选项 then selection=${LUNCH_MENU_CHOICES[$(($answer-1))]} fi elif (echo -n $answer | grep -q -e "^[^\-][^\-]*-[^\-][^\-]*$") then selection=$answer // 如果用户输入的不是数字索引,而是选项内容 fi if [ -z "$selection" ] then echo echo "Invalid lunch combo: $answer" return 1 fi export TARGET_BUILD_APPS= // 获取selection字符串第一次遇到的-前面内容,如:输入fsl-eng输出fsl local product=$(echo -n $selection | sed -e "s/-.*$//") check_product $product // 检查fsl是否有效 if [ $? -ne 0 ] then echo echo "** Don't have a product spec for: '$product'" echo "** Do you have the right repo manifest?" product= fi // 获取selection字符串第一次遇到的-后面内容,如:输入fsl-eng输出eng local variant=$(echo -n $selection | sed -e "s/^[^\-]*-//") check_variant $variant // 检查eng是否有效 if [ $? -ne 0 ] then echo echo "** Invalid variant: '$variant'" echo "** Must be one of ${VARIANT_CHOICES[@]}" variant= fi if [ -z "$product" -o -z "$variant" ] then echo return 1 fi if [ "$2" ] ; then answer=$2 else // 如果用户没有输入第二个参数,打印硬件选项菜单,供用户选择 print_lunch_hardware echo -n "Which would you like? [1] " read answer fi if [ -z "$answer" ] then answer=1 hardware=${LUNCH_HARDWARE_CHOICES[$(($answer-1))]} elif (echo -n $answer | grep -q -e "^[0-9][0-9]*$") then if [ $answer -le ${#LUNCH_HARDWARE_CHOICES[@]} ] then hardware=${LUNCH_HARDWARE_CHOICES[$(($answer-1))]} fi elif (echo -n $answer | grep -q -e "^[^\-][^\-]*-[^\-][^\-]*$") then echo echo "Invalid lunch STB: $answer" return 1 fi if [ "$3" ] ; then answer=$3 else // 如果用户没有输入第三个参数,打印项目选项菜单,供用户选择 print_lunch_project echo -n "Which would you like? [1] " read answer fi if [ -z "$answer" ] then answer=1 project=${LUNCH_PROJECT_CHOICES[$(($answer-1))]} elif (echo -n $answer | grep -q -e "^[0-9][0-9]*$") then if [ $answer -le ${#LUNCH_PROJECT_CHOICES[@]} ] then project=${LUNCH_PROJECT_CHOICES[$(($answer-1))]} fi elif (echo -n $answer | grep -q -e "^[^\-][^\-]*-[^\-][^\-]*$") then echo echo "Invalid lunch project: $answer" return 1 fi // 最后导出环境变量,后面整个编译系统都会用到这些变量 export TARGET_PRODUCT=$product export TARGET_BUILD_VARIANT=$variant export TARGET_BUILD_TYPE=release export DISPLAY_BUILD_NUMBER=true export BUILD_ID=$hardware export BUILD_NAME=$project echo // 设置环境变量 set_stuff_for_environment // 打印变量 printconfig }
最后我们来看下:set_stuff_for_environment 和
printconfig函数:
function set_stuff_for_environment() { settitle set_java_home setpaths set_sequence_number export ANDROID_BUILD_TOP=$(gettop) }
settitle就是export PROMPT_COMMAND="echo -ne [sabresd_6dq-eng]
user@hostname: /home/admin/android"
set_jave_home就是:export ${JAVA_HOME}
setpaths 设置一些基本路径
set_sequence_number就是:export BUILD_ENV_SEQUENCE_NUMBER=10
function printconfig() { T=$(gettop) if [ ! "$T" ]; then echo "Couldn't locate the top of the tree. Try setting TOP." >&2 return fi get_build_var report_config }
# Get the exact value of a build variable. function get_build_var() { T=$(gettop) if [ ! "$T" ]; then echo "Couldn't locate the top of the tree. Try setting TOP." >&2 return fi CALLED_FROM_SETUP=true BUILD_SYSTEM=build/core \ make --no-print-directory -C "$T" -f build/core/config.mk dumpvar-$1 }
所以最后调用的是:
make --no-print-directory
-C /home/admin/android
-f build/core/config.mk
dumpvar-report_config
CALLED_FROM_SETUP=true
BUILD_SYSTEM=build/core
下面进入build/core/config.mk里面:
include $(BUILD_SYSTEM)/envsetup.mk
include $(BUILD_SYSTEM)/dumpvar.mk
在envsetup.mk里面:
ifeq ($(PRINT_BUILD_CONFIG),)
PRINT_BUILD_CONFIG := true 默认都会true
endif
在dumpvar.mk里面:
如果没有dumpvar-report_config则不会PRINT_BUILD_CONFIG内容
ifneq ($(dumpvar_goals),report_config) PRINT_BUILD_CONFIG:= endif
ifneq ($(PRINT_BUILD_CONFIG),) $(info ============================================) $(info PLATFORM_VERSION_CODENAME=$(PLATFORM_VERSION_CODENAME)) $(info PLATFORM_VERSION=$(PLATFORM_VERSION)) $(info TARGET_PRODUCT=$(TARGET_PRODUCT)) $(info TARGET_BUILD_VARIANT=$(TARGET_BUILD_VARIANT)) $(info TARGET_BUILD_TYPE=$(TARGET_BUILD_TYPE)) $(info TARGET_BUILD_APPS=$(TARGET_BUILD_APPS)) $(info TARGET_ARCH=$(TARGET_ARCH)) $(info TARGET_ARCH_VARIANT=$(TARGET_ARCH_VARIANT)) $(info HOST_ARCH=$(HOST_ARCH)) $(info HOST_OS=$(HOST_OS)) $(info HOST_BUILD_TYPE=$(HOST_BUILD_TYPE)) $(info BUILD_ID=$(BUILD_ID)) $(info BUILD_NAME=$(BUILD_NAME)) $(info BUILD_NUMBER=$(BUILD_NUMBER)) $(info PRE_BUILD_NUMBER=$(PRE_BUILD_NUMBER)) $(info PRE_PRE_BUILD_NUMBER=$(PRE_PRE_BUILD_NUMBER)) $(info ============================================) endif