OpenWrt編譯系統(1)之make之前
OpenWrt的編譯系統負責編譯出可以最終燒錄的img檔案。由於全志的Tina採用的是OpenWrt編譯系統,所以這個系列以Tina編譯為例進行分析。
在make之前,需要設定環境變數,用到的命令是:
source build/envsetup.sh lunch
這兩條命令幹了什麼?怎麼做的?
開啟build/envsetup.sh指令碼,發現這個指令碼幾乎全部是一些命令,如mm、mmm、cgrep、jgrep等(做過Android系統開發的對這些肯定相當眼熟了)。不錯,OpenWrt用的和Android類似的編譯系統。
關於這些命令的作用和實現方式,這裡不作解釋,只看下envsetup.sh指令碼中最後幾行:
if [ "x$SHELL" != "x/bin/bash" ]; then case `ps -o command -p $$` in *bash*) ;; *) echo "WARNING: Only bash is supported, use of other shell would lead to erroneous results" ;; esac fi # Execute the contents of any vendorsetup.sh files we can find. for f in `test -d target && find -L target -maxdepth 4 -name 'vendorsetup.sh' | sort 2> /dev/null` do echo "including $f" . $f done unset f
SHELL是Linux的一個環境變數,指定開啟終端時啟用的預設shell,以Ubuntu 14.04為例:
$ echo $SHELL /bin/bash
所以第一行就是用來判定當前系統shell是不是bash,如果不是通過"ps -o command -p $$"檢視當前shell的名稱。
"ps -o command -p $$"解釋:
--$$:shell本身的pid,示例:
$ ps -p $$ PID TTY TIME CMD 62208 pts/0 00:00:00 bash
---o command:ps命令的-o引數允許使用者指定顯示資訊的格式,command指示只顯示CMD對應的資訊,這裡就是"bash"。
我們完整執行下"ps -o command -p $$"這個命令串:
$ ps -o command -p $$ COMMAND bash
至此,shell檢測完成。
接下來的for迴圈載入target目錄下的所有vendorsetup.sh指令碼,實現步驟:
"test -d target":當前目錄下存在target且是一個目錄
"find -L target -maxdepth 4 -name 'vendorsetup.sh'":在target目錄下查詢"vendorsetup.sh"檔案
". $f":載入並執行對應的"vendorsetup.sh"檔案,我們看下/target/allwinner/astar_parrot/目錄下一個"vendorsetup.sh"檔案內容:
add_lunch_combo astar_parrot-tina
add_lunch_combo是envsetup.sh中的一個命令函式,用來新增一個方案,函式實現:
# 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 fi done LUNCH_MENU_CHOICES=(${LUNCH_MENU_CHOICES[@]} $new_combo) }
shell陣列的知識:
1、陣列用括號來表示,元素用"空格"符號分割開,語法格式如下:array_name=(value1 ... valuen)
2、讀取陣列元素值的一般格式是:${array_name[index]}
3、@ 或 * 可以獲取陣列中的所有元素,例如:${my_array[*]}或${my_array[@]}
4、獲取陣列元素個數:${#my_array[*]}或${#my_array[@]}
至此,上述add_lunch_combo函式就明瞭了哈。
最後,lunch函式用來遍歷add_lunch_combo新增的所有方案,並提供使用者選擇的互動口。
接下來分析下lunch函式實現細節。