參考Friendlyarm的文檔,編譯uboot的流程為
make tiny4412_config make
這個過程主要涉及到兩個文件,頂層的Makefile文件和mkconfig文件,makeconfig文件是一個腳本,通過文件的注釋可以了解到它的作用
# Script to create header files and links to configure # U-Boot for a specific board. # # Parameters: Target Architecture CPU Board [VENDOR] [SOC]
意思是,mkconfig 是用來創建頭文件和鏈接腳本,並以此來為特定的開發板配置u-boot的腳本。它的主要參數有
Target Architecture CPU Board [VENDOR] [SOC]
首先來分析頂層的Makefile文件,在Makefile文件中我們可以看到下面的代碼
%_config:: unconfig
@$(MKCONFIG) -A $(@:_config=)
%在Makefile中作為通配符用來通配任意長度的字符,因此當我們執行 make tiny4412_config的時候就會匹配到%_config這條語句。::在Makefile中用來強制執行下面的命令,所以匹配到%_config之后,就會去執行unconfig,unconfig的作用是去除原來的配置信息。然后去執行
@$(MKCONFIG) -A $(@:_config=)
這條命令,@的作用是用來去除回顯,$(MKCONFIG)在前面被定義為
MKCONFIG := $(SRCTREE)/mkconfig
SRCTREE := $(CURDIR)
我們將@去掉,然后執行make tiny4412_config,可以通過回顯看到以下內容
make tiny4412_config awk '(NF && $1 !~ /^#/) { print $1 ": " $1 "_config; $(MAKE)" }' boards.cfg > .boards.depend /....../uboot_tiny4412/mkconfig -A tiny4412 Configuring for tiny4412 board...
所以我們執行make tiny4412_config實際上被解析成
/....../uboot_tiny4412/mkconfig -A tiny4412
指定了-A選項,mkconfig腳本會自動去解析boards.cfg文件,找到以下內容
# Target ARCH CPU Board name Vendor SoC Options
tiny4412 arm armv7 tiny4412 samsung exynos
所以我們最終執行的命令為
./mkconfig tiny4412 arm armv7 tiny4412 samsung exynos
總結一下,mkcongif腳本主要做了以下幾件事
(1)解析boards.cfg tiny4412相關數據
tiny4412 arm armv7 tiny4412 samsung exynos
(2)針對平台做了一系列鏈接,創建平台、開發板相關的頭文件的鏈接
# # 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}/arch/${arch}/include/asm asm LNPREFIX=${SRCTREE}/arch/${arch}/include/asm/ cd ../include rm -f asm ln -s ${SRCTREE}/arch/${arch}/include/asm asm else cd ./include rm -f asm ln -s ../arch/${arch}/include/asm asm fi rm -f asm/arch if [ -z "${soc}" ] ; then ln -s ${LNPREFIX}arch-${cpu} asm/arch else ln -s ${LNPREFIX}arch-${soc} asm/arch fi if [ "${arch}" = "arm" ] ; then rm -f asm/proc ln -s ${LNPREFIX}proc-armv asm/proc fi
實際執行的命令為
cd ./include rm -f asm ln -s ../arch/arm/include/asm asm ln -s arch-exynos asm/arch
(3)創建頂層Makefile包含的文件 include/ config.mk
# # Create include file for Make # echo "ARCH = ${arch}" > config.mk echo "CPU = ${cpu}" >> config.mk echo "BOARD = ${board}" >> config.mk [ "${vendor}" ] && echo "VENDOR = ${vendor}" >> config.mk [ "${soc}" ] && echo "SOC = ${soc}" >> config.mk # Assign board directory to BOARDIR variable if [ -z "${vendor}" ] ; then BOARDDIR=${board} else BOARDDIR=${vendor}/${board} fi
生成的config.mk內容如下
ARCH = arm CPU = armv7 BOARD = tiny4412 VENDOR = samsung SOC = exynos
(4)創建開發板相關的頭文件inlucde/config.h
# # Create board specific header file # if [ "$APPEND" = "yes" ] # Append to existing config file then echo >> config.h else > config.h # Create new config file fi echo "/* Automatically generated - do not edit */" >>config.h for i in ${TARGETS} ; do i="`echo ${i} | sed '/=/ {s/=/\t/;q } ; { s/$/\t1/ }'`" echo "#define CONFIG_${i}" >>config.h ; done cat << EOF >> config.h #define CONFIG_BOARDDIR board/$BOARDDIR #include <config_defaults.h> #include <configs/${CONFIG_NAME}.h> #include <asm/config.h> EOF
生成的include/config.h內容為
/* Automatically generated - do not edit */ #define CONFIG_BOARDDIR board/samsung/tiny4412 #include <config_defaults.h> #include <configs/tiny4412.h> #include <asm/config.h>