上篇博客讲到 ./mkconfig TQ2440 arm arm920t TQ2440 samsung s3c24x0
# Parameters: Target Architecture CPU Board [VENDOR] [SOC]
- TQ2440:Target(目标板型号)
- arm:Architecture (目标板的CPU架构)
- arm920t:CPU (具体使用的CPU型号)
- TQ2440:Board
- samsung:VENDOR(生产厂家名)
- s3c24x0:SOC
TQ2440:Target(目标板型号)
arm:Architecture (目标板的CPU架构)
arm920t:CPU (具体使用的CPU型号)
TQ2440: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"
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的值,在这里就是“TQ2440”。
(2)检查参数合法性
- [ $# -lt 4 ] && exit 1
- [ $# -gt 6 ] && exit 1
[ $# -lt 4 ] && exit 1
[ $# -gt 6 ] && exit 1
上面代码的作用是检查参数个数和参数是否正确,参数个数少于
4个或多于
6个都被认为是错误的。
(3)创建到目标板相关的目录的链接
- #
- # 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="http://www.cnblogs.com/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
#
# 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="http://www.cnblogs.com/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
若将目标文件设定为输出到源文件所在目录,则以上代码在 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
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
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
#
# 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 = TQ2440
- VENDOR = samsung
- SOC = s3c24x0
ARCH = arm
CPU = arm920t
BOARD = TQ2440
VENDOR = samsung
SOC = s3c24x0
(5)指定开发板代码所在目录
- # Assign board directory to BOARDIR variable
- if [ -z "$5" -o "$5" = "NULL" ] ; then
- BOARDDIR=$4
- else
- BOARDDIR=$5/$4
- fi
# Assign board directory to BOARDIR variable
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/TQ2440 。
(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 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
- cat << EOF >> config.h
- #define CONFIG_BOARDDIR board/$BOARDDIR
- #include <config_defaults.h>
- #include <configs/$1.h>
- #include <asm/config.h>
- EOF
- exit 0
#
# 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
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 */
- #define CONFIG_BOARDDIR board/samsung/TQ2440
- #include <config_defaults.h>
- #include <configs/TQ2440.h>
- #include <asm/config.h>
/* Automatically generated - do not edit */
#define CONFIG_BOARDDIR board/samsung/TQ2440
#include <config_defaults.h>
#include <configs/TQ2440.h>
#include <asm/config.h>
总结:
下面总结命令 make TQ2440_config 执行的结果(仅针对编译目标输出到源代码目录的情况):(1) 创建到目标板相关的文件的链接
- ln -s asm-arm asm
- ln -s arch-s3c24x0 asm-arm/arch
- ln -s proc-armv asm-arm/proc
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 = TQ2440
- VENDOR = samsung
- SOC = s3c24x0
ARCH = arm
CPU = arm920t
BOARD = TQ2440
VENDOR = samsung
SOC = s3c24x0
(3) 创建与目标板相关的文件include/config.h,如下所示:
- /* Automatically generated - do not edit */
- #define CONFIG_BOARDDIR board/samsung/TQ2440
- #include <config_defaults.h>
- #include <configs/TQ2440.h>