正常U-Boot的编译流程如下
make itop_4412_android_config_scp_1GDDR
make all
当我们执行第一条指令时,它会到Makefile中找到如下代码,然后执行
itop_4412_android_config_scp_1GDDR: unconfig
@$(MKCONFIG) $(@:_config=) arm arm_cortexa9 smdkc210 samsung s5pc210 SCP_1GDDR
其中的依赖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
这个依赖的意思是:在执行下面的指令之前,先去执行unconfig,也就是清除上次执行make itop_4412_android_config_scp_1GDDR 产生的配置文件,然后再回来执行下面的代码,如下所示
@$(MKCONFIG) $(@:_config=) arm arm_cortexa9 smdkc210 samsung s5pc210 SCP_1GDDR
其中$(MKCONFIG)在上面指定为$(SRCTREE)/mkconfig
。$(@:_config=)会将传进来的所有参数中的_config清除掉,因此这段代码的最终作用就是,将itop_4412_android_scp_1GDDR和后面的六个参数一起传给U-Boot的顶层目录中的mkconfig
mkconfig是一个配置脚本,用来配置U-Boot,它的主要输入参数有如下几个
Self Target Arch CPU Board [VENDER] [SOC]
分别对应着
- Self:自己定义的一些信息
- Target:目标板
- Arch :芯片架构
- CPU:芯片内核
- Board:开发板型号
- VENDER:芯片供应商
- SOC:片上系统
下面我们来分析mkconfig这个文件,看看它在接收了七个参数之后到底做了什么事情
# no表示创建新的配置文件,yes表示追加到配置文件中
APPEND=no # Default: Create new config file
BOARD_NAME="" # Name to print in make output
TARGETS=""
# 确定板子名称,并将这个名字赋值给BOARD_NAME变量
if [ "$7" = "SCP_1GDDR" ] || [ "$7" = "SCP_2GDDR" ] || [ "$7" = "POP_1GDDR" ] || [ "$7" = "POP_2GDDR" ]
then
BOARD_NAME="itop_4412_android"
echo "CoreBoard OS is android or linux...... "
elif [ "$7" = "SCP_1GDDR_Ubuntu" ] || [ "$7" = "SCP_2GDDR_Ubuntu" ] || [ "$7" = "POP_1GDDR_Ubuntu" ] || [ "$7" = "POP_2GDDR_Ubuntu" ]
then
BOARD_NAME="itop_4412_ubuntu"
echo "CoreBoard OS is Ubuntu...... "
else
echo "unknown coreboard type and os type......"
fi
APPEND用来指示是创建新的配置文件,还是在配置文件后面追加,我们这里选择no,表示创建新的配置文件,下面的就是根据参数7来确定板子名称变量的值
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"
# 检查参数合法性
[ $# -lt 4 ] && exit 1
[ $# -gt 7 ] && exit 1
if [ "${ARCH}" -a "${ARCH}" != "$2" ]; then
echo "Failed: \$ARCH=${ARCH}, should be '$2' for ${BOARD_NAME}" 1>&2
exit 1
fi
echo "Configuring for ${BOARD_NAME} board..."
-gt的是大于的意思,$#用来获取参数个数,由于这里的参数个数是大于0,所以会进入到下面的case语句,但是又因为我们没有传递任何的选项,因此case语句不起作用,也就是while不起作用,最后又给BOARD_NAME进行了一次赋值,其实之前的赋值是U-Boot使用者自己添加的,这里的才是U-Boot源码的名称赋值
,紧接着又对参数的合法性进行了检查-lt是小于的意思,也就是说参数的个数必须大于4,小于7。
# 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
ln -s asm-$2 asm
fi
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
if [ "$2" = "arm" ] ; then
rm -f asm-$2/proc
ln -s ${LNPREFIX}proc-armv asm-$2/proc
fi
这段代码用于创建架构特定的软连接,为了简单起见,我们假设源码树和目标树相同,那么if判断部分会直接执行else部分,也就是
cd ./include
rm -f asm
ln -s asm-$2 asm
这段代码的作用是在include目录下创建一个asm-arm的软连接asm。
下面的代码可以简化成如下几句
rm -f asm-arm/arch
ln -s arch-s5pc210 asm-arm/arch
rm -f asm-arm/proc
ln -s proc-armv asm-arm/proc
到此为止,我们创建了三个软链接
# 建立config.mk,并将$1~$6输入到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
# 指定开发板所在目录
# Assign board directory to BOARDIR variable
if [ -z "$5" -o "$5" = "NULL" ] ; then
BOARDDIR=$4
else
BOARDDIR=$5/$4
fi
上面的代码在include文件夹下面建立了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
fi
echo "/* Automatically generated - do not edit */" >>config.h
for i in ${TARGETS} ; do
echo "#define CONFIG_MK_${i} 1" >>config.h ;
done
#add by dg for all itop4412 type boards
[ "$7" ] && [ "$7" != "NULL" ] && echo "#define CONFIG_$7" >> config.h
cat << EOF >> config.h
#define CONFIG_BOARDDIR board/$BOARDDIR
#include <config_defaults.h>
#include <configs/$BOARD_NAME.h>
#include <asm/config.h>
EOF
这段代码生成了config.h,并且向里面添加了一些内容
来总结一下,mkconfig到底做了哪些事情
- 生成三个软链接:include/asm-arm/arch、include/asm-arm/proc、include/asm
- 创建config.mk
- 创建开发板目录变量:BOARDDIR
- 创建config.h