版本号(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
- HOSTARCH:主机架构
- shell uname -m 执行uname -m命令得到当前电脑的CPU版本i686
- |表示管道,把前面的输出当做后面的参数
- sed -e s/i.86/i386/ 表示用3代替.即得到i386
- 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'
- make O=输出目录
- export BUILD_DIR=输出目录,然后make
- 如果已经定义了“BUILD_DIR”,又使用“make O=输出目录”,则“make O=输出目录” 方式优先级更高
OBJTREE,SRCTREE,TOPDIR变量(95—97行):
- OBJTREE:编译出的.o文件存放的目录的根目录。在默认编译下,OBJTREE等于当前目录;在O=xx编译下,OBJTREE就等于我们设置的那个输出目录
- SRCTREE: 源码目录,其实就是源代码的根目录,也就是当前目录。
- 在默认编译下,OBJTREE和SRCTREE相等;在O=xx这种编译下OBJTREE和SRCTREE不相等。Makefile中定义这两个变量,是为了记录编译后的.o文件往哪里放,就是为了实现O=xx的这种编译方式而生的。
- 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环境变量:
- ARCH,上面导出的,值来自于我们的配置过程,它的值会影响后面的CROSS_COMPILE环境变量的值。ARCH的意义是定义当前编译的目标CPU的架构,这里ARCH=arm
- CROSS_COMPILE交叉编译工具链的前缀
ifeq ($(ARCH),arm)
CROSS_COMPILE = /usr/local/arm/arm-2009q3/bin/arm-none-linux-gnueabi-
endif
- 该值由ARCH确定
- 实际使用时,我们可以在Makefile中去更改设置CROSS_COMPILE的值,也可以在编译时用make CROSS_COMPILE=xxxx来设置,而且编译时传参的方法可以覆盖Makefile里面的设置
autoconf.mk文件:
- 该文件非源码文件,在配置过程中生成,由/include/configs/x210_sd.h生成,x210_sd.h又由/mkconfig文件生成
- 该文件的作用是指导整个uboot的编译过程。
- 这个文件的内容其实就是很多CONFIG_开头的宏(可以理解为变量),这些宏/变量会影响我们uboot编译过程的走向(原理就是条件编译)
- 这个文件不是凭空产生的,配置过程也是需要原材料来产生这个文件的。原材料在源码目录的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
- 如果定义了CONFIG_NAND_U_BOOT宏,则链接脚本叫u-boot-nand.lds,如果未定义这个宏则链接脚本叫u-boot.lds。
- 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
- Makefile中在配置X210开发板时,在board/samsung/x210目录下生成了一个文件config.mk,其中的内容就是:TEXT_BASE = 0xc3e00000相当于定义了一个变量。
- TEXT_BASE是将来我们整个uboot链接时指定的链接地址。因为uboot中启用了虚拟地址映射,因此这个C3E00000地址就等于0x23E00000(也可能是33E00000具体地址要取决于uboot中做的虚拟地址映射关系)。
主Makefile中第一个目标all:
all: $(ALL)
...
执行make就默认执行该目标,生成各种需要的文件。
或者执行make all也一样。