build/envsetup.sh 脚本分析(lunch函数)
lunch函数提供了一个菜单,让开发人员选择需要编译的目标产品(target product)和变体(variant),并做一些检查,设置环境变量,并打印出主要的环境变量。
直接运行lunch(必须先运行 build/envsetup.sh,让lunch函数驻留到环境变量中)
ning@ning-desktop:~/donut-compare/mydroid$ lunch
You're building on Linux
generic-eng simulator aosp_emulator_us-eng aosp_emulator_eu-eng aosp_dream_us-userdebug aosp_dream_eu-userdebug aosp_dream_us-eng aosp_dream_eu-eng aosp_sapphire_us-userdebug aosp_sapphire_eu-userdebug aosp_sapphire_us-eng aosp_sapphire_eu-engLunch menu... pick a combo: 1. generic-eng 2. simulator 3. aosp_emulator_us-eng 4. aosp_emulator_eu-eng 5. aosp_dream_us-userdebug 6. aosp_dream_eu-userdebug 7. aosp_dream_us-eng 8. aosp_dream_eu-eng 9. aosp_sapphire_us-userdebug 10. aosp_sapphire_eu-userdebug 11. aosp_sapphire_us-eng 12. aosp_sapphire_eu-eng
Which would you like? [generic-eng] 7
============================================PLATFORM_VERSION_CODENAME=RELPLATFORM_VERSION=1.6TARGET_PRODUCT=aosp_dream_usTARGET_BUILD_VARIANT=engTARGET_SIMULATOR=falseTARGET_BUILD_TYPE=releaseTARGET_ARCH=armHOST_ARCH=x86HOST_OS=linuxHOST_BUILD_TYPE=releaseBUILD_ID=Donut============================================
用户也可以直接输入参数,不使用菜单
ning@ning-desktop:~/donut-compare/mydroid$ lunch aosp_dream_us-eng
============================================PLATFORM_VERSION_CODENAME=RELPLATFORM_VERSION=1.6TARGET_PRODUCT=aosp_dream_usTARGET_BUILD_VARIANT=engTARGET_SIMULATOR=falseTARGET_BUILD_TYPE=releaseTARGET_ARCH=armHOST_ARCH=x86HOST_OS=linuxHOST_BUILD_TYPE=releaseBUILD_ID=Donut============================================
下面是lunch函数源代码,用蓝色添加了一下注释,便于阅读:
function lunch(){ local answer
if [ "$1" ] ; then # lunch后面直接带参数 answer=$1 else # lunch后面不带参数,则打印处所有的target product和variant菜单提供用户选择 print_lunch_menu echo -n "Which would you like? [generic-eng] " read answer fi
local selection=
if [ -z "$answer" ] then # 如果用户在菜单中没有选择,直接回车,则为系统缺省的generic-eng selection=generic-eng elif [ "$answer" = "simulator" ] then # 如果是模拟器 selection=simulator elif (echo -n $answer | grep -q -e "^[0-9][0-9]*$") then # 如果answer是选择菜单的数字,则获取该数字对应的字符串 if [ $answer -le ${#LUNCH_MENU_CHOICES[@]} ] then selection=${LUNCH_MENU_CHOICES[$(($answer-$_arrayoffset))]} fi # 如果 answer字符串匹配 *-*模式(*的开头不能为-) elif (echo -n $answer | grep -q -e "^[^\-][^\-]*-[^\-][^\-]*$") then selection=$answer fi
if [ -z "$selection" ] then echo echo "Invalid lunch combo: $answer" return 1 fi
# special case the simulator if [ "$selection" = "simulator" ] then # 模拟器模式 export TARGET_PRODUCT=sim export TARGET_BUILD_VARIANT=eng export TARGET_SIMULATOR=true export TARGET_BUILD_TYPE=debug else
# 将 product-variant模式种的product分离出来 local product=$(echo -n $selection | sed -e "s/-.*$//")
# 检查之,调用关系 check_product()->get_build_var()->build/core/config.mk比较罗嗦,不展开了 check_product $product if [ $? -ne 0 ] then echo echo "** Don't have a product spec for: '$product'" echo "** Do you have the right repo manifest?" product= fi
# 将 product-variant模式种的variant分离出来 local variant=$(echo -n $selection | sed -e "s/^[^\-]*-//")
# 检查之,看看是否在 (user userdebug eng) 范围内 check_variant $variant 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
export TARGET_PRODUCT=$product export TARGET_BUILD_VARIANT=$variant export TARGET_SIMULATOR=false export TARGET_BUILD_TYPE=release fi # !simulator
echo
# 设置到环境变量,比较多,不再一一列出,最 简单的方法 set >env.txt 可获得 set_stuff_for_environment # 打印一些主要的变量, 调用关系 printconfig()->get_build_var()->build/core/config.mk->build/core/envsetup.mk 比较罗嗦,不展开了 printconfig}