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:
12 board_name="" # name to print in make output
13 14 while [ $# -gt 0 ] ; do
15 case "$1" in
16 --) shift ; break ;;
18 -n) shift ; board_name="$" ; shift ;;
19 *) break ;;
20 esac
21 done
22 23 [ "$" ] || board_name="$1"
24 25 [ $# -lt 4 ] && exit 1
26 [ $# -gt 6 ] && exit 1
27 28 echo "configuring for $ 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 $/include
35 mkdir -p $/include2
36 cd $/include2
37 rm -f asm
38 ln -s $/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 $arch-$3 asm-$2/arch
55 else
56 ln -s $arch-$6 asm-$2/arch
57 fi
58 59 if [ "$2" = "arm" ] ; then
60 rm -f asm-$2/proc
61 ln -s $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 #
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
到這裡這個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沒有定義任何東西,但是在其他平台的這個檔案中就有一些巨集定義了)。
uboot配置過程詳解
當我們在編譯uboot的時候,要分為兩個階段,乙個階段是配置,配置用的命令是make x210 sd config。配置完成後開始正式的編譯,命令為make,當然,編譯命令可以加什麼的引數,比如多執行緒編譯 make j4,比如靜默編譯 make s等。在這一篇文章中,我將單獨詳細分析uboot的配...
uboot學習 配置過程分析
一 uboot的功能分析 結合uboot 1.1.16版本說明uboot的配置過程。二 uboot的配置 編譯和鏈結過程分析 結合頂層makefile 編譯乙個可用的uboot.bin檔案一般經過以下步驟 首先是配置,make smdk2410 config,然後是make all完成編譯,最後生成...
uboot配置過程詳解1
1 mkconfig指令碼的6個引數 config arm s5pc11x x210 samsung s5pc110 指的是目標 x210 sd config裡的 config部分用空替換,得到 x210 sd,這就是第乙個引數,所以 1 x210 sd 2 arm 3 s5pc11x 4 sams...