三、u-boot 的配置-mkconfig 腳本
3.1 mkconfig 腳本
1 100ask24x0_config : unconfig 2 @$(MKCONFIG) $(@:_config=) arm arm920t 100ask24x0 NULL s3c24x0
3.1.1 mkconfig腳本的6個參數
@$(MKCONFIG) $(@:_config=) arm arm920t 100ask24x0 NULL s3c24x0
這個意思就是 執行 mkconfig 腳本,將 100ask24x0_config 中的 _config 用空格代替,然後,將後面的6個參數傳入進腳本中執行
$@ 為自動變量
代碼 14 到 21 行:
1 while [ $# -gt 0 ] ; do 2 case "$1" in 3 --) shift ; break ;; 4 -a) shift ; APPEND=yes ;; 5 -n) shift ; BOARD_NAME="${1%%_config}" ; shift ;; 6 *) break ;; 7 esac 8 done
一開始就進入 while 循環中執行,判斷條件是 $# > 0,則執行循環,$# 為6,然後根據 $1 的參數進行執行,$1=100ask24x0,只匹配到 * ,則執行 break 語句,跳出 while 循環
代碼 23 行
1 [ "${BOARD_NAME}" ] || BOARD_NAME="$1"
如果 BOARD_NAME 為真,則後面的不執行,為假,則執行 BOARD_NAME="$1",即此時 BOARD_NAME= 100ask24x0
代碼 25 26 行
1 [ $# -lt 4 ] && exit 1 2 [ $# -gt 6 ] && exit 1
如果$#小於4,則exit 1(mkconfig腳本返回1),即退出
如果$#大於6,則也返回1.
所以:mkconfig腳本傳參只能是4、5、6,如果大於6或者小於4都不行。
3.1.2 創建符號鏈接
代碼30 到 62 行都在創建符號鏈接
1 # 2 # Create link to architecture specific headers 3 # 4 if [ "$SRCTREE" != "$OBJTREE" ] ; then 5 mkdir -p ${OBJTREE}/include 6 mkdir -p ${OBJTREE}/include2 7 cd ${OBJTREE}/include2 8 rm -f asm 9 ln -s ${SRCTREE}/include/asm-$2 asm 10 LNPREFIX="../../include2/asm/" 11 cd ../include 12 rm -rf asm-$2 13 rm -f asm 14 mkdir asm-$2 15 ln -s asm-$2 asm 16 else 17 cd ./include 18 rm -f asm 19 ln -s asm-$2 asm 20 fi 21 22 rm -f asm-$2/arch 23 24 if [ -z "$6" -o "$6" = "NULL" ] ; then 25 ln -s ${LNPREFIX}arch-$3 asm-$2/arch 26 else 27 ln -s ${LNPREFIX}arch-$6 asm-$2/arch 28 fi 29 30 if [ "$2" = "arm" ] ; then 31 rm -f asm-$2/proc 32 ln -s ${LNPREFIX}proc-armv asm-$2/proc 33 fi
為什麽要創建符號鏈接?這些符號鏈接文件的存在就是整個配置過程的核心,這些符號鏈接文件(文件夾)的主要作用是給頭文件包含等過程提供指向性連接。根本目的是讓uboot具有可移植性。
uboot可移植性的實現原理:在uboot中有很多彼此平行的代碼,各自屬於各自不同的架構/CPU/開發板,我們在具體到一個開發板的編譯時用符號連接的方式提供一個具體的名字的文件夾供編譯時使用。這樣就可以在配置的過程中通過不同的配置使用不同的文件,就可以正確的包含正確的文件。
- 代碼過程
- 首先判斷根目錄和輸出目錄是否是一致的,是則執行 then 中的語句,不是則執行else 中的語句。不分析 then 後的語句,分析else 後的語句,在include目錄下創建asm文件,指向asm-arm
- 刪除 asm-arm/arch 文件
- 執行第二各 if 語句,判斷條件是如果$6字符串為0 或者 $6 為 NULL,則執行then後語句,將 ./include/asm-arm/arch 文件鏈接到在include/asm-arm/arm920t。;否則,執行else語句,將./include/asm-arm/arch 文件鏈接到./include/asm-arm/arch-s3c24x0
- 執行第三個 if 語句,判斷條件是 $2 為 arm 執行語句,刪除 ./include/asm-arm/proc 文件, ./include/asm-arm/proc 文件鏈接到 ./include/asm-arm/proc-armv 文件
總結:一共創建了4個符號鏈接。這4個符號鏈接將來在寫代碼過程中,頭文件包含時非常有用。譬如一個頭文件包含可能是:#include <asm/xx.h>
3.1.3 ./include/config.mk文件創建
代碼 64 到 73 行
1 # 2 # Create include file for Make 3 # 4 echo "ARCH = $2" > config.mk 5 echo "CPU = $3" >> config.mk 6 echo "BOARD = $4" >> config.mk 7 8 [ "$5" ] && [ "$5" != "NULL" ] && echo "VENDOR = $5" >> config.mk 9 10 [ "$6" ] && [ "$6" != "NULL" ] && echo "SOC = $6" >> config.mk
將 ARCH = arm CPU = arm920t BOARD = 100ask24x0 SOC = s3c24x0 寫入 ./include/config.mk 中
這裏就是 創建了 include/config.mk 了文件,創建include/config.mk文件是為了讓主Makefile在第117 行去包含的。
代碼 75 到 最後一行
1 # 2 # Create board specific header file 3 # 4 if [ "$APPEND" = "yes" ] # Append to existing config file 5 then 6 echo >> config.h 7 else 8 > config.h # Create new config file 9 fi 10 echo "/* Automatically generated - do not edit */" >>config.h 11 echo "#include <configs/$1.h>" >>config.h 12 13 exit 0
如果 APPEND 為 yes,則將新內容追加到 config.h 中,否則 創建一個 config.h 文件
最後是 打印兩行內容,追加到 config.h 中,執行成功後退出。
include/config.h文件裏面的內容就一行#include <configs/100ask_24x0.h>,這個頭文件是我們移植100ask_24x0(JZ2440)開發板時,對開發板的宏定義配置文件。這個文件是我們移植JZ2440時最主要的文件。
100ask_24x0.h 文件會被用來生成一個autoconfig.mk文件,這個文件會被主Makefile引入,指導整個編譯過程。這裏面的這些宏定義會影響我們對uboot中大部分.c文件中一些條件編譯的選擇。從而實現最終的可移植性。
理解這些腳本時,時刻要註意自己當前所處的路徑。
3.2 註意
註意:uboot的整個配置過程,很多文件之間是有關聯的(有時候這個文件是在那個文件中創建出來的;有時候這個文件被那個文件包含進去;有時候這個文件是由那個文件的內容生成的決定的)
註意:uboot中配置和編譯過程,所有的文件或者全局變量都是字符串形式的(不是指的C語言字符串的概念,指的是都是字符組成的序列)。這意味著我們整個uboot的配置過程都是字符串匹配的,所以一定要細節,註意大小寫,要註意不要輸錯字符,因為一旦錯一個最後會出現一些莫名其妙的錯誤,很難排查,這個是uboot移植過程中新手來說最難的地方。
三、u-boot 的配置-mkconfig 腳本