tiny210-u-boot-version4.0中mkconfig解析
mkconfig是makefile调用的:mkconfig -A tiny210_config
mkconfig文件还算小的,所以此篇基本逐行分析。非重点权当温习shell。
1. 获取开发板相关参数
1 if [ \( $# -eq 2 \) -a \( "$1" = "-A" \) ] ; then 2 # Automatic mode 3 line=`egrep -i "^[[:space:]]*${2}[[:space:]]" boards.cfg` || { 4 echo "make: *** No rule to make target \`$2_config'. Stop." >&2 5 exit 1 6 } 7 8 set ${line} 9 # add default board name if needed 10 [ $# = 3 ] && set ${line} ${1} 11 fi
1.1 第一行解析
$#表示命令参数的个数,当前为2。
-eq相等,和=的区别在于只能数字
-a表示and
$1表示第一个参数,当前为“-A”。tips:$0就是“mkconfig”啦。
所以第一行可以理解为:if($#==2 && $1=="-A")
1.2 第三行
由于if语句条件符合,所以第三行执行。主要是从boards.cfg中获取${2},这里是“tiny210”这一行的参数,具体可以参加boards.cfg。
只要line有值,就为真,那么||后面的{}中的就不执行了。
1.3 第8行
set可用于在脚本内部给出其运行参数,所以这个时候参数就变为"tiny210 arm armv7 tiny210 samsung s5pc1xx" 。所以在此行后$#为6啦。注意此处从$1开始哟。
2. 温习shell--1
1 while [ $# -gt 0 ] ; do 2 case "$1" in 3 --) shift ; break ;; 4 -a) shift ; APPEND=yes ;; 5 -n) shift ; BOARD_NAME="${1%_config}" ; shift ;; 6 -t) shift ; TARGETS="`echo $1 | sed 's:_: :g'` ${TARGETS}" ; shift ;; 7 *) break ;; 8 esac 9 done
其中 -gt表示大于的意思:greater than。 -lt:less than
case语句:开头:case XX in。中间:条件+“)”,每一分支以;;结束。结尾:esac。 其中注意;;而不是; 。
由于$1中没有--、-a等参数,此语句其实什么也没做。tips:shift表参数左移。不带参数的shift命令相当于shift 1。如果是shift 3表示原来的$4现在变成$1,原来的$5现在变成$2等等,原来的$1、$2、$3丢弃,$0不移动。
3. 参数检验
1 [ $# -lt 4 ] && exit 1 2 [ $# -gt 7 ] && exit 1
其中 [XXX] 表示一个条件,&&表示如果条件为真,则运行后面的程序。||表示如果 条件为假 则运行后面的程序。
此处$#为6,两个条件都不满足,所以都不会exit。
4.
1 # Strip all options and/or _config suffixes 2 CONFIG_NAME="${1%_config}" 3 4 [ "${BOARD_NAME}" ] || BOARD_NAME="${1%_config}" 5 6 arch="$2" 7 cpu="$3" 8 if [ "$4" = "-" ] ; then 9 board=${BOARD_NAME} 10 else 11 board="$4" 12 fi 13 [ $# -gt 4 ] && [ "$5" != "-" ] && vendor="$5" 14 [ $# -gt 5 ] && [ "$6" != "-" ] && soc="$6" 15 16 [ $# -gt 6 ] && [ "$7" != "-" ] && { 17 # check if we have a board config name in the options field 18 # the options field mave have a board config name and a list 19 # of options, both separated by a colon (':'); the options are 20 # separated by commas (','). 21 # 22 # Check for board name 23 tmp="${7%:*}" 24 if [ "$tmp" ] ; then 25 CONFIG_NAME="$tmp" 26 fi 27 # Check if we only have a colon... 28 if [ "${tmp}" != "$7" ] ; then 29 options=${7#*:} 30 TARGETS="`echo ${options} | sed 's:,: :g'` ${TARGETS}" 31 fi 32 } 33 34 35 if [ "${ARCH}" -a "${ARCH}" != "${arch}" ]; then 36 echo "Failed: \$ARCH=${ARCH}, should be '${arch}' for ${BOARD_NAME}" 1>&2 37 exit 1 38 fi 39 40 if [ "$options" ] ; then 41 echo "Configuring for ${BOARD_NAME} - Board: ${CONFIG_NAME}, Options: ${options}" 42 else 43 echo "Configuring for ${BOARD_NAME} board..." 44 fi
4.1 第2行
${1%_config}去掉$1字符串中最后一个_config以及其后面的字符。
现在其实$1为tiny210,所以CONFIG_NAME还是tiny210
4.2 第4-15行
主要是将那6个参数赋值给一些变量啦
4.3 第16-32行
好吧,没执行,不分析了
4.4 第35-38行
检测ARCH是否和arch一致。ARCH是make命令时需要申明的哇,arch是从那6个参数来的。
4.5 第40-44行
我们执行else分支。
5. 创建链接和新文件
1 if [ "$SRCTREE" != "$OBJTREE" ] ; then 2 mkdir -p ${OBJTREE}/include 3 mkdir -p ${OBJTREE}/include2 4 cd ${OBJTREE}/include2 5 rm -f asm 6 ln -s ${SRCTREE}/arch/${arch}/include/asm asm 7 LNPREFIX=${SRCTREE}/arch/${arch}/include/asm/ 8 cd ../include 9 mkdir -p asm 10 else 11 cd ./include 12 rm -f asm 13 ln -s ../arch/${arch}/include/asm asm 14 fi 15 16 rm -f asm/arch 17 18 if [ -z "${soc}" ] ; then 19 ln -s ${LNPREFIX}arch-${cpu} asm/arch 20 else 21 ln -s ${LNPREFIX}arch-${soc} asm/arch 22 fi 23 24 if [ "${arch}" = "arm" ] ; then 25 rm -f asm/proc 26 ln -s ${LNPREFIX}proc-armv asm/proc 27 fi
5.1 第1-14行
我们这边执行分支,可见先删除include下的asm原链接,重新创建了一个新asm链接,指向arch/arm/include/asm
5.2 第16-22行
删除include/asm/下的arch原链接,由于soc为s5pc1xx,所以执行分支,重新创建了一个新arch链接,指向arch/arm/include/asm/arch-s5pc1xx。
tips:if[-z "XX"],如果XX长度为零则为真。
5.3 第24-27行
删除include/asm/下的proc原链接,由于soc为s5pc1xx,所以执行分支,重新创建了一个新arch链接,指向arch/arm/include/asm/proc-armv。
6. 主要是创建config.mk文件
1 echo "ARCH = ${arch}" > config.mk 2 echo "CPU = ${cpu}" >> config.mk 3 echo "BOARD = ${board}" >> config.mk 4 5 [ "${vendor}" ] && echo "VENDOR = ${vendor}" >> config.mk 6 7 [ "${soc}" ] && echo "SOC = ${soc}" >> config.mk 8 9 # Assign board directory to BOARDIR variable 10 if [ -z "${vendor}" ] ; then 11 BOARDDIR=${board} 12 else 13 BOARDDIR=${vendor}/${board} 14 fi
6.1 第1-7行
其中:> 如果文件不存在,将创建新的文件,如果文件存在,先将文件清空,然后将数据填入此文件。
>> 如果文件不存在,将创建新的文件, 如果文件存在,则将数据添加在文件后面。
此段执行完后可以看见include/config.mk文件如下
ARCH =arm CPU = armv7 BOARD = tiny210 VENDOR = samsung SOC = s5pc1xx
6.2 第10-14行
执行分支:BOARDDIR的值为samsung/s5pc1xx
7. 主要是创建config.h文件
1 if [ "$APPEND" = "yes" ] # Append to existing config file 2 then 3 echo >> config.h 4 else 5 > config.h # Create new config file 6 fi 7 echo "/* Automatically generated - do not edit */" >>config.h 8 9 for i in ${TARGETS} ; do 10 i="`echo ${i} | sed '/=/ {s/=/ /;q; } ; { s/$/ 1/; }'`" 11 echo "#define CONFIG_${i}" >>config.h ; 12 done 13 14 cat << EOF >> config.h 15 #define CONFIG_BOARDDIR board/$BOARDDIR 16 #include <config_cmd_defaults.h> 17 #include <config_defaults.h> 18 #include <configs/${CONFIG_NAME}.h> 19 #include <asm/config.h> 20 EOF
7.1 第1-6行
由于前面是no,所以执行分支,创建一个新config file
7.2 第9-12行
这边TARGETS为空,所以此处不会执行for语句
7.3 第14-19行
添加一些头文件。
7.4 最后内容如下:
/* Automatically generated - do not edit */#define CONFIG_BOARDDIR board/samsung/tiny210 #include <config_cmd_defaults.h> #include <config_defaults.h> #include <configs/smdk210.h> #include <asm/config.h>
8. 至此所有分析完毕
我们可以看见mkconfig做了如下工作:
1.include/asm --> arch/arm/include/arm
2.include/asm/arch --> arch-s5pc1xx
3.include/asm/proc --> proc-armv
4.在include目录下新建了config.mk文件,文件内容是ARCH CPU BOARD VENDOR SOC的定义
5.在include目录下新建了config.h文件
浙公网安备 33010602011771号