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文件

 

 

posted @ 2014-10-11 10:47  风啊  阅读(255)  评论(0)    收藏  举报