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沒有定義任何東西,但是在其他平臺的這個文件中就有一些宏定義了)。
u-boot的配置過程分析2
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.