Android Donut Makefile分析之一 (build/envsetup.sh)

转自:http://home.lupaworld.com/home-space-uid-131820-do-blog-id-149463.html

build/envsetup.sh 脚本主体部分


看源代码之前需要了解代码分布和结构,分析Makefile应该是最好的方法。在Blog记录之以备以后查看,也供有兴趣朋友参考。

在编译donut之前,需要运行

cd ~/mydroid
. build/envsetup.sh
lunch aosp_dream_us-eng
make

build/envsetup.sh 是编译android的入口。该shell脚本定义了一些函数,并设定了编译的环境变量。

lunch aosp_dream_us-eng 配置用户需要编译的目标产品(target product)和变体(variant)。

aosp_dream_us-eng 字符串包含了target product  和variant,它们用减号-隔开,aosp_dream_us是target product,eng是variant。

variant 有三种选择user userdebug eng,可以从字面上看出其意义,但具体的差别还不是特别清楚,待后面分析之。

lunch 的入口是让用户指定或者选择需要编译的target product 和 variant,出口是设定编译相关的环境变量。

build/envsetup.sh 定义了很多函数,并且执行的脚本很分散,因此下面将所有的函数都删除掉了,剩余下脚本的主体,便于代码分析和走读。

该主体主要做的事情是:

1. 首先脚本设定了两个缺省的target product,一个是generic-eng,一个是simulator

2. 运行所有vendor下的 vendorsetup.sh文件,在google官方的 donut源代码中,为vendor/aosp/vendorsetup.sh,内容如下:

add_lunch_combo aosp_emulator_us-eng
add_lunch_combo aosp_emulator_eu-eng
add_lunch_combo aosp_dream_us-userdebug
add_lunch_combo aosp_dream_eu-userdebug
add_lunch_combo aosp_dream_us-eng
add_lunch_combo aosp_dream_eu-eng
add_lunch_combo aosp_sapphire_us-userdebug
add_lunch_combo aosp_sapphire_eu-userdebug
add_lunch_combo aosp_sapphire_us-eng
add_lunch_combo aosp_sapphire_eu-eng

可以看出,又添加了一些 和 aosp 相关的 target product 和 variant。

下面是脚本主体,用蓝色添加了一下注释,便于阅读:

# 定义了 variant的字符范围
VARIANT_CHOICES=(user userdebug eng)

# 如果是Linux环境,定义了几个和simulator相关的函数
case `uname -s` in
    Linux)
        function choosesim()
        {
            echo "Build for the simulator or the device?"
            echo "     1. Device"
            echo "     2. Simulator"
            echo

            export TARGET_SIMULATOR=
            local ANSWER
            while [ -z $TARGET_SIMULATOR ]
            do
                echo -n "Which would you like? [1] "
                if [ -z "$1" ] ; then
                    read ANSWER
                else
                    echo $1
                    ANSWER=$1
                fi
                case $ANSWER in
                "")
                    export TARGET_SIMULATOR=false
                    ;;
                1)
                    export TARGET_SIMULATOR=false
                    ;;
                Device)
                    export TARGET_SIMULATOR=false
                    ;;
                2)
                    export TARGET_SIMULATOR=true
                    ;;
                Simulator)
                    export TARGET_SIMULATOR=true
                    ;;
                *)
                    echo
                    echo "I didn't understand your response.  Please try again."
                    echo
                    ;;
                esac
                if [ -n "$1" ] ; then
                    break
                fi
            done

            set_stuff_for_environment
        }
        ;;
    *)
        function choosesim()
        {
            echo "Only device builds are supported for" `uname -s`
            echo "     Forcing TARGET_SIMULATOR=false"
            echo
            if [ -z "$1" ]
            then
                echo -n "Press enter: "
                read
            fi

            export TARGET_SIMULATOR=false
            set_stuff_for_environment
        }
        ;;
esac


# 首先将 LUNCH_MENU_CHOICES 变量消除
# 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         


# 当前 LUNCH_MENU_CHOICES = generic-eng
# add the default one here
add_lunch_combo generic-eng        


# 当前 LUNCH_MENU_CHOICES = generic-eng simulator
# if we're on linux, add the simulator.  There is a special case
# in lunch to deal with the simulator
if [ "$(uname)" = "Linux" ] ; then   
    add_lunch_combo simulator      
fi


# 这里是MAC OS的环境,不考虑
case `uname -s` in 
    Darwin)
        function mgrep()
        {
            find -E . -type f -iregex '.*/(Makefile|Makefile\..*|.*\.make|.*\.mak|.*\.mk)' -print0 | xargs -0 grep --color -n "$@"
        }

        function treegrep()
        {
            find -E . -type f -iregex '.*\.(c|h|cpp|S|java|xml)' -print0 | xargs -0 grep --color -n -i "$@"
        }

        ;;
    *)
        function mgrep()
        {
            find . -regextype posix-egrep -iregex '(.*\/Makefile|.*\/Makefile\..*|.*\.make|.*\.mak|.*\.mk)' -type f -print0 | xargs -0 grep --color -n "$@"
        }

        function treegrep()
        {
            find . -regextype posix-egrep -iregex '.*\.(c|h|cpp|S|java|xml)' -type f -print0 | xargs -0 grep --color -n -i "$@"
        }

        ;;
esac


# 设定当前shell环境的数组下标从0开始还是1开始,并记录在 _arrayoffset
# determine whether arrays are zero-based (bash) or one-based (zsh)
_xarray=(a b c)
if [ -z "${_xarray[${#_xarray[@]}]}" ]
then
    _arrayoffset=1
else
    _arrayoffset=0
fi
unset _xarray


# 运行所有vendor下的 vendorsetup.sh文件
#存在vendor/aosp/vendorsetup.sh
当前 LUNCH_MENU_CHOICES = 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-eng

# Execute the contents of any vendorsetup.sh files we can find.
for f in `/bin/ls vendor/*/vendorsetup.sh vendor/*/build/vendorsetup.sh 2> /dev/null`
do
    echo "including $f"
    . $f
done
unset f

你可能感兴趣的:(android,linux,function,脚本,makefile,menu)