http://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的Makefile可知,当执行./mkconfig时,传入的参数分别对应为
Target -- smdk2410
Architecture – arm
CPU -- arm920t
Board -- smdk2410
VENDOR -- NULL 按厂商划分(如AT9200、S3C44B0等)
SOC -- s3c24x0
为何要编制该脚本文件:因为uboot是一个多CPU多架构的统一bootloader,为了完成针对特定目标单板,目标架构的编译,需要给Makefile指明,哪些文件需要编译,相当与从整体上控制需要编译的cpu,单板等
代码分析
#!/bin/sh –e //指定执行该脚本所使用的解释器, -e相当于/bin/bash
APPEND=no #缺省创建一个新的配置文件
BOARD_NAME=”” #make 执行smdk2410_config的时候打印输出单板名
while [ $# -gt 0 ] ; do //当参数数量大于0,做一下判断
case “$1” in //判断第一个参数
--) shift ; break ;; //-- 所有参数左移,不包括$0,$0是命令名
-a) shift ; APPEND=YES ;; //-a, APPEND变量赋值yes,不生成新的config.h
-n) shift ; BOARD_NAME=”$(1%%_config)” ; shift ;;
*) break ;;
esac
done
$(1%%_config)原形为$(string%%substring),从string的右侧删除掉最后匹配substring的字符串
如果我们编译的是smdk2410单板,以上条件不满足,则退出while循环
[ “${BOARD_NAME}” ] || BOARD_NAME=”$1” //如果BOARD_NAME非空,则什么也不做,否则将参数1赋值给BOARD_NAME,或表示,前面如果为真,则不执行后面操作,如果为假,则执行或后面的代码
[ $# -lt 4 ] && exit 1 //如果参数数量小于4,则退出
[ $# -gt 6 ] && exit 1 //如果参数数量大于6,则退出
echo "Configuring for ${BOARD_NAME} board..." //输出单板名,如果没有名字,则表明没有此单板
//以下的代码,是该脚本的核心,主要在目标文件下创建一些指向架构头文件的链接
if [ “$SRCTREE” != “$OBJTREE” ] ; then
mkdir –p ${OBJTREE}/include 在目标目录下创建include文件夹
mkdir –p ${OBJTREE}/include2 在目标目录下创建include2文件夹
cd ${OBJTREE}/include2 进入include2
rm –f asm 删除asm链接
ln –s ${SRCTREE}/include/asm-$2 asm 创建asm链接,指向源目录下include/asm-arm
LNPREFIX="../../include2/asm/" 赋值
cd ../include //进入目标目录下的include目录
rm –rf asm-$2 //删除asm-arm
rm –f asm //删除asm
mkdir asm-$2 //创建asm-arm
ln –s asm-$2 asm //创建asm软连接指向当前目录的asm-arm
else
cd ./include //如果资源目录和目标目录是同一路径,则只创建指向asm-arm的软连接
rm –f asm
ln –s asm-$2 asm
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
ln -s ${LNPREFIX}arch-$3 asm-$2/arch
else
ln -s ${LNPREFIX}arch-$6 asm-$2/arch
fi
if [ "$2" = "arm" ] ; then
rm -f asm-$2/proc
ln -s ${LNPREFIX}proc-armv asm-$2/proc
fi
最终目标目录下的软链接创建就是在Include下创建了asm
asm指向目标路径下的include下的/asm-arm,而asm-arm下也有2个软链接,分别指向include2/asm/arch-s3c24x0 和proc-armv,最终就是在目标路径下的include下创建一个和资源路径下include一样的路径,只是里面都是一些软链接
//创建config.mk
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
创建单板指定的头文件config.h
if [ "$APPEND" = "yes" ] # Append to existing config file
then
echo >> config.h
else
> config.h # Create new config file
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
include/asm-arm/arch include/asm-arm/arch-s3c24x0
include/asm-arm/proc include/asm-arm/proc-armv
include/config.h include/configs/smdk2410.h
include/asm -> include/asm-arm
之所以目标路径下多了Include2是为了编写脚本方便,一切链接都是通过
LNPREFIX(../../include2/asm/)指向源文件路径下的/include/asm-arm,这样,以后如果源文件路径有改动,则只需要修改脚本下的LNPREFIX即可
文章评论(0条评论)
登录后参与讨论