1. 程式人生 > >u-boot主makefile分析2

u-boot主makefile分析2

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內的規則配合使用,就能實現眾多檔案的編譯