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 命令执行结束,但该脚本中的内容在后面的命令中还大有用处,后面还会再提到。