u-boot的配置過程分析2

1.頂層Makefile
        這裏我們將以smdk2410爲例來介紹,uboot是u-boot-2009.03,首先我們應該打開u-boot的頂層Makefile,這裏按照人的思維來說,我們應該首先去看看smdk2410的配置項:
smdk2410_config:

2830 smdk2410_config :       unconfig
2831         @$(MKCONFIG) $(@:_config=) arm arm920t smdk2410 samsung s3c24x0

關注2831行,瞭解Makefile語法的朋友一定對$(@:_config=)在做什麼很瞭解,其實它就是將$@即目標 smdk2410_config的後面的_config替換成空,所以結果就是'smdk2410',另外我們在搜索一下Makefile,就可以找到下面的語句:

106 SRCTREE         := $(CURDIR)
  ...
111 MKCONFIG        := $(SRCTREE)/mkconfig
112 export MKCONFIG

很明顯@$(MKCONFIG)就是當前目錄下面的mkconfig。所以執行上面的2831行其實就是執行./mkconfig smdk2410 arm arm920t smdk2410 samsung s3c24x0 ,ok到了這一步我們就應該去看看mkconfig。

2.mkconfig
        打開mkconfig,整個腳本很短,只有88行。

a.   我們應該先看看最上面的註釋:
  3 # Script to create header files and links to configure
  4 # U-Boot for a specific board.
  5 #
  6 # Parameters:  Target  Architecture  CPU  Board [VENDOR] [SOC]

        3,4行告訴你這個腳本的作用,6行介紹了它的參數的含義。

b. 接下來,獲得BOARD_NAME:
11 APPEND=no       # Default: Create new config file
12 BOARD_NAME=""   # Name to print in make output
13 
14 while [ $# -gt 0 ] ; do
15         case "$1" in
16         --) shift ; break ;;
17         -a) shift ; APPEND=yes ;;
18         -n) shift ; BOARD_NAME="${1%%_config}" ; shift ;;
19         *)  break ;;
20         esac
21 done
22 
23 [ "${BOARD_NAME}" ] || BOARD_NAME="$1"
24 
25 [ $# -lt 4 ] && exit 1
26 [ $# -gt 6 ] && exit 1
27 
28 echo "Configuring for ${BOARD_NAME} board..."

        14行,判斷參數的個數($#)是否大於零,之後判斷$1中有沒有-,有的話就左移一個位置,沒有就出來,很明顯參數中沒有帶-的,那麼就會執行到23行,&&相當於“if...then...”,而||相當於“if not...then...”,所以這裏就表示如果 BOARD_NAME爲空,就使 BOARD_NAME=$1,即 BOARD_NAME爲'smdk2410'.  25, 26行判斷參數的個數必須爲5,不然就退出。

c. 創建到平臺,開發板相關的頭文件的鏈接
30 #
31 # Create link to architecture specific headers
32 #
33 if [ "$SRCTREE" != "$OBJTREE" ] ; then
34         mkdir -p ${OBJTREE}/include
35         mkdir -p ${OBJTREE}/include2
36         cd ${OBJTREE}/include2
37         rm -f asm
38         ln -s ${SRCTREE}/include/asm-$2 asm
39         LNPREFIX="../../include2/asm/"
40         cd ../include
41         rm -rf asm-$2
42         rm -f asm
43         mkdir asm-$2
44         ln -s asm-$2 asm
45 else
46         cd ./include
47         rm -f asm
48         ln -s asm-$2 asm
49 fi
50 
51 rm -f asm-$2/arch
52 
53 if [ -z "$6" -o "$6" = "NULL" ] ; then
54         ln -s ${LNPREFIX}arch-$3 asm-$2/arch
55 else
56         ln -s ${LNPREFIX}arch-$6 asm-$2/arch
57 fi
58 
59 if [ "$2" = "arm" ] ; then
60         rm -f asm-$2/proc
61         ln -s ${LNPREFIX}proc-armv asm-$2/proc
62 fi

        33行判斷源碼目錄跟目標文件目錄是否一致,不一致的話就在目標文件目錄創建相關的文件和鏈接,這樣可以使源碼目錄保持乾淨,不過我們一般都是直接在源碼目錄進行編譯的,所以這裏執行的是 else後面的語句,46-48行,進入./include中,刪除掉原來的asm目錄,因爲可能你之前就已經編譯過了,然後再次建立asm,並讓它鏈接到asm-$2,這裏是連接到asm-arm。 
    之後51行刪除到asm-$2下面的arch,53行因爲$6爲s3c24x0,不爲空也不爲NULL,所以將會執行56行,而 LNPREFIX爲空,所以這句實際上執行的是“ln -s arch-$6 asm-$2/arch”,也就是創建asm-arm/arch ,並將其鏈接到arch-s3c24x0。
59-61行,如果$2=arm的話,重新建立一下asm-arm/proc目錄,並將它鏈接到 proc-armv。

d. 之後創建頂層Makefile包含的文件include/config.mk
64 #
65 # Create include file for Make
66 #
67 echo "ARCH   = $2" >  config.mk
68 echo "CPU    = $3" >> config.mk
69 echo "BOARD  = $4" >> config.mk
70 
71 [ "$5" ] && [ "$5" != "NULL" ] && echo "VENDOR = $5" >> config.mk
72 
73 [ "$6" ] && [ "$6" != "NULL" ] && echo "SOC    = $6" >> config.mk

    這幾句很簡單,就是創建config.mk,請注意,之前46行我們就已經在include目錄下面了,因此這幾行執行完成後,config.mk的內容就應該是下面的樣子:
ARCH            =     arm
CPU               =     arm920t
BOARD          =     smdk2410
VENDOR       =     samsung
SOC                     =     s3c24x0

e.  最後就開始創建include/config.h:
75 #
76 # Create board specific header file
77 #
78 if [ "$APPEND" = "yes" ]        # Append to existing config file
79 then
80         echo >> config.h
81 else
82         > config.h              # Create new config file
83 fi
84 echo "/* Automatically generated - do not edit */" >>config.h
85 echo "#include " >>config.h
86 echo "#include " >>config.h
87 
88 exit 0

    上面的代碼很好理解,首先因爲之前APPEND=no,所以我們就會執行82行,創建一個config.h文件,然後84-86行將一個註釋和兩個頭文件寫入config.h中。

         到這裏這個mkconfig文件就完了,這裏我稍微小結一下這個文件所做的工作,不然頭會有點暈:
        (1).   BOARD_NAME='smdk2410'
        (2).   ln -s asm-arm asm
                 ln -s arch-s3c24x0 asm-arm/arch
                 ln -s proc-armv asm-arm/proc
        (3).   創建include/config.mk
        (4).   創建include/config.h

    到了這裏我們就已經可以算是配置完成了,爲什麼了?請注意最後生成的include/config.h之中包含了兩個頭文件,對於2410來說的這兩個頭文件就是config/smdk2410.h,以及asm/config.h(asm-arm/config.h), 如果你打開這兩個文件就會發現很多CONFIG_的宏定義(當然 asm-arm/config.h沒有定義任何東西,但是在其他平臺的這個文件中就有一些宏定義了)。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章