u-boot-2012.04.01的配置编译过程分析.doc

来源:互联网 发布:东方市网络诈骗2017 编辑:程序博客网 时间:2024/05/16 18:29

uboot分析之配置过程

基于u-boot-2012.04.01.tar.bz2

一:

问:我们在编译uboot的时候,先是执行make smdkc100_config命令(配置),然后执行make命令(编译),那么make smdkc100_config过程是怎么实现的呢?

答:我们知道,在执行命令的时候,都直接和Makefile挂钩,打开uboot顶层目录下的Makefile,搜索发现了uboot配置过程如下:(注意区别u-boot-1.1.6)

%_config::unconfig

@$(MKCONFIG) -A $(@:_config=)

这里可以看到%_config目标后面是双冒号,而我们平常看的只有一个冒号,这是Makefile 的双冒号规则,而平常我们见的单冒号就是普通规则。

Makefile中规定:一个目标可以出现在多个规则中。但是这些规则必须是同一类型的规则,要么都是普通规则,要么都是双冒号规则。而不允许一个目标同时出现在两种不同类型的规则中。双冒号规则和普通规则的处理的不同点表现在以下方面:

1. 双冒号规则中,当依赖文件比目标更新时。规则将会被执行。对于一个没有依赖而只有命令行的双冒号规则,当引用此目标时,规则的命令将会被无条件执行。而普通规则,当规则的目标文件存在时,此规则的命令永远不会被执行(目标文件永远是最新的)

2. 当同一个文件作为多个双冒号规则的目标时。这些不同的规则会被独立的处理,而不是像普通规则那样合并所有的依赖到一个目标文件。这就意味着对这些规则的处理就像多个不同的普通规则一样。就是说多个双冒号规则中的每一个的依赖文件被改变之后,make只执行此规则定义的命令,而其它的以这个文件作为目标的双冒号规则将不会被执行。

uboot2010.09版本开始工程结构发生变化,关于板子的配置信息都独立出来放在了boards.cfg文件中,这样在我们执行不同的make <board_name>_config时,都会执行

%_config::unconfig

@$(MKCONFIG) -A $(@:_config=)

这个命令,但是uboot使用双冒号规则后,都会按照各自的<board_name>_config生成相应的目标文件,从而节省了Makefile的代码量

(1).@的作用是在执行这条命令的时候不进行显示

(2).$(MKCONFIG)的作用是:取出变量MKCONFIG的值。变量MKCONFIG定义在该Makefile上面,具体如下:

MKCONFIG:= $(SRCTREE)/mkconfig    @即当前目录下的mkconfig

(3).$(@:_config=)作用是:将目标文件名字中含有的_config的部分用等号后面的字符替换掉,这里=后面为空,所以其效果就是把_config去掉

综上所述:

执行make smdkc100_config,最终会执行如下命令:

mkconfig  -A  smdkc100

------------------------------------

          $1   $2

二:

紧接着,肯定是分析mkconfig脚本文件打开uboot更目录下面的mkconfig脚本文件,观看分析:

(1).

/*定义一些变量供后面填充*/

arch=""

cpu=""

board=""

vendor=""

soc=""

options=""

(2).

/*  $#:代表传入的参数的总个数

*  -a:代表前后两个条件都要成立

*/

