Chinaunix首页 | 论坛 | 博客
  • 博客访问: 34427
  • 博文数量: 9
  • 博客积分: 450
  • 博客等级: 下士
  • 技术积分: 110
  • 用 户 组: 普通用户
  • 注册时间: 2009-04-05 09:09
文章分类

全部博文(9)

文章存档

2011年(1)

2009年(8)

我的朋友
最近访客

分类: LINUX

2009-05-02 12:01:27

1.顶层Makefile

        这里我们将以smdk2410为例来介绍,ubootu-boot-2009.03,首先我们应该打开u-boot的顶层Makefile,这里按照人的思维来说,我们应该首先去看看smdk2410的配置项:

smdk2410_config

 

2830 smdk2410_config :       unconfig

2831         @$(MKCONFIG) $(@:_config=) arm arm920t smdk2410 samsung s3c24x0

 

关注2831行,了解Makefile语法的朋友一定对$(@:_config=)在做什么很了解,其实它就是将$@即目标 smdk2410_config的后面的_config替换成空,所以结果就是'smdk2410',另外我们在搜索一下Makefile,就可以找到下面的语句:

 

 106 SRCTREE         := $(CURDIR)

  ...

 111 MKCONFIG        := $(SRCTREE)/mkconfig

 112 export MKCONFIG

 

很明显@$(MKCONFIG)就是当前目录下面的mkconfig。所以执行上面的2831行其实就是执行./mkconfig smdk2410 arm arm920t smdk2410 samsung s3c24x0 ok到了这一步我们就应该去看看mkconfig

 

2.mkconfig

        打开mkconfig,整个脚本很短,只有88行。

 

a.   我们应该先看看最上面的注释:

  3 # Script to create header files and links to configure

  4 # U-Boot for a specific board.

  5 #

  6 # Parameters:  Target  Architecture  CPU  Board [VENDOR] [SOC]

 

        34行告诉你这个脚本的作用,6行介绍了它的参数的含义。

 

