uboot-2012.04.01配置与编译分析(一)

前言:只是记笔记,没想到分析了这么多,如果有错请各位大佬指出来。

由于需要移植uboot-2012.04.01到JZ2440开发板,所以先下载了uboot-2012.04.01进行配置与编译分析。

一、编译步骤

一般情况下下载一个uboot之后解压,进入根目录下,我们的编译步骤分以下两个步骤:
1.make xxx_config(由于uboot-2012.04.01不支持2440,我们先编译2410的,执行make smdk2410_config);
2.make all;

    
    
  • 1
  • 2
  • 3

二、编译步骤分析

1.make smdk2410_config

当我们执行该命令后,makefile中下列规则被执行:

%_config:: unconfig
    @$<span class="token punctuation">(</span>MKCONFIG<span class="token punctuation">)</span> <span class="token operator">-</span>A $<span class="token punctuation">(</span>@<span class="token punctuation">:</span>_config<span class="token operator">=</span><span class="token punctuation">)</span>
  • 1
  • 2
  • 3

查看Makfile文件,MKCONFIG等于根目录下的Mkconfig,所以执行该命令相当于执行 ./Mkconfig -A smdk2410,至于$(@:_config=)大家可以百度其作用,这里不在叙述。
我们这里先分析一下根目录下Mkfoncig文件:

第一部分:

APPEND=no	# Default: Create new config file
BOARD_NAME=""	# Name to print in make output
TARGETS=""

arch=""
cpu=""
board=""
vendor=""
soc=""
options=""

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

开始先定义一些变量,这些变量将会在后面填充,具体内容及每个变量代表的意义这里列个表格(具体的变量内容怎么来的,后面分析):
在这里插入图片描述
第二部分:

