u-boot下mkconfig腳本文件分析(轉)

腳本功能:根據腳本開頭註釋可知,該腳本針對指定單板,創建一些頭文件和相關鏈接用於配置u-boot,是編譯Uboot的第一個步驟,make smdk2410_config就執行該腳本

腳本參數:Target Architecture CPU Board [VENDOR] [SOC]
  
根據ubootMakefile可知,當執行./mkconfig時,傳入的參數分別對應爲
   Target --   smdk2410
   Architecture –  arm
   CPU --    arm920t
   Board --   smdk2410
   VENDOR --  NULL  
按廠商劃分(如AT9200S3C44B0等)
   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即可

 

 

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