1. 程式人生 > >三、u-boot 的配置-mkconfig 腳本

三、u-boot 的配置-mkconfig 腳本

nbsp echo 鏈接 後退 pre AR 包含 共創 編譯過程

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 腳本