聲明:本文由個人學習過程中整理而成,轉載請註明出處
(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和系統移植---朱有鵬老師》