1、转GNU ARM汇编十七uboot的makefile和mkconfig解读(转)GNU ARM汇编-(十七)u-boot的makefile和mkconfig解读 自己写的bootloader可以引导kernel了,我以为曾经神秘的u-boot代码将变得毫无挑战,然事实表明u-boot作为优秀的开源代码,阅读起来还是很有挑战的,值得一读! 阅读碰到的头等问题:Makefile和shell脚本看不懂. 说起来做linux也很久了,Makefile和shell脚本都接触过,但真的都是略懂而已.因为公司的Makefile和shell简单的一眼望的对穿,很初级的写法,简单的应用.再随便在网上下个老外的开
2、源代码,那个Makefile和shell复杂啊.一不留神想起来了qt的qmake根据工程文件生成的Makefile也是很简单,但qmake是人家老外写的.不说其他语言了,只看Makefile和shell,中外的差距就在那了. 这次准备移植u-boot到tq2440上,选用的u-boot版本是u-boot-2012.07. 下面是我对u-boot配置和编译的makefile mkconfig config.mk等文件的解读,有些解读我是在源档上添加文字注释的,有些是另外写的,解读难免有误,若有读者发现了,希望能够指出,在下感激不尽! 在编译u-boot的过程,就是make xxx_config和
3、make两步 以make smdk2410_config为例: 当以smdk2410_config为目标时,makefile中前面一些变量的定义和其他文件的引用也是有的,这个在原档中添加了有关注释: 在makefile中有: cpp view plaincopyunconfig: rm -f $(obj)include/config.h $(obj)include/config.mk $(obj)board/*/config.tmp $(obj)board/*/*/config.tmp $(obj)include/autoconf.mk $(obj)include/autoconf.mk.de
4、p %_config: unconfig echo $ $(MKCONFIG) -A $(:_config=) %是个通配符,make xxx_config都是这个目标.目标的依赖是unconfig,unconfig的命令是删除一些文件,而这些文件正是从make xxx_config过程中产生的.unconfig就是清理配置的. 我们来看$(MKCONFIG) -A $(:_config=) 其实执行的是mkconfig -A smdk2410 我们可以在该行上面添加一行:echo $ 则会输出smdk2410_config,因为$就是指目标 $(:_config=)是变量的替换引用 格式为“
5、$(VAR:A=B)”(或者“$VAR:A=B”),意思是:替换变量“VAR”中所有“A”字符结尾的字为“B”结尾的字。所以smdk2410_config末尾的_config去除了. 下面就是执行mkconfig脚本了,mkconfig -A smdk2410 给出添加注释的mkconfig文件: cpp view plaincopy#!/bin/sh -e # Script to create header files and links to configure # U-Boot for a specific board. # # Parameters: Target Architectu
6、re CPU Board VENDOR SOC # # (C) 2002-2010 DENX Software Engineering, Wolfgang Denk <wddenx.de> # APPEND=no # Default: Create new config file BOARD_NAME= # Name to print in make output TARGETS= arch= cpu= board= vendor= soc= options= echo $# if ( $# -eq 2 ) -a ( $1 = -A ) ; then # Automatic mod
7、e line=egrep -i :space:*$2:space: boards.cfg | echo make: * No rule to make target $2_config. Stop. >&2 exit 1 set $line echo $line echo $# # add default board name if needed $# = 3 && set $line $1 # #我们执行脚本的命令是mkconfig -A smdk2410,$#表示的是参数的个数,$1表示的是第一个参数 #line 就是在boards.cfg文件中smdk241
8、0的那行,而-i表示忽略大小写 #在boards.cfg文件中,有 #Target ARCH CPU Board name Vendor SoC Options #smdk2410 arm arm920t - samsung s3c24x0 # set $line # set也可用于在脚本内部给出其运行参数,所以这个时候参数就变为smdk2410 arm arm920t - samsung s3c24x0 #这个时候参数个数就变成6个了 # elif $MAKEFLAGS+set$MAKELEVEL+set = setset ; then # only warn when using a co
9、nfig target in the Makefile cat <<-EOF warning: Please migrate to boards.cfg. Failure to do so will mean removal of your board in the next release. EOF sleep 5 fi echo $1 while $# -gt 0 ; do case $1 in -) shift ; break ; -a) shift ; APPEND=yes ; -n) shift ; BOARD_NAME=$1%_config ; shift ; -t)
10、shift ; TARGETS=echo $1 | sed s:_: :g $TARGETS ; shift ; *) break ; esac done # #因为$1的值为smdk2410,所以case找不到对应的 # $# -lt 4 && exit 1 $# -gt 7 && exit 1 # #对参数个数做检查,小于4个或大于7个就退出 # # Strip all options and/or _config suffixes CONFIG_NAME=$1%_config # #CONFIG_NAME的值为smdk2410 # echo config_
11、 echo $CONFIG_NAME $BOARD_NAME | BOARD_NAME=$1%_config echo board echo $BOARD_NAME # #如果BOARD_NAME在之前已经被设定了,就不做任何动作;如果为空,就设定为smdk2410.这里设定为smdk2410 # arch=$2 cpu=$3 if $4 = - ; then board=$BOARD_NAME else board=$4 fi # #设定arch变量的值为arm #cpu变量的值为arm920t #因为第四个变量为-,所以board变量的值为smdk2410 # $# -gt 4 &
12、& $5 != - && vendor=$5 $# -gt 5 && $6 != - && soc=$6 # #设定verdor变量的值为samsung #设定soc变量的值为s3c24x0 # $# -gt 6 && $7 != - && # check if we have a board config name in the options field # the options field mave have a board config name and a list # of options,
13、both separated by a colon (:); the options are # separated by commas (,). # # Check for board name tmp=$7%:* if $tmp ; then CONFIG_NAME=$tmp fi # Check if we only have a colon. if $tmp != $7 ; then options=$7#*: TARGETS=echo $options | sed s:,: :g $TARGETS fi # #因为我们的变量个数就是6个,这一段不执行 # echo $ARCH ech
14、o $arch if $ARCH -a $ARCH != $arch ; then echo Failed: $ARCH=$ARCH, should be $arch for $BOARD_NAME 1>&2 exit 1 fi # #ARCH是在顶层makefile中定义的,在此刻还是为空的。 #如果ARCH已经有值了,那么就检测ARCH和arch是否匹配了. # if $options ; then echo Configuring for $BOARD_NAME - Board: $CONFIG_NAME, Options: $options else echo Confi
15、guring for $BOARD_NAME board. fi # #我们没有定义options变量,所以输出Configuring for smdk2410 board. # # # Create link to architecture specific headers # echo $SRCTREE echo $OBJTREE if $SRCTREE != $OBJTREE ; then mkdir -p $OBJTREE/include mkdir -p $OBJTREE/include2 cd $OBJTREE/include2 rm -f asm ln -s $SRCTREE/a
16、rch/$arch/include/asm asm LNPREFIX=$SRCTREE/arch/$arch/include/asm/ cd ./include mkdir -p asm else cd ./include rm -f asm ln -s ./arch/$arch/include/asm asm fi # #在makefile中我们已经知道SRCTREE和OBJTREE都是当前目录,所以这里执行else #进入./include目录,删除asm链接,并重新建立链接asm,指向arch/arm/include/asm # rm -f asm/arch # #删除include目录
17、下的asm下的arch链接文件 # ss= echo $ss if -z $ss ; then echo null else echo not null fi echo $LNPREFIX if -z $soc ; then ln -s $LNPREFIXarch-$cpu asm/arch else ln -s $LNPREFIXarch-$soc asm/arch fi # #-z用来检测字符串是否为空,为空返回真 #这里我们的soc不为空,执行else #将asm/arch链向arch-s3c24x0,看一下arch-s3c24x0目录,里面都是s3c24x0相关的头文件 # if $a
18、rch = arm ; then rm -f asm/proc ln -s $LNPREFIXproc-armv asm/proc fi # #删除asm/proc链接文件 #将asm/proc链向proc-armv目录,该目录下是四个头文件:domain.hprocessor.hptrace.hsystem.h # # # Create include file for Make # echo ARCH = $arch > config.mk echo CPU = $cpu >> config.mk echo BOARD = $board >> config.m
19、k $vendor && echo VENDOR = $vendor >> config.mk $soc && echo SOC = $soc >> config.mk # #上面几句的作用在注释中描述的很清楚 #include/config.mk的文件如下: #ARCH = arm #CPU = arm920t #BOARD = smdk2410 #VENDOR = samsung #SOC = s3c24x0 # # Assign board directory to BOARDIR variable if -z $vendor ;
20、then BOARDDIR=$board else BOARDDIR=$vendor/$board fi echo $BOARDDIR # #因为vendor变量不为空,所以执行else #BOARDDIR的值为samsung/s3c24x0 # # # 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 # #在文件的最开头可
21、以看到APPEND为no,所以这里我们在include文件夹下建立config.h文件 # echo /* Automatically generated - do not edit */ >>config.h echo $TARGETS for i in $TARGETS ; do i=echo $i | sed /=/ s/=/ /;q; ; s/$/ 1/; echo #define CONFIG_$i >>config.h ; done # #这里我们TARGETS为空,上面不执行了 # echo #define CONFIG_SYS_ARCH $arch &g
22、t;> config.h echo #define CONFIG_SYS_CPU $cpu >> config.h echo #define CONFIG_SYS_BOARD $board >> config.h $vendor && echo #define CONFIG_SYS_VENDOR $vendor >> config.h $soc && echo #define CONFIG_SYS_SOC $soc >> config.h cat << EOF >> config.h #define CONFIG_BOARDDIR board/$BOARDDIR #include <config_cmd_defaults.h> #include <config_defaults.h> #include &
copyright@ 2008-2023 冰点文库 网站版权所有
经营许可证编号:鄂ICP备19020893号-2