前言:只是记笔记,没想到分析了这么多,如果有错请各位大佬指出来。
由于需要移植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;&</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;></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编译部分。
[:space:] ↩︎