uboot移植之配置編譯過程詳解2
/***********************************************************************************
2018.11月
作者:劉鈺
注:以uboot\u-boot-samsung-dev為分析物件
config.mk的前世今生:
****************************************************************************************/
1.config.mk在mkconfig中被建立
Create include file for Make
echo "ARCH = $2" > config.mk
echo "CPU = $3" >> config.mk
echo "BOARD = $4" >> config.mk
2.在Makefile中被引用。
# load other configuration
include $(TOPDIR)/config.mk
3.config.mk在配置執行過程中在根目錄下生成了一個autoconfig.mk檔案
# Load generated board configuration
sinclude $(OBJTREE)/include/autoconf.mk
此檔案很多內容是“CONFIG_”開頭的巨集,它的作用就是用來指導整個uboot的編譯過程。
這個檔案不是憑空產生的,配置過程也是需要原材料來產生這個檔案的。原材料在原始碼目錄的inlcude/configs/xxx.h標頭檔案。(行x210開發板中為include/configs/smdk2410.h)。這個h標頭檔案裡面全都是巨集定義。每一個開發板的移植都對應這個目錄下的一個頭檔案,這個標頭檔案裡每一個巨集定義都是移植uboot的關鍵所在。
4.config.mk一些關於編譯選項的設定:
CROSS_COMPILE:環境變數(路徑)+交叉編譯鏈的前半部分
下面具體的定義了CROSS_COMPILE:
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
ifeq ($(ARCH),arm)
ifeq ($(CROSS_COMPILE),powerpc-netbsd-)
PLATFORM_CPPFLAGS+= -D__ARM__
endif
ifeq ($(CROSS_COMPILE),powerpc-openbsd-)
PLATFORM_CPPFLAGS+= -D__ARM__
endif
endif
匯出的環境變數:
# Include the make variables (CC, etc...)
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
5.config.mk指定對應板子配置試的連結指令碼
ifeq ($(CONFIG_NAND_U_BOOT),y)
LDSCRIPT := $(TOPDIR)/board/$(BOARDDIR)/u-boot-nand.lds
else
LDSCRIPT := $(TOPDIR)/board/$(BOARDDIR)/u-boot.lds
endif
如果定義了CONFIG_NAND_U_BOOT巨集,則連結指令碼叫u-boot-nand.lds,如果未定義這個巨集則連結指令碼叫u-boot.lds。我們在分析uboot的編譯連結過程時就要考慮u-boot.lds這個連結指令碼。
6.定義了整個uboot連結時指定的連結地址:TEXT_BASE
ifneq ($(TEXT_BASE),)
CPPFLAGS += -DTEXT_BASE=$(TEXT_BASE)
endif