u-boot主makefile分析2
阿新 • • 發佈:2018-11-11
1.包含主目錄的config.mk
# load other configuration
include $(TOPDIR)/config.mk
在config.mk中主要做了哪些工作呢?
1.編譯工具定義
# # 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 STRIP = $(CROSS_COMPILE)strip OBJCOPY = $(CROSS_COMPILE)objcopy OBJDUMP = $(CROSS_COMPILE)objdump RANLIB = $(CROSS_COMPILE)RANLIB
2.包含開發板配置專案
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
在/board/100ask24x0目錄下的config.mk僅僅有一行程式碼:
TEXT_BASE = 0x33F80000
3.設定標頭檔案搜尋路徑
ifneq ($(OBJTREE),$(SRCTREE)) CPPFLAGS += -I$(OBJTREE)/include2 -I$(OBJTREE)/include endif CPPFLAGS += -I$(TOPDIR)/include CPPFLAGS += -fno-builtin -ffreestanding -nostdinc \ -isystem $(gccincdir) -pipe $(PLATFORM_CPPFLAGS)
段設定了標頭檔案的搜尋路徑,添加了頂層目錄下的include資料夾作為搜尋路徑。然後進行了一些其他設定(比如禁止標準的include路徑)
這樣,編譯器在編譯的時候就能正確的讀取到include資料夾下的標頭檔案(其實是配置階段建立的符號連結)了
4.包含連結指令碼
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
簡單分析一下,就可以得知,我們包含的連結指令碼是(TOPDIR)/board/$(BOARDDIR)/u-boot.lds。
5.設定LDFLAGS
LDFLAGS += -Bstatic -T $(LDSCRIPT) -Ttext $(TEXT_BASE) $(PLATFORM_LDFLAGS)
其中TEXT_BASE 在/board/100ask24x0目錄下的config.mk中定義:
TEXT_BASE = 0x33F80000
LDSCRIPT就是(TOPDIR)/board/$(BOARDDIR)/u-boot.lds。
最終生成的LDFLAGS會在生成bin檔案的時候用到。
6.匯出若干換環境變數
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
7.設定自動推導規則
ifndef REMOTE_BUILD
%.s: %.S
$(CPP) $(AFLAGS) -o [email protected] $<
%.o: %.S
$(CC) $(AFLAGS) -c -o [email protected] $<
%.o: %.c
$(CC) $(CFLAGS) -c -o [email protected] $<
else
$(obj)%.s: %.S
$(CPP) $(AFLAGS) -o [email protected] $<
$(obj)%.o: %.S
$(CC) $(AFLAGS) -c -o [email protected] $<
$(obj)%.o: %.c
$(CC) $(CFLAGS) -c -o [email protected] $<
endif
makefile的自動推導規則,和頂層Makefile內的規則配合使用,就能實現眾多檔案的編譯