b. 接下来,获得BOARD_NAME

 11 APPEND=no       # Default: Create new config file

 12 BOARD_NAME=""   # Name to print in make output

 13

 14 while [ $# -gt 0 ] ; do

 15         case "$1" in

 16         --) shift ; break ;;

 17         -a) shift ; APPEND=yes ;;

 18         -n) shift ; BOARD_NAME="${1%%_config}" ; shift ;;

 19         *)  break ;;

 20         esac

 21 done

 22

 23 [ "${BOARD_NAME}" ] || BOARD_NAME="$1"

 24

 25 [ $# -lt 4 ] && exit 1

 26 [ $# -gt 6 ] && exit 1

 27

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

 

        14行,判断参数的个数($#)是否大于零,之后判断$1中有没有-,有的话就左移一个位置,没有就出来,很明显参数中没有带-的,那么就会执行到23行,&&相当于“if...then...”,而||相当于“if not...then...”,所以这里就表示如果 BOARD_NAME为空,就使 BOARD_NAME$1, BOARD_NAME'smdk2410'.  25, 26行判断参数的个数如果小于4或者大于6就退出,参数的个数可以为4,5或者6。

 

c. 创建到平台,开发板相关的头文件的链接

 30 #

 31 # Create link to architecture specific headers

 32 #

 33 if [ "$SRCTREE" != "$OBJTREE" ] ; then

 34         mkdir -p ${OBJTREE}/include

 35         mkdir -p ${OBJTREE}/include2

 36         cd ${OBJTREE}/include2

 37         rm -f asm

 38         ln -s ${SRCTREE}/include/asm-$2 asm

 39         LNPREFIX="../../include2/asm/"

 40         cd ../include

 41         rm -rf asm-$2

 42         rm -f asm

 43         mkdir asm-$2

 44         ln -s asm-$2 asm

 45 else

 46         cd ./include

 47         rm -f asm

 48         ln -s asm-$2 asm

 49 fi

 50

 51 rm -f asm-$2/arch

 52

 53 if [ -z "$6" -o "$6" = "NULL" ] ; then

 54         ln -s ${LNPREFIX}arch-$3 asm-$2/arch

 55 else

 56         ln -s ${LNPREFIX}arch-$6 asm-$2/arch

 57 fi

 58

 59 if [ "$2" = "arm" ] ; then

 60         rm -f asm-$2/proc

 61         ln -s ${LNPREFIX}proc-armv asm-$2/proc

 62 fi

 

        33行判断源码目录跟目标文件目录是否一致,不一致的话就在目标文件目录创建相关的文件和链接,这样可以使源码目录保持干净,不过我们一般都是直接在源码目录进行编译的,所以这里执行的是 else后面的语句,46-48行,进入./include中,删除掉原来的asm目录,因为可能你之前就已经编译过了,然后再次建立asm,并让它链接到asm-$2,这里是连接到asm-arm

    之后51行删除到asm-$2下面的arch53行因为$6s3c24x0,不为空也不为NULL,所以将会执行56行,而 LNPREFIX为空,所以这句实际上执行的是“ln -s arch-$6 asm-$2/arch”,也就是创建asm-arm/arch ,并将其链接到arch-s3c24x0

59-61行,如果$2=arm的话,重新建立一下asm-arm/proc目录,并将它链接到 proc-armv

 

d. 之后创建顶层Makefile包含的文件include/config.mk

 64 #

 65 # Create include file for Make

 66 #

 67 echo "ARCH   = $2" >  config.mk

 68 echo "CPU    = $3" >> config.mk

 69 echo "BOARD  = $4" >> config.mk

 70

 71 [ "$5" ] && [ "$5" != "NULL" ] && echo "VENDOR = $5" >> config.mk

 72

 73 [ "$6" ] && [ "$6" != "NULL" ] && echo "SOC    = $6" >> config.mk

 

    这几句很简单,就是创建config.mk,请注意,之前46行我们就已经在include目录下面了,因此这几行执行完成后,config.mk的内容就应该是下面的样子:

ARCH            =     arm

CPU               =     arm920t

BOARD          =     smdk2410

VENDOR       =     samsung

SOC                     =     s3c24x0

 

e.  最后就开始创建include/config.h:

 75 #

 76 # Create board specific header file

 77 #

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

 79 then

 80         echo >> config.h

 81 else

 82         > config.h              # Create new config file

 83 fi

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

 85 echo "#include " >>config.h

 86 echo "#include " >>config.h

 87

 88 exit 0

 

    上面的代码很好理解,首先因为之前APPEND=no,所以我们就会执行82行,创建一个config.h文件,然后84-86行将一个注释和两个头文件写入config.h中。

 

         到这里这个mkconfig文件就完了,这里我稍微小结一下这个文件所做的工作,不然头会有点晕:

        (1).   BOARD_NAME='smdk2410'

        (2).   ln -s asm-arm asm

                 ln -s arch-s3c24x0 asm-arm/arch

                 ln -s proc-armv asm-arm/proc

        (3).   创建include/config.mk

        (4).   创建include/config.h

 

    到了这里我们就已经可以算是配置完成了,为什么了?请注意最后生成的include/config.h之中包含了两个头文件,对于2410来说的这两个头文件就是config/smdk2410.h,以及asm/config.h(asm-arm/config.h), 如果你打开这两个文件就会发现很多CONFIG_的宏定义(当然 asm-arm/config.h没有定义任何东西,但是在其他平台的这个文件中就有一些宏定义了)。

阅读(1041) | 评论(2) | 转发(0) |
给主人留下些什么吧!~~

mingrentian2009-06-29 18:02:48

感谢指正,确实如sinygl所说,应该是小于4或者大于6就会退出,这样算的话,应该是4,5,6都可以才是,之前误以为要大于4小于6,就只能是5了。 再次表示感谢,一会我就会改过来。

sinygl2009-06-29 16:46:50

25 [ $# -lt 4 ] && exit 1 26 [ $# -gt 6 ] && exit 1 这两行的意思不是必须等于5,而是把参数的个数限制在4-6个。这从mkconfig的脚本说明可以看出来。