mkconfig分析
首先要注意一点,mkconfig文件是用来配置主Makefile中的一些参数的,但mkconfig文件本身并不是Makefile,Makefile文件只有文件名为Makefile或makefile以及后缀名为.mk的文件才是Makefile文件。mkconfig文件是一个shell脚本。
在主Makefile的后半段有对uboot的配置相关的命令,如下:
x210_sd_config
: unconfig
@
$(MKCONFIG)
$(@:_config=)
arm s5pc11x x210 samsung s5pc110
@echo "TEXT_BASE = 0xc3e00000" >
$(obj)
board/samsung/x210/config.mk
编译uboot时先执行make x210_sd_config 进行配置,这段代码中依赖unconfig是一个伪目标,执行的动作是清除配置文件。
回到x210_sd_config中,执行的第一行命令
@
$(MKCONFIG)
$(@:_config=)
arm s5pc11x x210 samsung s5pc110
作用就是向MKCONFIG中传递6个参数。这里有两点需要注意,一个是Makefile命令直接是一个文件名,经过测试发现Makefile命令为文件名会直接执行文件内的命令。第二个是对变量
$(@:_config=)
的理解,括号内的 ":"表示替换,即将$@变量里的_config赋值为空。在这里就是将变量x210_sd_config转换为x210_sd。$@变量经过测试@在括号内外都表示$@变量,没有变化。第二行打印链接地址到config.mk中。
之后再看mkconfig文件:
#!/bin/sh -e
# Script to create header files and links to configure
# U-Boot for a specific board.
#
# Parameters: Target Architecture CPU Board [VENDOR] [SOC]
#
# (C) 2002-2006 DENX Software Engineering, Wolfgang Denk <wd@denx.de>
#
最开始配置了shell的-e参数,man手册查询-e参数的解释为errexit:If not interactive, exit immediately if any untested command fails.
然后通过注释了解到mkconfig文件的作用就是创建头文件并且链接至指定板子的uboot配置文件中。随后指出接受的参数有6个,分别是 目标、架构、CPU、板子、厂家、SoC
APPEND=no
# Default: Create new config file
BOARD_NAME=
""
# Name to print in make output
while [
$#
-gt 0 ] ; do
case
"$1"
in
--) shift ; break ;;
-a
) shift ; APPEND=yes ;;
-n
) shift ; BOARD_NAME=
"${1%%_config}"
; shift ;;
*) break ;;
esac
done
[
"${BOARD_NAME}"
] || BOARD_NAME=
"$1"
[
$#
-lt 4 ] && exit 1
[
$#
-gt 6 ] && exit 1
echo
"Configuring for ${BOARD_NAME} board..."
接下来的定义两个变量,APPEND用来判断是否附加文件,默认no直接创建配置文件。BOARD_NAME保存板子名字。
while循环根据传递的参数执行相应命令,一般没有额外的参数,直接break跳出循环。
接着判断BOARD_NAME是否有值,如果没有就赋值为$1第一个参数的值。
接下来两个判断,如果参数个数小于4或者大于6就返回错误。
#
# Create link to architecture specific headers
#
if [
"$SRCTREE"
!=
"$OBJTREE"
] ; then
mkdir
-p
${OBJTREE}/include
mkdir
-p
${OBJTREE}/include2
cd
${OBJTREE}/include2
rm
-f
asm
ln
-s
${SRCTREE}/include/asm-
$2
asm
LNPREFIX=
"../../include2/asm/"
cd
../include
rm
-rf
asm-
$2
rm
-f
asm
mkdir asm-
$2
ln
-s
asm-
$2
asm
else
cd
./include
rm
-f
asm
ln
-s
asm-
$2
asm
fi
rm
-f
asm-
$2
/arch
if [
-z
"$6"
-o
"$6"
=
"NULL"
] ; then
ln
-s
${LNPREFIX}arch-
$3
asm-
$2
/arch
else
ln
-s
${LNPREFIX}arch-
$6
asm-
$2
/arch
fi
创建链接到具体架构的配置文件,if内的内容是源码目录和目标目录不同时的操作,单独输出文件夹编译时作用,略过不看。else是原地编译时的操作。
先进入./include,然后先清除asm然后链接asm-arm到asm。接着的if当$6(s5pc110)为空或为”NULL"时进行链接,这里$6是不为空的,所以链接了
ln
-s
${LNPREFIX}arch-
$6
asm-
$2
/arch 。(变量${LNPREFIX}在输出文件夹选项看到有赋值,而原地编译分支是没有赋值的,为空。)但是从实际编译uboot得到的文件可以看出这里实际并没有执行,随后在脚本后面的内容中发现对这个操作进行了更正。
还要注意的是这里进入./include后没有cd ..出来,之后的操作都是在include目录下的操作。
……
# create link for s5pc11x SoC
if [
"$3"
=
"s5pc11x"
] ; then
rm
-f
regs.
h
ln
-s
$6
.
h
regs.
h
rm
-f
asm-
$2
/arch
ln
-s
arch-
$3
asm-
$2
/arch
fi
这里看出删除了
asm-
$2
/arch
也就是之前的符号链接文件,重新链接了
ln
-s
arch-
$3
asm-
$2
/arch
#
# Create include file for Make
#
echo
"ARCH = $2"
> config.mk
echo
"CPU = $3"
>> config.mk
echo
"BOARD = $4"
>> config.mk
[
"$5"
] && [
"$5"
!=
"NULL"
] &&
echo
"VENDOR = $5"
>> config.mk
[
"$6"
] && [
"$6"
!=
"NULL"
] &&
echo
"SOC = $6"
>> config.mk
#
# 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
echo
"/* Automatically generated - do not edit */"
>>config.
h
echo
"#include <configs/$1.h>"
>>config.
h
exit 0
最后将参数输出到config.mk文件中还有创建指定板子型号的头文件。