腳本功能:根據腳本開頭註釋可知,該腳本針對指定單板,創建一些頭文件和相關鏈接用於配置u-boot,是編譯Uboot的第一個步驟,make smdk2410_config就執行該腳本
腳本參數:Target Architecture CPU Board [VENDOR] [SOC]
根據uboot的Makefile可知,當執行./mkconfig時,傳入的參數分別對應爲
Target -- smdk2410
Architecture – arm
CPU -- arm920t
Board -- smdk2410
VENDOR -- NULL 按廠商劃分(如AT9200、S3C44B0等)
SOC -- s3c24x0
爲何要編制該腳本文件:因爲uboot是一個多CPU多架構的統一bootloader,爲了完成針對特定目標單板,目標架構的編譯,需要給Makefile指明,哪些文件需要編譯,相當與從整體上控制需要編譯的cpu,單板等
代碼分析
#!/bin/sh –e //指定執行該腳本所使用的解釋器, -e相當於/bin/bash
11 APPEND=no #缺省創建一個新的配置文件
12 BOARD_NAME=”” #make 執行smdk2410_config的時候打印輸出單板名
14 while [ $# -gt 0 ] ; do //當參數數量大於0,做一下判斷
15 case “$1” in //判斷第一個參數
16 --) shift ; break ;; //-- 所有參數左移,不包括$0,$0是命令名
17 -a) shift ; APPEND=YES ;; //-a, APPEND變量賦值yes,不生成新的config.h
18 -n) shift ; BOARD_NAME=”$(1%%_config)” ; shift ;;
19 *) break ;;
20 esac
21 done
$(1%%_config)原形爲$(string%%substring),從string的右側刪除掉最後匹配substring的字符串
如果我們編譯的是smdk2410單板,以上條件不滿足,則退出while循環
23 [ “${BOARD_NAME}” ] || BOARD_NAME=”$1” //如果BOARD_NAME非空,則什麼也不做,否則將參數1賦值給BOARD_NAME,或表示,前面如果爲真,則不執行後面操作,如果爲假,則執行或後面的代碼
25 [ $# -lt 4 ] && exit 1 //如果參數數量小於4,則退出
26 [ $# -gt 6 ] && exit 1 //如果參數數量大於6,則退出
28 echo "Configuring for ${BOARD_NAME} board..." //輸出單板名,如果沒有名字,則表明沒有此單板
//以下的代碼,是該腳本的核心,主要在目標文件下創建一些指向架構頭文件的鏈接
33 if [ “$SRCTREE” != “$OBJTREE” ] ; then
34 mkdir –p ${OBJTREE}/include 在目標目錄下創建include文件夾
35 mkdir –p ${OBJTREE}/include2 在目標目錄下創建include2文件夾
36 cd ${OBJTREE}/include2 進入include2
37 rm –f asm 刪除asm鏈接
38 ln –s ${SRCTREE}/include/asm-$2 asm 創建asm鏈接,指向源目錄下include/asm-arm
39 LNPREFIX="../../include2/asm/" 賦值
40 cd ../include //進入目標目錄下的include目錄
41 rm –rf asm-$2 //刪除asm-arm
42 rm –f asm //刪除asm
43 mkdir asm-$2 //創建asm-arm
44 ln –s asm-$2 asm //創建asm軟連接指向當前目錄的asm-arm
45 else
46 cd ./include //如果資源目錄和目標目錄是同一路徑,則只創建指向asm-arm的軟連接
47 rm –f asm
48 ln –s asm-$2 asm
49 fi
51 rm -f asm-$2/arch
//如果$6(即SOC)爲0或者爲NULL,-o意味或的意思,在目標目錄的Include下創建軟鏈接arm-arm/arch指向${LNPREFIX}arch-$3,否則指向${LNPREFIX}arch-soc24x0
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
59 if [ "$2" = "arm" ] ; then
60 rm -f asm-$2/proc
61 ln -s ${LNPREFIX}proc-armv asm-$2/proc
62 fi
最終目標目錄下的軟鏈接創建就是在Include下創建了asm
asm指向目標路徑下的include下的/asm-arm,而asm-arm下也有2個軟鏈接,分別指向include2/asm/arch-s3c24x0 和proc-armv,最終就是在目標路徑下的include下創建一個和資源路徑下include一樣的路徑,只是裏面都是一些軟鏈接
//創建config.mk
67 echo "ARCH = $2" > config.mk
68 echo "CPU = $3" >> config.mk
69 echo "BOARD = $4" >> config.mk
71 [ "$5" ] && [ "$5" != "NULL" ] && echo "VENDOR = $5" >> config.mk
73 [ "$6" ] && [ "$6" != "NULL" ] && echo "SOC = $6" >> config.mk
創建單板指定的頭文件config.h
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 "" >>config.h
85 echo "#include <configs/$1.h>" >>config.h //創建的config.h,包含<configs/smdk2410.h>
//這種方式在多目標項目中經常使用,對用戶來說,頭文件只需要包含config.h(腳本動態生成),具體包含的是哪一個單板的config.h.由編譯時指定
87 exit 0 //腳本正常退出
mkconfig腳本文件的目的就是在目標路徑下創建一個源文件路徑下include下的一個鏡像
目標路徑 源文件路徑
include/asm-arm include/asm-arm
include/asm-arm/arch include/asm-arm/arch-s3c24x0
include/asm-arm/proc include/asm-arm/proc-armv
include/config.h include/configs/smdk2410.h
include/asm -> include/asm-arm
之所以目標路徑下多了Include2是爲了編寫腳本方便,一切鏈接都是通過
LNPREFIX(../../include2/asm/)指向源文件路徑下的/include/asm-arm,這樣,以後如果源文件路徑有改動,則只需要修改腳本下的LNPREFIX即可