声明:本文由个人学习过程中整理而成,转载请注明出处


(1)设置src和obj


(2)设置编译选项


(3)定义交叉编译工具

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


(4)uboot/include/autoconf.mk,开发板相关的配置文件

autoconf.mk文件是在make x210_sd_config配置过程中生成,x210_sd.h文件会被用来生成autoconf.mk文件。

autoconf.mk文件里的内容类似于宏或者变量被uboot中的条件编译所使用,在uboot代码中有很多地方使用条件编译进行编写,这些条件编译是用来实现可移植性的。

# Load generated board configuration

sinclude $(OBJTREE)/include/autoconf.mk


ifdefARCH

sinclude $(TOPDIR)/$(ARCH)_config.mk# include architecture dependend rules

endif

ifdefCPU

sinclude $(TOPDIR)/cpu/$(CPU)/config.mk# include  CPUspecific rules

endif

ifdefSOC

sinclude $(TOPDIR)/cpu/$(CPU)/$(SOC)/config.mk# include  SoCspecific rules

endif

ifdefVENDOR

BOARDDIR = $(VENDOR)/$(BOARD)

else

BOARDDIR = $(BOARD)

endif

ifdefBOARD

sinclude $(TOPDIR)/board/$(BOARDDIR)/config.mk# include board specific rules

endif


(5)设置链接脚本的目录

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


(6)指定链接地址

/board/samsung/x210/config.mk文件是在make x210_sd_config配置过程中生成,其中的内容就是:TEXT_BASE = 0xc3e00000相当于定义了一个变量。

TEXT_BASE是整个uboot链接时指定的链接地址。因为uboot使用了虚拟地址映射,所以虚拟地址C3E00000就对应物理地址0x23E00000(也可能是物理地址33E00000具体地址要看uboot中的虚拟地址映射关系)。

ifneq ($(TEXT_BASE),)

LDFLAGS += -Ttext $(TEXT_BASE)

endif


(7)指定编译规则

Makefile的自动推导规则


ifndef REMOTE_BUILD


%.s:%.S

$(CPP) $(AFLAGS) -o $@ $<

%.o:%.S

$(CC) $(AFLAGS) -c -o $@ $<

%.o:%.c

$(CC) $(CFLAGS) -c -o $@ $<


else


$(obj)%.s:%.S

$(CPP) $(AFLAGS) -o $@ $<

$(obj)%.o:%.S

$(CC) $(AFLAGS) -c -o $@ $<

$(obj)%.o:%.c

$(CC) $(CFLAGS) -c -o $@ $<

endif


参考资料:《uboot和系统移植---朱有鹏老师》