1。
在uboot的顶层 Makefile 中可以看到如下代码:
SRCTREE := $(CURDIR)
……
MKCONFIG := $(SRCTREE)/mkconfig
……
#下面这段代码是原来uboot中针对2410支持的代码,可以跟踪一下这个的执行流程
smdk2410_config : unconfig
@$(MKCONFIG) $(@:_config=) arm arm920t smdk2410 NULL s3c24x0
假定在 U-Boot-1.1.6 的根目录下编译,则其中的 MKCONFIG 就是根目录下的 mkconfig
文件。 $(@:_config=)的结果就是将 “smdk2410_config” 中的 “_config” 去掉, 结果为 “smdk2410” 。//*********************//
所以“make smdk2410_config”实际上就是执行如下命令:
./mkconfig smdk2410 arm arm920t smdk2410 NULL s3c24x0
再来看看 mkconfig 的作用,在 mkconfig 文件开头第 6 行给出了它的用法:
# Parameters: Target Architecture CPU Board [VENDOR] [SOC]
二。
下面解释一下uboot下mkconfig脚本的具体含义
#!/bin/sh -e #这段是说明是一个shell脚本,后面这个-e选项可以网上搜搜,没特大的意义
# Script to create header files and links to configure
# U-Boot for a specific board.
#
# Parameters: Target Architecture CPU Board [VENDOR] [SOC]
1 2 3 4 5 6
#
# (C) 2002-2006 DENX Software Engineering, Wolfgang Denk
#
APPEND=no # Default: Create new config file
BOARD_NAME="" # Name to print in make output
while [ $# -gt 0 ] ; do #-gt符号意思是大于. $#:意思是终端中命令的后几个参数的总个数。,明显的,个数共和是6,当然大于0了,所以,进入执行
case "$1" in # $1第一个参数,即smdk2410
--) shift ; break ;;
-a) shift ; APPEND=yes ;;
-n) shift ; BOARD_NAME="${1%%_config}" ; shift ;;
*) break ;;
esac
done
#由 ./mkconfig smdk2410 arm arm920t smdk2410 NULL s3c24x0 可以看出,参数中没有上面任意一个,所以直接跳出。
[ "${BOARD_NAME}" ] || BOARD_NAME="$1"
#或运算符,此时BOARD_NAME="$1" =smdk2410
[ $# -lt 4 ] && exit 1
[ $# -gt 6 ] && exit 1 #这两句不会执行,因为个数为6,
echo "Configuring for ${BOARD_NAME} board..."
#
# 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}/include/asm-$2 asm
LNPREFIX="../../include2/asm/"
cd ../include
rm -rf asm-$2
rm -f asm
mkdir asm-$2
ln -s asm-$2 asm
else #执行到这里
cd ./include #进入到这里
rm -f asm #然后删除asm文件,首次编译的时候,你回发现是没有这个asm的。
ln -s asm-$2 asm #创建软连接文件,在这里,应该是:ln -s asm-arm asm,因此,在这里也就创建了对应的arm的汇编文件源码了。是一个符号链接asm,指向asm-arm源码文件。
fi
rm -f asm-$2/arch #删除asm-arm/arch下面的所有东西
if [ -z "$6" -o "$6" = "NULL" ] ; then #-z意思是空串,这个-o我也没查到,估计应该是||的意思,此时$6=s3c24x0 ,当然不为NULL,并且存在了,所以不执行这句
ln -s ${LNPREFIX}arch-$3 asm-$2/arch
else
ln -s ${LNPREFIX}arch-$6 asm-$2/arch #这个${LNPREFIX}为空,所以这句话为:ln -s arch-s3c24x0 asm-arm/arch。
fi
if [ "$2" = "arm" ] ; then #$2,当然就是第二个参数arm了,所以进入其中
rm -f asm-$2/proc #先删除原来的asm-arm/proc
ln -s ${LNPREFIX}proc-armv asm-$2/proc #意思是ln -s proc-armv asm-arm/proc,再次创建一个软连接
fi
#
# Create include file for Make
#
echo "ARCH = $2" > config.mk
echo "CPU = $3" >> config.mk
echo "BOARD = $4" >> config.mk
#上面三句很明显是,(当前在include目录下),向config.mk中写入ARCH =arm,CPU =arm920t BOARD =smdk2410 (当然第一次执行的时候这个config.mk是没有的,就创建,以后在编译的时候就有了,那就直接覆盖)
[ "$5" ] && [ "$5" != "NULL" ] && echo "VENDOR = $5" >> config.mk
#这句是&&运算符,因为$5=NULL,所以后面的就不用执行,直接退出,所以这条语句不会写进去。
[ "$6" ] && [ "$6" != "NULL" ] && echo "SOC = $6" >> config.mk
#同理,这句执行了,是输入SOC = s3c24x0 到config.mk中
#
# Create board specific header file
#
if [ "$APPEND" = "yes" ] # Append to existing config file
then
echo >> config.h
else
> config.h # Create new config file ,创建config.h文件
fi
echo "/* Automatically generated - do not edit */" >>config.h
echo "#include " >>config.h
echo "#include " >>config.h
#上面这句就简单多了,就是输入入戏几行代码到.config.h中
/* Automatically generated - do not edit */
#include
#include
exit 0