原文地址:blog.sina.com.cn/s/blog_3e7848600100hr2g.html
u-boot1.1.6 mkconfig脚本分析
脚本功能:根据脚本开头注释可知,该脚本针对指定单板,创建一些头文件和相关链接用于配置u-boot,是编译Uboot的第一个步骤,make smdk2410_config就执行该脚本
脚本参数:Target Architecture CPU Board [VENDOR] [SOC]
为何要编制该脚本文件:因为uboot是一个多CPU多架构的统一bootloader,为了完成针对特定目标单板,目标架构的编译,需要给Makefile指明,哪些文件需要编译,相当与从整体上控制需要编译的cpu,单板等
代码分析
#!/bin/sh –e
APPEND=no
BOARD_NAME=”” #make 执行smdk2410_config的时候打印输出单板名
while [ $# -gt 0 ] ; do
done
$(1%%_config)原形为$(string%%substring),从string的右侧删除掉最后匹配substring的字符串
如果我们编译的是smdk2410单板,以上条件不满足,则退出while循环
[ “${BOARD_NAME}” ] || BOARD_NAME=”$1” //如果BOARD_NAME非空,则什么也不做,否则将参数1赋值给BOARD_NAME,或表示,前面如果为真,则不执行后面操作,如果为假,则执行或后面的代码
[ $# -lt 4 ] && exit 1
[ $# -gt 6 ] && exit 1
echo "Configuring for ${BOARD_NAME} board..." //输出单板名,如果没有名字,则表明没有此单板
//以下的代码,是该脚本的核心,主要在目标文件下创建一些指向架构头文件的链接
if [ “$SRCTREE” != “$OBJTREE” ]
else
fi
rm -f asm-$2/arch
//如果$6(即SOC)为0或者为NULL,-o意味或的意思,在目标目录的Include下创建软链接arm-arm/arch指向${LNPREFIX}arch-$3,否则指向${LNPREFIX}arch-soc24x0
if [ -z "$6" -o "$6" = "NULL" ] ; then
else
fi
if [ "$2" = "arm" ] ; then
fi
最终目标目录下的软链接创建就是在Include下创建了asm
asm指向目标路径下的include下的/asm-arm,而asm-arm下也有2个软链接,分别指向include2/asm/arch-s3c24x0 和proc-armv,最终就是在目标路径下的include下创建一个和资源路径下include一样的路径,只是里面都是一些软链接
//创建config.mk
echo "ARCH
echo "CPU
echo "BOARD
[ "$5" ] && [ "$5" != "NULL" ] && echo "VENDOR = $5" >> config.mk
[ "$6" ] && [ "$6" != "NULL" ] && echo "SOC
创建单板指定的头文件config.h
if [ "$APPEND" = "yes" ]
then
else
fi
echo "" >>config.h
echo "#include <configs/$1.h>" >>config.h //创建的config.h,包含<configs/smdk2410.h>
//这种方式在多目标项目中经常使用,对用户来说,头文件只需要包含config.h(脚本动态生成),具体包含的是哪一个单板的config.h.由编译时指定
exit 0 //脚本正常退出
mkconfig脚本文件的目的就是在目标路径下创建一个源文件路径下include下的一个镜像
目标路径
include/asm-arm
include/asm-arm/arch
include/asm-arm/proc
include/config.h
include/asm -> include/asm-arm
之所以目标路径下多了Include2是为了编写脚本方便,一切链接都是通过
LNPREFIX(../../include2/asm/)指向源文件路径下的/include/asm-arm,这样,以后如果源文件路径有改动,则只需要修改脚本下的LNPREFIX即可