2. makemini2440_config命令執行過程
下面分析命令“make mini2440_config”執行過程,為了簡化分析過程這里主要分析將編譯目標輸出到源代碼目錄的情況。
mini2440_config : unconfig
@$(MKCONFIG)$(@:_config=) arm arm920t mini2440 samsung s3c24x0
其中的依賴“unconfig”定義如下:
unconfig:
@rm-f $(obj)include/config.h $(obj)include/config.mk \
$(obj)board/*/config.tmp$(obj)board/*/*/config.tmp \
$(obj)include/autoconf.mk$(obj)include/autoconf.mk.dep
其中“@”的作用是執行該命令時不在shell顯示。“obj”變量就是編譯輸出的目錄,因此“unconfig”的作用就是清除上次執行make *_config命令生成的配置文件(如include/config.h,include/config.mk等)。
$(MKCONFIG)在上面指定為“$(SRCTREE)/mkconfig”。$(@:_config=)為將傳進來的所有參數中的_config替換為空(其中“@”指規則的目標文件名,在這里就是“mini2440_config ”。$(text:patternA=patternB),這樣的語法表示把text變量每一個元素中結尾的patternA的文本替換為patternB,然后輸出) 。因此$(@:_config=)的作用就是將mini2440_config中的_config去掉,得到mini2440。
因此“@$(MKCONFIG) $(@:_config=) armarm920t mini2440 samsung s3c24x0”實際上就是執行了如下命令:
。/mkconfig mini2440 arm arm920t mini2440samsung s3c24x0
即將“mini2440 arm arm920t mini2440samsung s3c24x0”作為參數傳遞給當前目錄下的mkconfig腳本執行。
在mkconfig腳本中給出了mkconfig的用法:
# Parameters: Target Architecture CPU Board [VENDOR] [SOC]
因此傳遞給mkconfig的參數的意義分別是:
mini2440:Target(目標板型號)
arm:Architecture (目標板的CPU架構)
arm920t:CPU (具體使用的CPU型號)
mini2440:Board
samsung:VENDOR(生產廠家名)
s3c24x0:SOC
下面再來看看mkconfig腳本到底做了什么。
(1)確定開發板名稱BOARD_NAME
在mkconfig腳本中有如下代碼:
APPEND=no #no表示創建新的配置文件,yes表示追加到配置文件中
BOARD_NAME=“” # Name to print in make output
TARGETS=“”
while [ $# -gt 0 ] ; do
case “$1” in
--) shift ; break ;;
-a) shift ; APPEND=yes ;;
-n) shift ; BOARD_NAME=“${1%%_config}” ; shift ;;
-t) shift ; TARGETS=“`echo $1 | sed ‘s:_: :g’` ${TARGETS}” ;shift ;;
*) break ;;
esac
done
[ “${BOARD_NAME}” ] ||BOARD_NAME=“$1”
環境變量$#表示傳遞給腳本的參數個數,這里的命令有6個參數,因此$#是6 。shift的作用是使$1=$2,$2=$3,$3=$4…。,而原來的$1將丟失。因此while循環的作用是,依次處理傳遞給mkconfig腳本的選項。由于我們并沒有傳遞給mkconfig任何的選項,因此while循環中的代碼不起作用。
最后將BOARD_NAME的值設置為$1的值,在這里就是“mini2440”。
(2)檢查參數合法性
[ $# -lt 4 ] && exit 1
[ $# -gt 6 ] && exit 1
if [ “${ARCH}” -a“${ARCH}” != “$2” ]; then
echo“Failed: \$ARCH=${ARCH}, should be ‘$2’ for ${BOARD_NAME}”1》&2
exit1
fi
上面代碼的作用是檢查參數個數和參數是否正確,參數個數少于4個或多于6個都被認為是錯誤的。
(3)創建到目標板相關的目錄的鏈接
#
# Create link to architecture specificheaders
#
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=“http://www.cnblogs.com/include2/asm/”
cd.。/include
rm-rf asm-$2
rm-f asm
mkdirasm-$2
ln-s asm-$2 asm
else
cd./include
rm-f asm
ln-s asm-$2 asm
fi
若將目標文件設定為輸出到源文件所在目錄,則以上代碼在include目錄下建立了到asm-arm目錄的符號鏈接asm。其中的ln -s asm-$2 asm即ln -s asm-arm asm 。
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
建立符號鏈接include/asm-arm/arch ,若$6(SOC)為空,則使其鏈接到include/asm-arm/arch-arm920t目錄,否則就使其鏈接到include/asm-arm/arch-s3c24x0目錄。(事實上include/asm-arm/arch-arm920t并不存在,因此$6是不能為空的,否則會編譯失敗)
if [ “$2” = “arm” ] ;then
rm-f asm-$2/proc
ln-s ${LNPREFIX}proc-armv asm-$2/proc
fi
若目標板是arm架構,則上面的代碼將建立符號連接include/asm-arm/proc,使其鏈接到目錄proc-armv目錄。
建立以上的鏈接的好處:編譯U-Boot時直接進入鏈接文件指向的目錄進行編譯,而不必根據不同開發板來選擇不同目錄。
(4)構建include/config.mk文件
#
# Create include file for Make
#
echo “ARCH = $2” 》 config.mk
echo “CPU = $3” 》》 config.mk
echo “BOARD = $4” 》》 config.mk
[ “$5” ] && [“$5” != “NULL” ] && echo “VENDOR = $5”》》 config.mk
[ “$6” ] && [“$6” != “NULL” ] && echo “SOC = $6” 》》 config.mk
上面代碼將會把如下內容寫入文件inlcude/config.mk文件:
ARCH = arm
CPU = arm920t
BOARD = mini2440
VENDOR = samsung
SOC = s3c24x0
(5)指定開發板代碼所在目錄
# Assign board directory to BOARDIRvariable
if [ -z “$5” -o “$5” =“NULL” ] ; then
BOARDDIR=$4
else
BOARDDIR=$5/$4
fi
以上代碼指定board目錄下的一個目錄為當前開發板專有代碼的目錄。若$5(VENDOR)為空則BOARDDIR設置為$4(BOARD),否則設置為$5/$4(VENDOR/BOARD)。在這里由于$5不為空,因此BOARDDIR被設置為samsung/mini2440 。
(6)構建include/config.h文件
#
# Create board specific header file
#
if [ “$APPEND” = “yes”] # Append to existing config file
then
echo》》 config.h
else
》config.h # Create new configfile
fi
echo “/* Automatically generated - donot edit */” 》》config.h
for i in ${TARGETS} ; do
echo“#define CONFIG_MK_${i} 1” 》》config.h ;
done
cat 《《 EOF 》》 config.h
#define CONFIG_BOARDDIR board/$BOARDDIR
#include 《config_defaults.h》
#include 《configs/$1.h》
#include 《asm/config.h》
EOF
exit 0
這里的“cat 《《 EOF 》》config.h”表示將輸入的內容追加到config.h中,直到出現“EOF”這樣的標識為止。
若APPEND為no,則創建新的include/config.h文件。若APPEND為yes,則將新的配置內容追加到include/config.h文件后面。由于APPEND的值保持“no”,因此config.h被創建了,并添加了如下的內容:
/*Automatically generated - do not edit */
#defineCONFIG_BOARDDIR board/samsung/mini2440
#include《config_defaults.h》
#include《configs/mini2440.h》
#include《asm/config.h》
?
下面總結命令make mini2440_config執行的結果(僅針對編譯目標輸出到源代碼目錄的情況):
(1) 創建到目標板相關的文件的鏈接
ln-s asm-arm asm
ln-s arch-s3c24x0 asm-arm/arch
ln-s proc-armv asm-arm/proc
(2) 創建include/config.mk文件,內容如下所示:
ARCH = arm
CPU = arm920t
BOARD = mini2440
VENDOR= samsung
SOC = s3c24x0
(3) 創建與目標板相關的文件include/config.h,如下所示:
/*Automatically generated - do not edit */
#defineCONFIG_BOARDDIR board/samsung/mini2440
#include《config_defaults.h》
#include《configs/mini2440.h》
#include《asm/config.h》
評論