uboot之Makefile配置流程分析(uboot2012.04.01)

本文介绍了U-Boot的配置方法及构建流程。通过详细解析makesmdk2440_config命令,阐述了如何配置并准备编译环境。此外,还讲解了如何使用make命令完成U-Boot项目的构建。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、uboot配置方法

在拿到uboot源码之后,我们需要做的第一件事就是配置uboot,我们以s3c2440为例:

make smdk2440_config

在执行这条命令之后,就可以直接使用make进行uboot的编译。

二、make smdk2440_config具体做了什么

第一步,我们需要在makefile中找到smdk2440_config这条命令,但是直接搜索smdk2440_config会发现,makefile中并没有这个字段,但是在Makefile中存在如下一段脚本:

unconfig:
	@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.dep

%_config::	unconfig
	@$(MKCONFIG) -A $(@:_config=)

%为通配符,表示匹配所有符合_config格式的字符串,所以执行make smdk2440_config之后,Makefile会从这里开始执行。

接下来我们需要分析@$(MKCONFIG) -A $(@:_config=):

@表示取消回显,MKCONFIG的定义如下:

SRCTREE		:= $(CURDIR)

MKCONFIG	:= $(SRCTREE)/mkconfig

$(@:_config=)的表示将smdk2440_config中的_config替换成空,括号中的@表示smdk2440_config。

上述隐含规则展开得到:

@ $(SRCTREE)/mkconfig -A smdk2440

然后我们打开当前目录下的mkconfig文件:

if [ \( $# -eq 2 \) -a \( "$1" = "-A" \) ] ; then
	# Automatic mode
	line=`egrep -i "^[[:space:]]*${2}[[:space:]]" boards.cfg` || {
		echo "make: *** No rule to make target \`$2_config'.  Stop." >&2
		exit 1
	}

	set ${line}
	# add default board name if needed
	[ $# = 3 ] && set ${line} ${1}
elif [ "${MAKEFLAGS+set}${MAKELEVEL+set}" = "setset" ] ; then
	# only warn when using a config 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

$# 表示执行脚本传入参数的个数,-eq表示等于,1表示传入的第一个参数。第一句话的意思表示如果传入的参数个数为2,并且第一个参数为−A,则执行then之后的语句,显然我们前面的1表示传入的第一个参数。第一句话的意思表示如果传入的参数个数为2,并且第一个参数为-A,则执行then之后的语句,显然我们前面的12A,then(SRCTREE)/mkconfig -A smdk2440命令满足这个条件。

line=`egrep -i "^[[:space:]]*${2}[[:space:]]" boards.cfg`

egrep是一条shell命令,作用和grep类似。

  • -i参数是指:当进行比较时忽略字符的大小写;
  • ^ 表示行首;
  • [[:space:]]是指:空格或tab;
  • ^ [[:space:]]则是指:以空格或tab开头的行;
  • *表示匹配零个或多个先前字符。
  • ${2}是指传入的第二个参数smdk2440;

我们在后面使用echo ${line}打印line的值,可以在shell中看到如下内容:

smdk2440 arm arm920t - samsung s3c24x0

set ${line}表示重新设置shell输入参数,这条命令执行之后,$1表示smdk2440,$2表示arm,以此类推。

[ $# = 3 ] && set ${line} ${1}含义是,只有当传入参数等于3时,才执行set ${line}命令,显然我们这里有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}/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
fi

rm -f asm/arch

if [ -z "${soc}" ] ; then
	ln -s ${LNPREFIX}arch-${cpu} asm/arch
else
	ln -s ${LNPREFIX}arch-${soc} asm/arch
fi

if [ "${arch}" = "arm" ] ; then
	rm -f asm/proc
	ln -s ${LNPREFIX}proc-armv asm/proc
fi

默认情况下,SRCTREE和OBJTREE相同,因此会进入include目录,删除该目录下的asm文件、asm/arch目录、asm/proc目录,并使用ln命令重新产生对应的文件,对应关系如下:

  • asm 指向 arch/arm/include/asm
  • asm/arch 指向arch/arm/include/asm/arch
  • asm/proc 指向arch/arm/include/asm/proc
echo "ARCH   = ${arch}"  >  config.mk

${arch}展开之后是arm,这条命令表示将ARCH = arm输出到当前目录(include)的config.mk文件中,后面几条命令类似,config.mk会作为后续make命令的配置文件来构建uboot。

mkconfig最后的几条命令表示将几个重要的头文件写入到config.h文件中。

至此,make smdk2440_config执行完毕。

三、使用make命令构建uboot工程

执行make smdk2440_config命令之后,我们可以直接在uboot目录下,执行make命令编译uboot。

由于makefile比较复杂,这里只简单介绍一些常用的内容。

3.1、makefile在链接过程中会指定uboot存放在flash中的位置

这个地址可以在make之后,在shell中看到,我的是33f00000,通过grep -nr 33f800000可以找到这个地址定义的位置。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kVpUUuBl-1605862888656)(1AC5DB76795F4916833D47506A2D8376)]

3.2、清除以构建的项目

make distclean
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值