编译配置主要是配置makefile和mkconfig文件,确定使用的具体是哪一款开发板,主要是针对board目录下的文件。
VERSION = 1
PATCHLEVEL = 3
SUBLEVEL = 4
EXTRAVERSION =
U_BOOT_VERSION = $(VERSION).$(PATCHLEVEL).$(SUBLEVEL)$(EXTRAVERSION) #实际版本号1.3.4
VERSION_FILE = $(obj)include/version_autogenerated.h #自动生成的版本号文件
其中 include/version_autogenerated.h 文件内容如下,可以看出完全是由U_BOOT_VERSION 这个变量得出的
#define U_BOOT_VERSION "U-Boot 1.3.4"
看下面代码
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/)
#HOSTARCH :=i386
HOSTOS := $(shell uname -s | tr '[:upper:]' '[:lower:]' | \
sed -e 's/\(cygwin\).*/cygwin/')
#HOSTOS := linux
export HOSTARCH HOSTOS //导出为环境变量
makefile中可以执行shell命令,但是格式必须是
DIR = ${shell pwd} #方法一
DIR = `pwd` #方法二
默认编译的时候,会打印出编译命令和一些其他信息,有时候这会很多,需要不显示编译命令或者编译过程中的其他结果的时候就可以使用静默编译。
原理就是编译是加上-s选项之后,-s会作为MAKEFLAGS传入 ,在执行下面命令时, (findstrings, ( f i n d s t r i n g s , (MAKEFLAGS)) == 1,所以ifeq不成立,所以 XECHO = : 自然不会输出打印信息了
ifeq (,$(findstring s,$(MAKEFLAGS)))
XECHO = echo
else
XECHO = :
endif
其中注意到
include #在包含文件时如果找不到会报警,在读取整个makefile后如果还是不能找到文件,才会报错
-include #在包含读取文件的时候,如果出错直接忽略
sinclude #同 -include
make O=输出目录 #方法一优先级高
export BUILD_DIR=输出目录|make #方法二
OBJTREE := $(if $(BUILD_DIR),$(BUILD_DIR),$(CURDIR)) #编译后的文件
SRCTREE := $(CURDIR) #源文件
TOPDIR := $(SRCTREE)
LNDIR := $(OBJTREE)
export TOPDIR SRCTREE OBJTREE
MKCONFIG := $(SRCTREE)/mkconfig #源码根目录下得的mkconfig
export MKCONFIG
其中在make 过程中指定的 O目录优先级更高
ifdef O
ifeq ("$(origin O)", "command line") #这里origin的意思是看O的定义在哪
#可能的值有多个 :(1)command line (2)undefine (3)environment (4)file (5)default
BUILD_DIR := $(O)
endif
endif
配置后的结果主要在include/config.mk文件中,如
ARCH = arm
CPU = s5pc11x
BOARD = x210
VENDOR = samsung
SOC = s5pc110
与这个文件配置相关的是
include $(obj)include/config.mk
export ARCH CPU BOARD VENDOR SOC
还有
x210_sd_config : unconfig
@$(MKCONFIG) $(@:_config=) arm s5pc11x x210 samsung s5pc110
@echo "TEXT_BASE = 0xc3e00000" > $(obj)board/samsung/x210/config.mk
涉及到比较多的makefile语法表示执行MKCONFIG文件,并且传入之后的几个变量
(@:config=)表示将x210sdconfig中config替换为空所以传入的几个参数是 ( @ : c o n f i g = ) 表 示 将 x 210 s d c o n f i g 中 c o n f i g 替 换 为 空 所 以 传 入 的 几 个 参 数 是 1 : x210_sd
2:arm 2 : a r m 3 : s5pc11x
4:x210 4 : x 210 5 : samsung
6:s5pc110 6 : s 5 p c 110 # : 6
CROSS_COMPILE为环境变量,不同CPU架构的编译工具链不一样,但是仅仅是前缀不一样,后缀都是一样的。当然也可以在make的时候定义CROSS_COMPILE
ifeq ($(ARCH),arm)
CROSS_COMPILE = /usr/local/arm/arm-2009q3/bin/arm-none-linux-gnueabi-
endif
在主makefile中用下面代码,直接包含了config.mk
# load other configuration
include $(TOPDIR)/config.mk
AS = $(CROSS_COMPILE)as
LD = $(CROSS_COMPILE)ld
CC = $(CROSS_COMPILE)gcc
CPP = $(CC) -E
AR = $(CROSS_COMPILE)ar
NM = $(CROSS_COMPILE)nm
LDR = $(CROSS_COMPILE)ldr
STRIP = $(CROSS_COMPILE)strip
OBJCOPY = $(CROSS_COMPILE)objcopy
OBJDUMP = $(CROSS_COMPILE)objdump
RANLIB = $(CROSS_COMPILE)RANLIB
最后ARCH CPU SOC VENDOR BOARD的所有相关配置信息都会导入到/include/auoconf.mk文件中去,其余来源于/include/configs/xxx.h
auoconf.mk 里面都是控制整个UBOOT编译过程的宏定义,通过条件编译来控制整个编译过程
# Load generated board configuration
sinclude $(OBJTREE)/include/autoconf.mk
ifdef ARCH
sinclude $(TOPDIR)/$(ARCH)_config.mk # include architecture dependend rules
endif
ifdef CPU
sinclude $(TOPDIR)/cpu/$(CPU)/config.mk # include CPU specific rules
endif
ifdef SOC
sinclude $(TOPDIR)/cpu/$(CPU)/$(SOC)/config.mk # include SoC specific rules
endif
ifdef VENDOR
BOARDDIR = $(VENDOR)/$(BOARD)
else
BOARDDIR = $(BOARD)
endif
ifdef BOARD
sinclude $(TOPDIR)/board/$(BOARDDIR)/config.mk # include board specific rules
endif
ifndef LDSCRIPT
ifeq ($(CONFIG_NAND_U_BOOT),y)
LDSCRIPT := $(TOPDIR)/board/$(BOARDDIR)/u-boot-nand.lds
else
LDSCRIPT := $(TOPDIR)/board/$(BOARDDIR)/u-boot.lds #实际使用
endif
分析得知,本开发板使用的是u-boot.lds
TEXT_BASE是整个uboot编译链接时候的链接地址
在配置的时候在/board/samsung/x210目录下生成了一个config.mk文件
x210_sd_config : unconfig
@$(MKCONFIG) $(@:_config=) arm s5pc11x x210 samsung s5pc110
@echo "TEXT_BASE = 0xc3e00000" > $(obj)board/samsung/x210/config.mk #生成config.mk
其中内容为
TEXT_BASE = 0xc3e00000
在make x210_sd_config配置板子的时候就是
在/include/ /include/asm/里面一共创建了4个符号链接
看到uboot2.4之后继续