编译cubieboard android 源码过程详解之(二):source build/envsetup.sh

时间:2022-01-14 04:38:25

2014-02-26

这是最先要做的一步,主要是做编译之前的配置。

旅程开始:从哪里开始?

首先要找到该脚本从哪里开始执行,如果你使用的编辑器支持代码折叠和symbles浏览,那么这件事情就比较简单。

代码折叠后,看一下脚本的整体结构,可以发现基本全是函数,期间零星分散着一些变量的设置。函数是要被调用的,

自然不会从函数开始。直到最后才发现函数调用:

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

这段代码做了什么呢:

将 “vendor/*/”、“vendor/*/*/”、“device/*/*/”目录下名为“vendorsetup.sh”的脚本包含进来。

如果你在shell里实际试一下这段代码,就会发现很多脚本都会被包含进来。难道是一个无底洞?不要忘记出发是为了什么,我们分析脚本更多是为了开发自己的产品,因此只要分析和自己开发的产品相关的脚本就行了。何况以上每个脚本所做的应该是类似的事情。所以对作者来说,下面几个才是需要分析的:

device/softwinner/apollo-cubieboard/vendorsetup.sh
device/softwinner/common/vendorsetup.sh

旅程继续

device/softwinner/apollo-cubieboard/vendorsetup.sh

这个脚本中都是函数,其中对于cubieboard来说,较重要的是 extract-bsp 和 pack,后面会提到。

device/softwinner/common/vendorsetup.sh

这个脚本中只有一行:

add_lunch_combo apollo_cubieboard-eng

功能是添加产品配置,会出现在lunch命令的产品列表中。add_lunch_combo函数定义于build/envsetup.sh,代码如下:

function add_lunch_combo()
{
    local new_combo=$1
    local c
    for c in ${LUNCH_MENU_CHOICES[@]} ; do #{LUNCH_MENU_CHOICES[@]}表示取出数组中所有的元素
        if [ "$new_combo" = "$c" ] ; then
            return
        fi
    done
    LUNCH_MENU_CHOICES=(${LUNCH_MENU_CHOICES[@]} $new_combo) #添加新的产品
}

 

旅程结束

addcompletions

通过symbles浏览功能,定位到这个函数,内容如下:

function addcompletions()
{
    local T dir f

    # Keep us from trying to run in something that isn't bash.
    if [ -z "${BASH_VERSION}" ]; then
        return
    fi 

    # Keep us from trying to run in bash that's too old.
    if [ ${BASH_VERSINFO[0]} -lt 3 ]; then
        return
    fi

    dir="sdk/bash_completion"
    if [ -d ${dir} ]; then
        for f in `/bin/ls ${dir}/[a-z]*.bash 2> /dev/null`; do
            echo "including $f"
            . $f
        done
    fi
}
这个函数将“
sdk/bash_completion”目录下的脚本包含进来,为bash提供自定义自动补全。
 

至此,source build/envsetup.sh  命令执行结束,但该脚本中的内容在后面的命令中还大有用处,后面还会再提到。