UBOOT1.3.4 学习笔记(二) 主makefile分析

本文详细解析了UBOOT 1.3.4版本的主Makefile,包括版本号设定、HOSTARCH和HOSTOS环境变量、静默编译选项、两种编译方法、MKCONFIG环境变量、config.mk生成、ARCH和CROSS_COMPILE的影响,以及链接脚本和TEXT_BASE的设置。通过对这些关键部分的分析,深入理解UBOOT的构建过程。

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

版本号(24–29行):

记录uboot版本号

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

生产一个变量U_BOOT_VERSION存放版本号1.3.4xx 。
编译时生产文件version_autogenerated.h。里面存放这个宏定义

#define  U_BOOT_VERSION  "U-Boot 1.3.4"

HOSTARCH 和HOSTOS环境变量(31—43):

HOSTARCH := $(shell uname -m | \
	sed -e s/i.86/i386/ \
	    -e s/sun4u/sparc64/ \
	    -e s/arm.*/arm/ \
	    -e s/sa110/arm/ \
	    -e s/powerpc/ppc/ \
	    -e s/ppc64/ppc/ \
	    -e s/macppc/ppc/)

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

export	HOSTARCH HOSTOS
  1. HOSTARCH:主机架构
  2. shell uname -m 执行uname -m命令得到当前电脑的CPU版本i686
  3. |表示管道,把前面的输出当做后面的参数
  4. sed -e s/i.86/i386/ 表示用3代替.即得到i386
  5. HOSTOS主机操作系统

静默编译(48—56):

# Allow for silent builds
ifeq (,$(findstring s,$(MAKEFLAGS)))
XECHO = echo
else
XECHO = :
endif

编译时使用make -s 把-s作为MAKEFLAGS传给makefile,然后XECHO值就为空,不会打印编译信息

两种编译方法(56—123):

第一种:原地编译,即编译生成的文件保存在当前对应的.c文件。
第二种:生成的文件统一放在自定义的输出文件夹。

第二种放法又有两种具体实施方式:

# 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'
  1. make O=输出目录
  2. export BUILD_DIR=输出目录,然后make
  3. 如果已经定义了“BUILD_DIR”,又使用“make O=输出目录”,则“make O=输出目录” 方式优先级更高

OBJTREE,SRCTREE,TOPDIR变量(95—97行)

  1. OBJTREE:编译出的.o文件存放的目录的根目录。在默认编译下,OBJTREE等于当前目录;在O=xx编译下,OBJTREE就等于我们设置的那个输出目录
  2. SRCTREE: 源码目录,其实就是源代码的根目录,也就是当前目录。
  3. 在默认编译下,OBJTREE和SRCTREE相等;在O=xx这种编译下OBJTREE和SRCTREE不相等。Makefile中定义这两个变量,是为了记录编译后的.o文件往哪里放,就是为了实现O=xx的这种编译方式而生的。
  4. TOPDIR := $(SRCTREE)

MKCONFIG环境变量和mkconfig文件(101行):

MKCONFIG	:= $(SRCTREE)/mkconfig
export MKCONFIG

MKCONFIG环境变量记录了mkconfig文件脚本。该脚本是uboot的配置脚本。

config.mk文件(133行):

该文件不是源码文件,在配置过程(make x210_sd_config )中生成

# load ARCH, BOARD, and CPU configuration
include $(obj)include/config.mk
export	ARCH CPU BOARD VENDOR SOC   #导出为环境变量

X210在iNand情况下配置生成的config.mk内容为:

ARCH   = arm
CPU    = s5pc11x
BOARD  = x210
VENDOR = samsung
SOC    = s5pc110

这五个参数在2589行配置:

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

在makefile中修改 — 传进mkconfig配置文件 — 执行配置指令时(生成)写入/include/config.mk文件保存(这个过程对吗?)

ARCH ,CROSS_COMPILE环境变量:

  1. ARCH,上面导出的,值来自于我们的配置过程,它的值会影响后面的CROSS_COMPILE环境变量的值。ARCH的意义是定义当前编译的目标CPU的架构,这里ARCH=arm
  2. CROSS_COMPILE交叉编译工具链的前缀
ifeq ($(ARCH),arm)
CROSS_COMPILE = /usr/local/arm/arm-2009q3/bin/arm-none-linux-gnueabi-
endif
  1. 该值由ARCH确定
  2. 实际使用时,我们可以在Makefile中去更改设置CROSS_COMPILE的值,也可以在编译时用make CROSS_COMPILE=xxxx来设置,而且编译时传参的方法可以覆盖Makefile里面的设置

autoconf.mk文件:

  1. 该文件非源码文件,在配置过程中生成,由/include/configs/x210_sd.h生成,x210_sd.h又由/mkconfig文件生成
  2. 该文件的作用是指导整个uboot的编译过程。
  3. 这个文件的内容其实就是很多CONFIG_开头的宏(可以理解为变量),这些宏/变量会影响我们uboot编译过程的走向(原理就是条件编译)
  4. 这个文件不是凭空产生的,配置过程也是需要原材料来产生这个文件的。原材料在源码目录的inlcude/configs/xxx.h头文件。(X210开发板中为include/configs/x210_sd.h)。这个h头文件里面全都是宏定义,这些宏定义就是我们对当前开发板的移植。每一个开发板的移植都对应这个目录下的一个头文件,这个头文件里每一个宏定义都很重要,这些配置的宏定义就是我们移植uboot的关键所在。

链接脚本:

在config.mk文件的 142—149行指定:

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
endif
  1. 如果定义了CONFIG_NAND_U_BOOT宏,则链接脚本叫u-boot-nand.lds,如果未定义这个宏则链接脚本叫u-boot.lds。
  2. CONFIG_NAND_U_BOOT是在Nand版本情况下才使用的,X210使用iNand版本的,因此链接脚本为u-boot.lds

TEXT_BASE:

(config.mk 156-158行):

ifneq ($(TEXT_BASE),)
CPPFLAGS += -DTEXT_BASE=$(TEXT_BASE)
endif
  1. Makefile中在配置X210开发板时,在board/samsung/x210目录下生成了一个文件config.mk,其中的内容就是:TEXT_BASE = 0xc3e00000相当于定义了一个变量。
  2. TEXT_BASE是将来我们整个uboot链接时指定的链接地址。因为uboot中启用了虚拟地址映射,因此这个C3E00000地址就等于0x23E00000(也可能是33E00000具体地址要取决于uboot中做的虚拟地址映射关系)。

主Makefile中第一个目标all:

all:		$(ALL)
...

执行make就默认执行该目标,生成各种需要的文件。
或者执行make all也一样。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值