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》
评论
查看更多