1:经过之前的分析我们知道Makefile主要做的事情有:
(1):首先配置makefile
make x210_sd_config
配置时实际上执行的是:./mkconfig xd_210 arm s5pc11x x210 samsung s5pc110
./mkconfig 为一个shell脚本;
xd_210 arm s5pc11x x210 samsung s5pc110为6个参数传入mkconfig脚本中;
在把"TEXT_BASE = 0xc3e00000" 写入board/samsung/x210/config.mk文件中;
(2):mkcofig脚本做的事情:
生成4个连接文件,分别为:
asm文件连接到asm-arm
reg.h文件连接到s5pc110.h
asm-arm/arch文件连接到arch-s5pc11x
arm-arm/proc文件连接到proc-armv
输出5个变量到config.mk文件中
ARCH = arm
CPU = s5pc11x
BOARD = x210
VENDOR = samsung
SOC = s5pc110
最后创建config.h文件夹;
echo "/* Automatically generated - do not edit */" >>config.h
echo "#include <configs/$1.h>" >>config.h
把/* Automatically generated - do not edit */
#include <configs/x210.h>
写入config.h文件中。
(3)配置以后就可以进入主makefile文件中了
主makefile中做的事情:
a:设置了HOSTARCH HOSTOS两个环境变量 比如说用的armcpu,;linux系统则
HOSTARCH = arm
HOSTOS = linux
b:可以设置静默编译:make -s即可
c:设置生成uboot.bin的目录 make clean、 x210_sd_config 以及make 是都要加上 O=/XX/XX
d:设置了一个环境变量 REMOTE_BUILD
e:输出ARCH CPU BOARD VENDOR SOC 5个环境变量
f:设置交叉编译工具链:CROSS_COMPILE = /usr/local/arm/arm-2009q3/bin/arm-none-linux-gnueabi-
g:执行/topdir/config.mk文件:配置交叉工具链
HOSTCC = gcc
HOSTCFLAGS = -Wall -Wstrict-prototypes -O2 -fomit-frame-pointer
HOSTSTRIP = strip
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
export CONFIG_SHELL HPATH HOSTCC HOSTCFLAGS CROSS_COMPILE
AS LD CC CPP AR NM STRIP OBJCOPY OBJDUMP
MAKE
export TEXT_BASE PLATFORM_CPPFLAGS PLATFORM_RELFLAGS CPPFLAGS CFLAGS AFLAGS
等等。。。。。。
BOARDDIR = $(VENDOR)/$(BOARD)
h:设置目标、依赖、规则
OBJS = cpu/$(CPU)/start.o
LIBS:个目录下的子makefile 库文件
LIBBOARD:board/samsung/x210/ 目录下的makefile
SUBDIRS = tools
examples
api_examples
api 工具 实例
$(obj)u-boot: depend $(SUBDIRS) $(OBJS) $(LIBBOARD) $(LIBS) $(LDSCRIPT)
最后生成 autocofig.mk、 autocofig.mk.dep两个文件;
--------------------------在结束的位置说一下uboot中的连接脚本-------------------------------
$(obj)u-boot: depend $(SUBDIRS) $(OBJS) $(LIBBOARD) $(LIBS) $(LDSCRIPT)
UNDEF_SYM=`$(OBJDUMP) -x $(LIBBOARD) $(LIBS) |
sed -n -e 's/.*($(SYM_PREFIX)__u_boot_cmd_.*)/-u1/p'|sort|uniq`;
cd $(LNDIR) && $(LD) $(LDFLAGS) $$UNDEF_SYM $(__OBJS)
--start-group $(__LIBS) --end-group $(PLATFORM_LIBS)
-Map u-boot.map -o u-boot
$(LD) $(LDFLAGS)
$(LDFLAGS)变量在/topdir/config.mk中
LDFLAGS += -Bstatic -T $(LDSCRIPT) $(PLATFORM_LDFLAGS)
ifneq ($(TEXT_BASE),)
LDFLAGS += -Ttext $(TEXT_BASE)
endif
$(LDSCRIPT) 这个变量为连接脚本变量
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
LDSCRIPT := $(TOPDIR)/board/$(BOARDDIR)/u-boot.lds 连接脚本在/board/samsung/x210/u-boot.lds
TEXT_BASE = 0xc3e00000
TEXT_BASE与连接脚本同时存在的话,以TEXT_BASE中的值为准;