x210_sd_config : unconfig @$(MKCONFIG) $(@:_config=) arm s5pc11x x210 samsung s5pc110 @echo "TEXT_BASE = 0xc3e00000" > $(obj)board/samsung/x210/config.mk
$@--目標文件(x210_sd_config)的_config用空格來代替(=(空)),所以第一個變量就變成x210_sd
Makefile有三個非常有用的變量。分別是$@,$^,$<代表的意義分別是:
$@--目標文件,$^--所有的依賴文件,$<--第一個依賴文件。
以下為mkconfig的源碼解釋
APPEND=no # Default: Create new config file進來先定義2個變量
BOARD_NAME="" # Name to print in make output while [ $# -gt 0 ] ; do case "$1" in --) shift ; break ;; -a) shift ; APPEND=yes ;; -n) shift ; BOARD_NAME="${1%%_config}" ; shift ;; *) break ;; esac done
// $#這里等於6 因為調用config這個配置的時候傳了6個參數分別為$1= x210_sd、$2=arm、$3=s5pc11x、$4=x210、$5=samsumg、$6=s5pc110、
$1(x210_sd)傳進去用switch語句來判斷是哪個case,在腳本里case 是會自動跳出的,如果加了break表示跳出while循環,且*表示任何情況。
[ "${BOARD_NAME}" ] || BOARD_NAME="$1"
可以理解為簡列的if語句,如果${BOARD_NAME}成立BOARD_NAME=“$1"就不執行,則反。其實就是看BOARD_NAME變量是否有值,如果有值就維持不變;如果無值就給他賦值為$1,實際分析結果:BOARD_NAME=x210_sd,前面剛開始定義變量就已經賦空了(BOARD_NAME="")。
[ $# -lt 4 ] && exit 1 //if($#<4) return 1 [ $# -gt 6 ] && exit 1 //if($#>6) return 1 echo "Configuring for ${BOARD_NAME} board..."
傳參的時候只能4、5、6個參數
# 創建符號鏈接 # Create link to architecture specific headers # if [ "$SRCTREE" != "$OBJTREE" ] ; then mkdir -p ${OBJTREE}/include mkdir -p ${OBJTREE}/include2 cd ${OBJTREE}/include2 rm -f asm ln -s ${SRCTREE}/include/asm-$2 asm LNPREFIX="../../include2/asm/" cd ../include rm -rf asm-$2 rm -f asm mkdir asm-$2 ln -s asm-$2 asm else cd ./include rm -f asm ln -s asm-$2 asm fi rm -f asm-$2/arch if [ -z "$6" -o "$6" = "NULL" ] ; then ln -s ${LNPREFIX}arch-$3 asm-$2/arch else ln -s ${LNPREFIX}arch-$6 asm-$2/arch fi # create link for s3c24xx SoC if [ "$3" = "s3c24xx" ] ; then rm -f regs.h ln -s $6.h regs.h rm -f asm-$2/arch ln -s arch-$3 asm-$2/arch fi # create link for s3c64xx SoC if [ "$3" = "s3c64xx" ] ; then rm -f regs.h ln -s $6.h regs.h rm -f asm-$2/arch ln -s arch-$3 asm-$2/arch fi # create link for s5pc1xx SoC if [ "$3" = "s5pc1xx" ] ; then rm -f regs.h ln -s $6.h regs.h rm -f asm-$2/arch ln -s arch-$3 asm-$2/arch fi # create link for s5pc11x SoC if [ "$3" = "s5pc11x" ] ; then rm -f regs.h ln -s $6.h regs.h rm -f asm-$2/arch ln -s arch-$3 asm-$2/arch fi # create link for s5p64xx SoC if [ "$3" = "s5p64xx" ] ; then rm -f regs.h ln -s $6.h regs.h rm -f asm-$2/arch ln -s arch-$3 asm-$2/arch fi # create link for s5p644x SoC if [ "$3" = "s5p644x" ] ; then rm -f regs.h ln -s $6.h regs.h rm -f asm-$2/arch ln -s arch-$3 asm-$2/arch fi if [ "$2" = "arm" ] ; then rm -f asm-$2/proc ln -s ${LNPREFIX}proc-armv asm-$2/proc fi # create link for s3c64xx-mp SoC if [ "$3" = "s3c64xx-mp" ] ; then rm -f regs.h ln -s $6.h regs.h rm -f asm-$2/arch ln -s arch-$3 asm-$2/arch fi
從第33行到第118行,都是在創建符號鏈接。為什么要創建符號鏈接?這些符號鏈接文件的存在就是整個配置過程的核心,這些符號鏈接文件(文件夾)的主要作用是給頭文件包含等過程提供指向性連接。根本目的是讓uboot具有可移植性。
uboot可移植性的實現原理:在uboot中有很多彼此平行的代碼,各自屬於各自不同的架構/CPU/開發板,我們在具體到一個開發板的編譯時用符號連接的方式提供一個具體的名字的文件夾供編譯時使用。這樣就可以在配置的過程中通過不同的配置使用不同的文件,就可以正確的包含正確的文件。
第一個:在include目錄下創建asm文件,指向asm-arm。(46-48行)
第二個:在inlcude/asm-arm下創建一個arch文件,指向include/asm-arm/arch-s5pc110
第三個:在include目錄下創建regs.h文件,指向include/s5pc110.h
刪除第二個。
第四個:在inlcude/asm-arm下創建一個arch文件,指向include/asm-arm/arch-s5pc11x
第五個:在include/asm-arm下創建一個proc文件,指向include/asm-arm/proc-armv
總結:一共創建了4個符號鏈接。這4個符號鏈接將來在寫代碼過程中,頭文件包含時非常有用。譬如一個頭文件包含可能是:#include <asm/xx.h>
注意:uboot的整個配置過程,很多文件之間是有關聯的(有時候這個文件是在那個文件中創建出來的;有時候這個文件被那個文件包含進去;有時候這個文件是由那個文件的內容生成的決定的)
注意:uboot中配置和編譯過程,所有的文件或者全局變量都是字符串形式的(不是指的C語言字符串的概念,指的是都是字符組成的序列)。這意味着我們整個uboot的配置過程都是字符串匹配的,所以一定要細節,注意大小寫,要注意不要輸錯字符,因為一旦錯一個最后會出現一些莫名其妙的錯誤,很難排查,這個是uboot移植過程中新手來說最難的地方。