if [ \( $# -eq 2 \) -a \( "$1" = "-A" \) ] ; then   //*$#为参数个数,我们这里有两个参数,分别是 -A 与 smdk2410,所以等于2*
	# Automatic mode				                //*-a的意思是两个条件都要满足,这里我们两个都满足,进入then部分*
	line=`egrep -i "^[[:space:]]*${2}[[:space:]]" boards.cfg` || {
		echo "make: *** No rule to make target \`$2_config'.  Stop." >&2
		exit 1
	}

// 因为上面用到了egrep搜索字符,该命令不熟悉的可以百度一下用法,-i参数是忽略大小写;
// ^是指:行首;
// [[:space:]]是指:空格或tab;
// 1则是指:以空格或tab开头的行;
// *则是指:匹配零个或多个先前字符;
// ${2}是指:第二个参数的内容,即smdkc2410;
// ||是指:和我们c语言的或的用法一样,前面成立的时候,后面不执行;
// 这句话的意思是在boards.cfg文件中搜索以smdkc2410开头的行,最后保存在line中

set $<span class="token punctuation">{<!-- --></span>line<span class="token punctuation">}</span>  

//设置shell,重新录入参数,这里执行完之后,命令行参数就会发生变化。变化如下:
// $1 $2 $3 $4 $5 $6
// smdk2410 arm arm920t - samsung s3c24x0
# add default board name if needed
[ $# = 3 ] && set ${ line} < s p a n c l a s s = " t o k e n p u n c t u a t i o n " > < ! − − − − > < / s p a n > < s p a n c l a s s = " t o k e n n u m b e r " > 1 < / s p a n > < s p a n c l a s s = " t o k e n p u n c t u a t i o n " > < / s p a n > < s p a n c l a s s = " t o k e n c o m m e n t " > / / 如 果 传 入 的 参 数 为 三 个 , 执 行 s e t ; < / s p a n > e l i f < s p a n c l a s s = " t o k e n p u n c t u a t i o n " > [ < / s p a n > < s p a n c l a s s = " t o k e n s t r i n g " > " <span class="token punctuation">{<!-- --></span><span class="token number">1</span><span class="token punctuation">}</span> <span class="token comment">//如果传入的参数为三个,执行set;</span> elif <span class="token punctuation">[</span> <span class="token string">" <spanclass="tokenpunctuation"><!></span><spanclass="tokennumber">1</span><spanclass="tokenpunctuation"></span><spanclass="tokencomment">//set</span>elif<spanclass="tokenpunctuation">[</span><spanclass="tokenstring">"{MAKEFLAGS+set}${MAKELEVEL+set}" = “setset” ] ; then
# only warn when using a config target in the Makefile
cat <<-EOF

warning<span class="token punctuation">:</span> Please migrate to boards<span class="token punctuation">.</span>cfg<span class="token punctuation">.</span>  Failure to <span class="token keyword">do</span> so will
         mean removal of your board in the next release<span class="token punctuation">.</span>

<span class="token constant">EOF</span>
sleep <span class="token number">5</span>

fi

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32

上面代码对每一句都进行了注释,执行完之后命令行参数就已经被改变了,接着往下看:

while [ $# -gt 0 ] ; do   //如果参数大于0,执行下列代码
	case "$1" in
	--) 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退出

 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

第三部分
该部分代码对之前定义的变量进行赋值:

CONFIG_NAME="${1%_config}"       //CONFIG_NAME=smdk2410

[ B O A R D N A M E " < / s p a n > < s p a n c l a s s = " t o k e n p u n c t u a t i o n " > ] < / s p a n > < s p a n c l a s s = " t o k e n o p e r a t o r " > ∣ ∣ < / s p a n > B O A R D N A M E < s p a n c l a s s = " t o k e n o p e r a t o r " > = < / s p a n > < s p a n c l a s s = " t o k e n s t r i n g " > " {BOARD_NAME}"</span> <span class="token punctuation">]</span> <span class="token operator">||</span> BOARD_NAME<span class="token operator">=</span><span class="token string">" BOARDNAME"</span><spanclass="tokenpunctuation">]</span><spanclass="tokenoperator"></span>BOARDNAME<spanclass="tokenoperator">=</span><spanclass="tokenstring">"{1%_config}” //BOARD_NAME=smdk2410

arch="$2" //arch=arm
cpu="$3" //cpu=arm920t
if [ 4 " < / s p a n > < s p a n c l a s s = " t o k e n o p e r a t o r " > = < / s p a n > < s p a n c l a s s = " t o k e n s t r i n g " > " − " < / s p a n > < s p a n c l a s s = " t o k e n p u n c t u a t i o n " > ] < / s p a n > < s p a n c l a s s = " t o k e n p u n c t u a t i o n " > ; < / s p a n > t h e n b o a r d < s p a n c l a s s = " t o k e n o p e r a t o r " > = < / s p a n > 4"</span> <span class="token operator">=</span> <span class="token string">"-"</span> <span class="token punctuation">]</span> <span class="token punctuation">;</span> then board<span class="token operator">=</span> 4"</span><spanclass="tokenoperator">=</span><spanclass="tokenstring">""</span><spanclass="tokenpunctuation">]</span><spanclass="tokenpunctuation">;</span>thenboard<spanclass="tokenoperator">=</span>{ BOARD_NAME} //board=smdk2410
else
board=”$4"
fi
[ $# -gt 4 ] && [ “$5” != “-” ] && vendor="$5" //vendor=samsung
[ $# -gt 5 ] && [ “$6” != “-” ] && soc="$6" //soc=s3c24x0
[ $# -gt 6 ] && [ KaTeX parse error: Expected 'EOF', got '&' at position 158: …oken operator">&̲amp;&amp;</span…{7%:}"
if [ t m p " < / s p a n > < s p a n c l a s s = " t o k e n p u n c t u a t i o n " > ] < / s p a n > < s p a n c l a s s = " t o k e n p u n c t u a t i o n " > ; < / s p a n > t h e n C O N F I G N A M E < s p a n c l a s s = " t o k e n o p e r a t o r " > = < / s p a n > < s p a n c l a s s = " t o k e n s t r i n g " > " tmp"</span> <span class="token punctuation">]</span> <span class="token punctuation">;</span> then CONFIG_NAME<span class="token operator">=</span><span class="token string">" tmp"</span><spanclass="tokenpunctuation">]</span><spanclass="tokenpunctuation">;</span>thenCONFIGNAME<spanclass="tokenoperator">=</span><spanclass="tokenstring">"tmp”
fi
# Check if we only have a colon…
if [ “${tmp}” != " 7 " < / s p a n > < s p a n c l a s s = " t o k e n p u n c t u a t i o n " > ] < / s p a n > < s p a n c l a s s = " t o k e n p u n c t u a t i o n " > ; < / s p a n > t h e n o p t i o n s < s p a n c l a s s = " t o k e n o p e r a t o r " > = < / s p a n > 7"</span> <span class="token punctuation">]</span> <span class="token punctuation">;</span> then options<span class="token operator">=</span> 7"</span><spanclass="tokenpunctuation">]</span><spanclass="tokenpunctuation">;</span>thenoptions<spanclass="tokenoperator">=</span>{ 7#:}
TARGETS=echo ${options} | sed 's:,: :g' ${TARGETS}"
fi
}

if [ A R C H " < / s p a n > < s p a n c l a s s = " t o k e n o p e r a t o r " > − < / s p a n > a < s p a n c l a s s = " t o k e n s t r i n g " > " {ARCH}"</span> <span class="token operator">-</span>a <span class="token string">" ARCH"</span><spanclass="tokenoperator"></span>a<spanclass="tokenstring">"{ARCH}” != “${arch}” ]; then
echo “Failed: $ARCH= A R C H , s h o u l d b e ′ {ARCH}, should be ' ARCH,shouldbe{arch}’ for ${BOARD_NAME}” 1>&2
exit 1
fi

if [ “$options” ] ; then //该步骤就是配置时的打印信息Configuring for smdk2410 board…(这里options为假,执行else部分)
echo “Configuring for ${BOARD_NAME} - Board: ${CONFIG_NAME}, Options: ${options}”
else
echo “Configuring for ${BOARD_NAME} board…”
fi

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41

第四部分

这一部分是创建一些链接文件,之所以要创建链接文件这里提一下,是为了写代码方便,比如:
#include <asm/type.h> //源码中的书写形式!!!!

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

if [ "$SRCTREE" != "$OBJTREE" ] ; then  //因为我们没有指定编译目录,采用默认的所以这里不成立,执行then部分
	mkdir -p ${OBJTREE}/include
	mkdir -p ${OBJTREE}/include2
	cd ${OBJTREE}/include2
	rm -f asm
	ln -s ${SRCTREE}/arch/${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        //创建一个链接文件asm
fi

rm -f asm/arch

if [ -z “${soc}” ] ; then //soc=s3c24x0,所以执行if语句(-z判断字符串是否为空)
ln -s < s p a n c l a s s = " t o k e n p u n c t u a t i o n " > < ! − − − − > < / s p a n > L N P R E F I X < s p a n c l a s s = " t o k e n p u n c t u a t i o n " > < / s p a n > a r c h < s p a n c l a s s = " t o k e n o p e r a t o r " > − < / s p a n > <span class="token punctuation">{<!-- --></span>LNPREFIX<span class="token punctuation">}</span>arch<span class="token operator">-</span> <spanclass="tokenpunctuation"><!></span>LNPREFIX<spanclass="tokenpunctuation"></span>arch<spanclass="tokenoperator"></span>{ cpu} asm/arch
else
ln -s < s p a n c l a s s = " t o k e n p u n c t u a t i o n " > < ! − − − − > < / s p a n > L N P R E F I X < s p a n c l a s s = " t o k e n p u n c t u a t i o n " > < / s p a n > a r c h < s p a n c l a s s = " t o k e n o p e r a t o r " > − < / s p a n > <span class="token punctuation">{<!-- --></span>LNPREFIX<span class="token punctuation">}</span>arch<span class="token operator">-</span> <spanclass="tokenpunctuation"><!></span>LNPREFIX<spanclass="tokenpunctuation"></span>arch<spanclass="tokenoperator"></span>{ soc} asm/arch
fi

if [ “${arch}” = “arm” ] ; then //条件成立
rm -f asm/proc
ln -s ${ LNPREFIX}proc-armv asm/proc
fi

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27

第五部分

这一部分是创建make编译时包含的mk文件,下面这几行代码执行完毕之后,相当于config.mk文件中如下内容:
ARCH=arm
CPU=arm920t
BOARD=smdk2410
VENDOR=samsung
SOC=s3c24x0
BOARDDIR=smdk2410

echo "ARCH   = ${arch}"  >  config.mk      //>创建文件,目录为./include,因为此时makefile还在改目录
echo "CPU    = ${cpu}"   >> config.mk
echo "BOARD  = ${board}" >> config.mk

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

[ “${soc}” ] && echo “SOC = KaTeX parse error: Expected 'EOF', got '&' at position 47: …oken operator">&̲gt;&gt;</span> …{vendor}” ] ; then
BOARDDIR= < s p a n c l a s s = " t o k e n p u n c t u a t i o n " > < ! − − − − > < / s p a n > b o a r d < s p a n c l a s s = " t o k e n p u n c t u a t i o n " > < / s p a n > < s p a n c l a s s = " t o k e n k e y w o r d " > e l s e < / s p a n > B O A R D D I R < s p a n c l a s s = " t o k e n o p e r a t o r " > = < / s p a n > <span class="token punctuation">{<!-- --></span>board<span class="token punctuation">}</span> <span class="token keyword">else</span> BOARDDIR<span class="token operator">=</span> <spanclass="tokenpunctuation"><!></span>board<spanclass="tokenpunctuation"></span><spanclass="tokenkeyword">else</span>BOARDDIR<spanclass="tokenoperator">=</span>{ vendor}/${ board}
fi

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

第六部分

//这里我们APPEND-no,执行else部分代码,创建一个config.h文件,目录还是在上面目录./inlcude
if [ "$APPEND" = "yes" ]	# Append to existing config file
then
	echo >> config.h
else          
	> config.h		# Create new config file
fi
echo "/* Automatically generated - do not edit */" >>config.h

for i in ${ TARGETS} ; do
i="echo ${i} | sed '/=/ {s/=/ /;q; } ; { s/$/ 1/; }'"
echo “#define CONFIG_${i}” >>config.h ;
done

cat << EOF >> config.h
#define CONFIG_BOARDDIR board/KaTeX parse error: Expected 'EOF', got '#' at position 52: …acro property">#̲<span class="to…{CONFIG_NAME}.h>
#include <asm/config.h>
EOF

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21

执行完上述代码后相当于config.h文件中有以下内容:
/* Automatically generated - do not edit */
#define CONFIG_BOARDDIR board/samsung/smdk2410
#include <config_cmd_defaults.h>
#include <config_defaults.h>
#include <configs/smdk2410.h>
#include <asm/config.h>

到此,配置就结束了,我们在下一篇中分析make编译部分。


  1. [:space:] ↩︎

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值