if [ \( $# -eq 2 \) -a \( "$1" = "-A" \) ] ; then  @该条件是成立的,所以紧接着执行

line=`egrep -i "^[[:space:]]*${2}[[:space:]]" boards.cfg` || {

echo "make: *** No rule to make target \`$2_config'.  Stop." >&2

exit 1

}

@对红色部分代码的注释:

这里是执行egrep命令egrep命令是一个搜索文件获得模式,使用些命令可以任意搜索文件中的字符串和符号,也可以为你搜索一个多个文件的字符串,一个提示符可以是单个字符、一个字符串、一个字、一个句子)

-i参数是指:当进行比较时忽略字符的大小写

^是指:行首,用法举例。^[fuck]表示:以fuck开头的行;

[[:space:]]是指:空格或tab

^[[:space:]]则是指:以空格或tab开头的行;

*则是指:匹配零个或多个先前字符如:'*grep'匹配所有一个或多个空格后紧跟grep的行

${2}是指:第二个参数的内容,即smdkc100

||是指:和我们c语言的或的用法一样,前面成立的时候,后面不执行;

总结:

line=`egrep -i "^[[:space:]]*${2}[[:space:]]" boards.cfg`

就是指在boards.cfg文件中搜索以${2}(smdkc100)开头的行,匹配成功后,把改行保存到变量line中,因此后面的${line}的内容就是:

smdkc100       arm         armv7       smdkc100            samsung        s5pc1xx

(3).

set ${line}    @设置shell,就理解成重新录入参数,以此最终shell的参数如下:

smdkc100(目标)   arm(平台)   armv7(cpu架构)   smdkc100(板子名字)   samsung(厂商)  s5pc1xx(功能)

-----------------------------------------------------------------------------------------------------------------------------------------

   $1             $2           $3               $4                  $5            $6

[ $# = 3 ] && set ${line} ${1}    @如果传人的参数的总个数为3个,才执行set命令,不成立

(4).

while [ $# -gt 0 ] ; do  // 如果参数个数大于0个,执行下面的,成立

case "$1" in  // 类似于c中的switch,这里没有符号的case条件

--) 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

[ $# -lt 4 ] && exit 1  // 如果参数个数小于4,退出

[ $# -gt 7 ] && exit 1  // 如果参数个数大于7,退出

(5).

// 该步骤就是给(1)中定义的变量进行赋值

CONFIG_NAME="${1%_config}"    @CONFIG_NAME=smdkc100

[ "${BOARD_NAME}" ] || BOARD_NAME="${1%_config}"    @BOARD_NAME=smdkc100

arch="$2"    @arch=arm

cpu="$3"    @cpu=armv7

if [ "$4" = "-" ] ; then    @if不成立

board=${BOARD_NAME}

else

board="$4"    @board=smdkc100

fi

[ $# -gt 4 ] && [ "$5" != "-" ] && vendor="$5"    @vendor=samsung

[ $# -gt 5 ] && [ "$6" != "-" ] && soc="$6"    @soc=s5pc1xx

[ $# -gt 6 ] && [ "$7" != "-" ] && {}    @不成立

(6).

//该步骤就是打印大家常见的:Configuring for smdkc100 board...

if [ "$options" ] ; then

echo "Configuring for ${BOARD_NAME} - Board: ${CONFIG_NAME}, Options: ${options}"

else

echo "Configuring for ${BOARD_NAME} board..."

Fi

(7).

// 该步骤就是创建一些连接文件

rm -f asm    @删除现有的asm连接文件

ln -s ../arch/${arch}/include/asm asm    @重新让asm指向\arch\arm\include\asm

......

问:为什么要建立这样的连接文件呢?

答:是为了在源码中写代码的方便,比如:

    #include <asm/type.h>   //源码中的书写形式!!!!

    但是当执行完配置命令后,就相当于#include <asm-arm/type.h>。这样方便支持多种建构

(8).

//该步骤就是创建一个头文件(config.mk),用于顶层的Makefile的宏控

echo "ARCH   = ${arch}"  >  config.mk

echo "CPU    = ${cpu}"   >> config.mk

echo "BOARD  = ${board}" >> config.mk

[ "${vendor}" ] && echo "VENDOR = ${vendor}" >> config.mk

[ "${soc}"    ] && echo "SOC    = ${soc}"    >> config.mk

*********************执行以上5句命令后,相当于config.mk中有类容****************************

ARCH  = arm 

CPU   = armv7 

BOARD  = smdkc100

VENDOR  =samsung

SOC   = s5pc1xx

注意:

config.mk用于更目录的Makefile完成相关的配置筛选!!!

*******************************************************************************************

(9).

// 该步骤用于创建一个单板相关的头文件

if [ "$APPEND" = "yes" ]# Append to existing config file

then

echo >> config.h

else

> config.h新建一个config.h文件

fi

/* 以下就是填充config.h中的内容了:>是新建、>>是追加 */

echo "/* Automatically generated - do not edit */" >>config.h

echo "#define CONFIG_${i}" >>config.h ;

cat << EOF >> config.h

#define CONFIG_BOARDDIR board/$BOARDDIR

#include <config_cmd_defaults.h>

#include <config_defaults.h>

#include <configs/${CONFIG_NAME}.h>

#include <asm/config.h>

EOF

************************执行以上句命令后,相当于config.h中有类容***************************

/* Automatically generated - do not edit */

#define CONFIG_BOARDDIR board/samsung/smdkc100

#include <config_cmd_defaults.h>

#include <config_defaults.h>

#include <configs/smdkc100.h>

#include <asm/config.h>

注意:

config.h用于完成代码中相关配置的筛选!!!

*******************************************************************************************

.编译过程(make)

再看Makefile.............................

该过程和u-boot-1.1.6的过程基本一样,这里不再重述。请自己阅读“u-boot-1.1.6的配置编译过程分析.doc”。

共享以前分析uboot时做的笔记,包括:

    1.u-boot-1.1.6的配置编译过程分析.doc

    2.u-boot-2012.04.01的配置编译过程分析.doc

    3.u-boot-1.1.6完全注释,基本实现了逐行的注释。

    ...... // 后继更新的将直接上传群共享

    

    请大家原谅哈,由于我们想建立一个uboot技术交流社区,

需要经费。故上述uboot笔记,需要9元钱购买,购买链接地址:

http://item.taobao.com/item.htm?spm=0.0.0.31.lHTZaH&id=17051965131

  当然,为了让大家觉得花钱值得。大家购买后,可以凭借

购买的帐号,加入“uboot移植交流群”。

该群由我(韦东山LINUX视频的答疑助手@万勇)和吴伟东(韦东

LINUX视频的答疑助手-小吴)负责,我们会在:

每周3晚上7点到10点和每周日(下午3点到6点和晚上8点到10

点)负责答疑。和大家一起学习uboot,实现逐行分析注释uboot

我们建立该uboot技术交流群的宗旨是:

      找些人在一起,为全天下的板子移植uboot!!!!

      

入群条件:

1.你是高手,可以无条件的入群。当然有考核的;

    2.或者你是想学习的,购买“uboot完全注释”后,提供网名,入群