uboot主编译脚本分析

这里是对uboot的Makefile做的一个比较详细的分析

生成版本信息

VERSION = 1
...
U_BOOT_VERSION = $(VERSION).$(PATCHLEVEL).$(SUBLEVEL)$(EXTRAVERSION)
VERSION_FILE = $(obj)include/version_autogenerated.h

软件都是有不同版本的,uboot也不例外,在makefile开头几行就定义了版本信息,并导出到一个头文件中

导出架构信息

HOSTARCH := $(shell uname -m | \
	sed -e s/i.86/i386/ \
    ...

HOSTOS := $(shell uname -s | tr '[:upper:]' '[:lower:]' | \
	    sed -e 's/\(cygwin\).*/cygwin/')

export	HOSTARCH HOSTOS

获得当前主机的架构和系统,导出到环境变量备用

静默安装

静默安装原理很简单,只不过是把echo替换成了*?

静默安装时脚本就不会输出那么多没用信息了

uboot链接文件产生位置

# U-boot build supports producing a object files to the separate external
# directory. Two use cases are supported:
...

和其他大型的项目类似,uboot也可以把链接文件输出位置重定义到某个位置

而且uboot提供了两种方式重定义输出

# 1) Add O= to the make command line
# 'make O=/tmp/build all'
#
# 2) Set environement variable BUILD_DIR to point to the desired location
# 'export BUILD_DIR=/tmp/build'
# 'make'

实现的过程

这部分看看脚本就会明白,这里大概说一下

先判断定义的是O还是直接定义的BUILD_DIR,定义的是O的话就把O的值赋给BUILD_DIR(非空)

接下来就定义并导出了OBJTREE(BUILD_DIR设置过来的链接文件的位置) SRCTREE(当前目录设置来的源码目录) TOPDIR(当前目录设置为顶层) LNDIR(OBJTREE保存为链接文件位置)

定义并导出MKCONFIG(SRCTREE下的mkconfig脚本,用于配置uboot)

如果OBJTREESRCTREE不等就定义并导出REMOTE_BUILD,并obj := $(OBJTREE) src := $(SRCTREE)

配置交叉编译工具链

从*$(obj)include/config.mk导入ARCH CPU BOARD VENDOR SOC这几个变量,config.mk这个文件是make x210_sd_config*产生的,x210_sd_config在Makefile的最后一部分有定义,这是为了确保Makefile的通用性

x210_sd_config :	unconfig
	@$(MKCONFIG) $(@:_config=) arm s5pc11x x210 samsung s5pc110
	@echo "TEXT_BASE = 0xc3e00000" > $(obj)board/samsung/x210/config.mk

之后就是通过判断ARCH的不同,使用不同的CROSS_COMPILE

然后就是导入*$(TOPDIR)/config.mk*中的其他配置

$(TOPDIR)/config.mk

大概看了下,这个文件提供了编译选项和变量

导入make变量

定义的CROSS_COMPILE会在*$(TOPDIR)/config.mk*中使用

AS	= $(CROSS_COMPILE)as
LD	= $(CROSS_COMPILE)ld
CC	= $(CROSS_COMPILE)gcc
...

导入自动生成配置

然后导入* ( O B J T R E E ) / i n c l u d e / a u t o c o n f . m k ∗ , 这 是 一 个 根 据 开 发 板 自 动 生 成 ( 根 据 (OBJTREE)/include/autoconf.mk*,这是一个根据开发板自动生成(根据 (OBJTREE)/include/autoconf.mk((TOPDIR)/include/configs/x210_sd.h定义生成)的脚本,里面定义了一些硬件相关的配置

CONFIG_CMD_FAT=y
CONFIG_USB_OHCI=y
CONFIG_SYS_CLK_FREQ=24000000
...

再根据ARCH等变量,导入对应的config脚本

编译选项参数

这一部分定义了一堆的FLAGS

LDSCRIPT定义链接脚本是否使用nand版

ifndef LDSCRIPT
#LDSCRIPT := $(TOPDIR)/board/$(BOARDDIR)/u-boot.lds.debug
ifeq ($(CONFIG_NAND_U_BOOT),y)
LDSCRIPT := $(TOPDIR)/board/$(BOARDDIR)/u-boot-nand.lds
else
LDSCRIPT := $(TOPDIR)/board/$(BOARDDIR)/u-boot.lds
endif

TEXT_BASE是在Makefile中定义的uboot链接地址,上面的配置交叉编译工具链里就有写

这里的地址是虚拟地址,物理地址取决于uboot中的地址映射

uboot链接对象

# U-Boot objects....order is important (i.e. start must be first)

OBJS  = cpu/$(CPU)/start.o
ifeq ($(CPU),i386)
OBJS += cpu/$(CPU)/start16.o
OBJS += cpu/$(CPU)/reset.o
...

这一部分是链接一些必要的库和.o文件

ALL标签

当我们在命令行使用make时,就会执行这一部分的脚本

ALL += $(obj)u-boot.srec $(obj)u-boot.bin $(obj)System.map $(U_BOOT_NAND) $(U_BOOT_ONENAND) $(obj)u-boot.dis
ifeq ($(ARCH),blackfin)
ALL += $(obj)u-boot.ldr
endif

all:		$(ALL)
...

在make编译后,我们也能看到这些对象

greedyhao@greedyhao-PC:.../qt_x210v3s_160307/uboot$ ls | grep u-boot
u-boot
u-boot.bin
u-boot.dis
u-boot.map
u-boot.srec

unconfig

unconfig:
	@rm -f $(obj)include/config.h $(obj)include/config.mk \
	...

注意到上面配置交叉编译工具链中的x210_sd_config和这里的unconfig有关,现在再对x210_sd_config的这段脚本做进一步的探讨

$(@:_config=)会把x210_sd_config匹配成x210_sd,从而使得mkconfig得到了6个参数x210_sd arm s5pc11x x210 samsung s5pc110

mkconfig

接下来就进入到mkconfig

while [ $# -gt 0 ] ; do
	case "$1" in
	--) shift ; break ;;
	-a) shift ; APPEND=yes ;;
	-n) shift ; BOARD_NAME="${1%%_config}" ; shift ;;
	*)  break ;;
	esac
done

这段脚本的作用就是对传入的第一个参数**$1**进行匹配,x210_sd只能匹配上*

[ "${BOARD_NAME}" ] || BOARD_NAME="$1"

这里就将参数1的值赋给了BOARD_NAME

[ $# -lt 4 ] && exit 1
[ $# -gt 6 ] && exit 1

这里是为了避免参数的数量不正确

之后就是为架构的指定头文件创建符号链接,这是为了可移植性,通过判断传入的ARCH CPU BOARD这几个参数,链接不同的头文件

各种适配

再接下来的内容就是各种系统下的适配,配置交叉编译工具链的脚本也是这部分的内容

make的其他选项

clean:
	@rm -f $(obj)examples/82559_eeprom $(obj)examples/eepro100_eeprom \
	...
clobber:	clean
	...
distclean:	clobber unconfig
    ...
backup:
	...

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值