u-boot-1.1.6頂層目錄Makefile詳解(轉)

 

#

# (C) Copyright 2000-2006 版權所有:2000~2006

# Wolfgang Denk, DENX Software Engineering, [email protected].             Wolfgang Denk一個開發人員的名字DENX Software Engineering公司名稱[email protected]郵箱

#

# See file CREDITS for list of people who contributed to this            可以看看CREDITS,裏面有爲uboot做出貢獻的所有開發人員

# project.

#

# This program is free software; you can redistribute it and/or       這個程序是一個自由軟件,你可以重新發布它,或者在自由軟件基金組織所頒佈的

# modify it under the terms of the GNU General Public License as       GNU GPLGNU 公共許可協議)的前提下修改它;注意,不論是第二版的GPL還是

# published by the Free Software Foundatio; either version 2 of         任何更新的版本,都可以,這由你選擇。

# the License, or (at your option) any later version.

#

# This program is distributed in the hope that it will be useful,               我們之所以發佈這個程序,是希望它能夠對你有用,但是我們不做任何擔保;

# but WITHOUT ANY WARRANTY; without even the implied warranty of      不保證任何的可銷售性和任何給予特殊目的的合適性。想要了解詳細內容,

# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the        你可以參考GNU GPL

# GNU General Public License for more details.

#

# You should have received a copy of the GNU General Public License    你應該已經得到了GNU General Public License的一個拷貝,因爲它就包含在

# along with this program; if not, write to the Free Software                     這個工程的源代碼包中。如果沒有,你可以寫信給自由軟件基金組織,以獲取一份。

# Foundation, Inc., 59 Temple Place, Suite 330, Boston,

# MA 02111-1307 USA

#

 

VERSION = 1

PATCHLEVEL = 1

SUBLEVEL = 6

EXTRAVERSION =

U_BOOT_VERSION = $(VERSION).$(PATCHLEVEL).$(SUBLEVEL)$(EXTRAVERSION)     #1.1.6

VERSION_FILE = $(obj)include/version_autogenerated.h                                      #版本文件

 

 

# uname 命令將正在使用的操作系統名寫到標準輸出中

# -m 顯示硬件運行系統的機器 ID

# 定義變量,HOSTARCH裏面存儲的是機器ID,即主機架構類型

HOSTARCH := $(shell uname -m | /            #可以把shell腳本寫到makefile裏面,這是make中的shell function,相當於shell中的命令替換。

 sed      -e s/i.86/i386/ /                      #shell uname -m 獲得機器硬件名稱

     -e s/sun4u/sparc64/ /                #sed -e s/arm.*/arm/ 的意思是把前綴爲arm的所有模式替換爲arm。結合前面的uname命令來理解就是:

     -e s/arm.*/arm/ /              #uname -m的結果(主機架構類型或者稱爲機器ID號)通過管道傳遞給sed命令,然後把前綴爲arm的所有模式替換爲arm

     -e s/sa110/arm/ /                    #sed的語法:     sed [  -n ] Script [ File ... ]

     -e s/powerpc/ppc/ /              #                   sed [  -n ] [ -e Script ] ... [ -f ScriptFile ] ... [ File ... ]

     -e s/macppc/ppc/)                 #sed 命令根據編輯腳本,去修改指定的 File 文件(這裏file是作爲一個輸入參數的)的行,並將其寫到標準輸出。

#sed 命令包含很多功能,用於選擇要修改的行(請注意,sed是針對行進行操作的),並只對選擇的行作更改。

#sed 命令使用兩個工作空間來保留修改的行:保留選定行的 "模式空間" 和暫時存儲行的 "保留空間"

#這裏的編輯腳本由單獨的子命令構成,每個單獨的行對應着一個子命令。sed子命令的格式如下:[address-range] function[modifiers],即:[地址範圍] 函數[修改符]

#sed 命令通過將一個輸入行讀入模式空間,依次應用所有的 sed 子命令(這些子命令的地址選擇了該行),

#並將模式空間寫到標準輸出來處理每個輸入的 File 輸入文件(file就是輸入參數)。然後清除模式空間,並對輸入的 File 中指定的每行重複該過程。

#一些 sed 子命令使用保留空間來保存後繼檢索的所有的,或部分的模式空間。

#當命令包含地址(行號或搜索模式)時,該命令只會對被尋址的行起作用。否則,該命令適用於所有的行。

#注意,這裏的參數"-e"的意思是:使用 Script 變量作爲編輯腳本。如果你只使用一個 -e 標誌並且不使用-f 標誌,則可以省略 -e 標誌。

#注意,這裏的 "sed -e s/arm.*/arm/"表示把前綴爲arm的所有模式替換爲arm,也就是sed s/pattern/replacement/flags

# replacement 字符串代替在模式空間中首次出現的pattern 參數。除了空格或換行符,在 s 子命令之後顯示的任何字符都能代替 /(斜槓)分隔符。 

 

 

#uname -s 表示:顯示系統名,標誌缺省爲開,即uname命令不帶任何參數的輸出和加參數-s輸出相同,即Linux

#tr是一個shell命令,可以實現許多sed的功能,這裏 tr '[:upper:]' '[:lower:]'的意思是把管道中的Linux 中的大寫字母L 轉換成小寫字母l

#下面這句話的意思是定義變量HOSTOSHOSTOS裏面存放的是主機安裝的,並且當前正在運行的操作系統

HOSTOS := $(shell uname -s | tr '[:upper:]' '[:lower:]' | /

     sed -e 's//(cygwin/).*/cygwin/')      # 這一句的意思是檢測出主機安裝的,並且當前正在運行的操作系統名,並把這個系統名中的大寫字母轉換爲小寫字母,  

                                      # 然後在通過sed流編輯器匹配所有的,這個系統名中出現的"/(cygwin/).*"模式,然後再用"cygwin"模式替換。

#export HOSTARCH HOSTOS  的意思是輸出兩個makefile變量HOSTARCHHOSTOS                

 

export HOSTARCH HOSTOS                

 

# Deal with colliding definitions from tcsh etc.   用來處理來自tcsh的互相沖突的定義等等

# 一般來說,shell可以分成兩類。第一類是由 Bourne shell 衍生出來的包括 

# shkshbash,與zsh。第二類是由 C shell 衍生出來的,包括 csh 與 

# tcsh。除此之外還有一個rc,有人認爲該自成一類,有人認爲該歸類在Bourne shell。 

 

VENDOR =  #開發商

 

#########################################################################

#

# U-boot build supports producing a object files to the separate external

# U-boot 的編譯過程可以支持向一個自己定義的路徑生成最終的目標文件

# directory. Two use cases are supported:

# 這裏提供了兩種用法:

#

# 1) Add O= to the make command line #第一種用法:通過在終端執行命令make O=/dir(即你指定的生成的目標文件的存放目錄)

# 'make O=/tmp/build all'

#

# 2) Set environement variable BUILD_DIR to point to the desired location #第二種用法:通過設置環境變量來指定目標文件存放目錄,如下所示:

# 'export BUILD_DIR=/tmp/build'

# 'make'

#

# The second approach can also be used with a MAKEALL script #第二種方法也可以寫成一個MAKEALL腳本,然後執行MAKEALL,如下所示:

# 'export BUILD_DIR=/tmp/build'

# './MAKEALL'

#

# Command line 'O=' setting overrides BUILD_DIR environent variable.    #命令行'O='設置會覆蓋環境變量BUILD_DIR的設置

#

# When none of the above methods is used,the local build is performed and #如果都不採用上面兩種方法,那麼目標文件放到源碼頂層目錄,也就是U-BOOT頂層目錄

# the object files are placed in the source directory.

#

 

#理解了上面一段英文,這裏就不難理解了

#方法1

 

ifdef O                                            #如果變量'O' 已經被定義過

ifeq ("$(origin O)", "command line")   #如果變量'O' 在命令行中定義過

BUILD_DIR := $(O)                         #就把變量'O' 的值(目標文件存放目錄)BUILD_DIR

endif

endif

 

 

#方法2

ifneq ($(BUILD_DIR),)              #如果變量BUILD_DIR不爲空,即環境變量BUILD_DIR 被定義過

saved-output := $(BUILD_DIR)           #那麼把它的值saved-output

 

# Attempt to create a output directory.  #生成一個輸出路徑,即目標文件存放目錄BUILD_DIR

$(shell [ -d ${BUILD_DIR} ] || mkdir -p ${BUILD_DIR})

 

#shell [ -d ${BUILD_DIR} ] 是什麼意思?是不是生成一個目錄的意思?

 

# Verify if it was successful. 測試目錄是否創建成功

BUILD_DIR := $(shell cd $(BUILD_DIR) && /bin/pwd)  #這又是什麼意思,說明對shell還不夠理解

$(if $(BUILD_DIR),,$(error output directory "$(saved-output)" does not exist))

#這裏用了一個if函數,意思是如果如果$(BUILD_DIR) 非空,則什麼都不執行(返回空),否則執行error函數,輸出錯誤信息

endif

 

# ifneq ($(BUILD_DIR),) #意思是:如果沒有定義目標文件存放目錄

#Makefile中定義了源碼以及生成目標文件存放的目錄,目標文件存放目錄BUILD_DIR可以通過make O=dir指定。如果沒有指定,則設定爲源碼頂層目錄。

#一般編譯的時候不指定輸出目錄,則BUILD_DIR爲空。其他目錄變量如下:

OBJTREE  := $(if $(BUILD_DIR),$(BUILD_DIR),$(CURDIR))  #如果$(BUILD_DIR)不爲空,則返回$(BUILD_DIR),並賦給OBJTREE,即自己定製的目標存放目錄

SRCTREE  := $(CURDIR) #把當前源碼所在目錄 $(CURDIR) 賦給SRCTREE

TOPDIR  := $(SRCTREE)    #把當前源碼所在目錄 $(CURDIR) 賦給SRCTREE

LNDIR  := $(OBJTREE)      #存放生成的目錄文件

export TOPDIR SRCTREE OBJTREE

 

 

MKCONFIG := $(SRCTREE)/mkconfig    #MKCONFIG指向源碼所在目錄(U-BOOT頂層目錄)下的mkconfig配置文件

export MKCONFIG

 

#在編譯UBOOT之前,我們先要執行:

#make smdk2410_config

#從本Makefile的下文可以判斷出smdk2410_configMakefile的一個目標。

#smdk2410_config: unconfig的意思是爲smdk2410開發板建立一個編譯項。

#顯然,執行#make smdk2410_config時,先執行unconfig目標(不指定輸出目標時,objsrc變量均爲空),unconfig下面的命令主要任務是清理上

#一次執行make *_config生成的頭文件和makefile的包含文件

#主要是include/config.hinclude/config.mk

#然後執行命令: @$(MKCONFIG) $(@:_config=) arm arm920t smdk2410 NULL s3c24x0

#arm 表示CPU的構架是基於ARM體系的

#arm920t 表示CPU的類型是arm920t

#smdk2410 表示開發板的型號

#NULL 表示開發商或者經銷商的名稱,這裏爲空

#s3c24x0 表示基於S3C2410的片上系統

#MKCONFIG指向UBOOT頂層目錄下的mkconfig腳本配置文件,後面五個字符串是傳入的參數(好像$(@:_config=)也是一個參數)。

#下面來分析一下mkconfig這個腳本配置文件,點擊鏈接:http://zqwt.012.blog.163.com/blog/static/120446842010325102158182/

 

 

ifneq ($(OBJTREE),$(SRCTREE))     #當目標存放目錄不是U-BOOT頂層目錄(源碼目錄)時

REMOTE_BUILD  := 1             #定義變量REMOTE_BUILD  := 1  這個變量算是一個flag

export REMOTE_BUILD

endif

 

# $(obj) and (src) are defined in config.mk(頂層目錄下) but here in main Makefile

# we also need them before config.mk is included which is the case for

# some targets like unconfig, clean, clobber, distclean, etc.

# $(obj) and $(src)都被定義在頂層目錄下的config.mk腳本配置文件裏面

# 但是在這個主Makefile裏面,我們同樣需要他們,

# 因爲在主Makefile文件包含config.mk之前,$(obj) and $(src)偶爾地會成爲這些目標的case:

# unconfig, clean, clobber, distclean, etc

 

 

ifneq ($(OBJTREE),$(SRCTREE))    #當目標存放目錄不是U-BOOT頂層目錄(源碼目錄)時

obj := $(OBJTREE)/             #定義變量obj,讓其等於目標存放目錄

src := $(SRCTREE)/                 #定義變量src,讓其等於uboot頂層目錄

else

obj :=                      #否則,這兩個變量都定義爲空

src :=

endif

export obj src

 

 

#########################################################################

ifeq ($(OBJTREE)/include/config.mk,$(wildcard $(OBJTREE)/include/config.mk)) #這句話讓人費解!

# 通配符在規則中可以自動擴展,但設置在變量中或在函數的參數中通配符一般不能正常擴展

# 如果您需要在這些場合擴展通配符,您應該使用函數wildcard,格式如下:

# $(wildcard pattern...)

 

 

# load ARCH, BOARD, and CPU configuration

#加載ARCH, BOARD, and CPU 配置

include $(OBJTREE)/include/config.mk   # 這時候,纔開始包含/include/config.mk

export ARCH CPU BOARD VENDOR SOC

 

 

#指定交叉編譯器前綴

ifeq ($(ARCH),arm) 

CROSS_COMPILE = arm-linux-

#這裏你可以把交叉編譯器的安裝路徑加到arm-linux-之前,比如你的交叉編譯器安裝路徑是/root/u-boot/usr/local/arm/3.3.2/bin/

#你可以這樣定義CROSS_COMPILE = /root/u-boot/usr/local/arm/3.3.2/bin/arm-linux-

#這樣一來,你在終端進行編譯的時候就不用指定CROSS_COMPILE=arm-linux-

#但請注意:在編譯內核的時候,交叉編譯器必須安裝在/usr/local/arm下,否則會發生錯誤!!!!!

endif

 

export CROSS_COMPILE

 

 

# load other configuration  加載其他設置,這裏是包含頂層目錄下的config.mk配置文件,這個文件主要做了三個工作:

# 1、定義了交叉編譯器 2、定義了編譯選項 3、定義了編譯規則

# 對本文件具體的分析,請查看鏈接:

http://zqwt.012.blog.163.com/blog/static/12044684201032541139914/

 

include $(TOPDIR)/config.mk    

 

#########################################################################

# U-Boot objects....order is important (i.e. start must be first)

# uboot目標...書寫順序很重要,比如start.o必須排在第一位

#########################################################################

OBJS  = cpu/$(CPU)/start.o

#start.o必須放在目標文件的第一位,因爲uboot執行的第一段代碼就是start.S

#具體原因可以查看鏈接腳本/u-boot-1.1.6/board/smdk2410/u-boot.lds,點擊連接:

http://zqwt.012.blog.163.com/blog/static/120446842010320101137932/

 

 

 

.....................................

 

 

 

OBJS := $(addprefix $(obj),$(OBJS))  #這句的意思是把目標文件存放路徑以前綴的形式加到start.O之前,然後再賦給OBJS

 

 

#以下是編譯UBOOT需要的庫文件

LIBS  = lib_generic/libgeneric.a

 

LIBS += board/$(BOARDDIR)/lib$(BOARD).a # 嚴重平臺依賴的

 

LIBS += cpu/$(CPU)/lib$(CPU).a  # 嚴重平臺依賴的

 

ifdef SOC

LIBS += cpu/$(CPU)/$(SOC)/lib$(SOC).a # 嚴重平臺依賴的

endif

 

LIBS += lib_$(ARCH)/lib$(ARCH).a # 嚴重平臺依賴的

 

 

LIBS += fs/cramfs/libcramfs.a fs/fat/libfat.a fs/fdos/libfdos.a fs/jffs2/libjffs2.a /

 fs/reiserfs/libreiserfs.a fs/ext2/libext2fs.a

LIBS += net/libnet.a

LIBS += disk/libdisk.a

LIBS += rtc/librtc.a

LIBS += dtt/libdtt.a

LIBS += drivers/libdrivers.a

LIBS += drivers/nand/libnand.a

LIBS += drivers/nand_legacy/libnand_legacy.a

LIBS += drivers/sk98lin/libsk98lin.a

LIBS += post/libpost.a post/cpu/libcpu.a

LIBS += common/libcommon.a

LIBS += $(BOARDLIBS)

 

LIBS := $(addprefix $(obj),$(LIBS))

 

.PHONY : $(LIBS)   # 這是一個僞目標

 

#根據所生成的include/config.mk文件定義的幾個變量ARCH, CPU, BOARD, SOC,我們可以

#確定硬件平臺依賴的目錄文件。smdk2410平臺相關(依賴)目錄以及對應生成的庫文件如下:

#board/smdk2410/: 庫文件board/smdk2410/libsmdk2410.a

#cpu/arm920t/: 庫文件cpu/arm920t/libarm920t.a

#cpu/arm920t/s3c24x0: 庫文件cpu/arm920t/s3c24x0/libs3c24x0.a

#lib_arm 庫文件lib_arm/libarm.a

#include/asm-arm: 頭文件

#include/cnofigs/smdk2410.h:頭文件

 

# Add GCC lib

PLATFORM_LIBS += -L $(shell dirname `$(CC) $(CFLAGS) -print-libgcc-file-name`) -lgcc

 

# The "tools" are needed early, so put this first

# Don't include stuff already done in $(LIBS)   不要包含已經在 $(LIBS) 中的任何東西

#

# 僞目標SUBDIRS:用於執行toolsexamplespostpost/cpu子目錄下的make文件

SUBDIRS = tools /

   examples /

   post /

   post/cpu

.PHONY : $(SUBDIRS)

 

ifeq ($(CONFIG_NAND_U_BOOT),y)

NAND_SPL = nand_spl

U_BOOT_NAND = $(obj)u-boot-nand.bin

endif

 

__OBJS := $(subst $(obj),,$(OBJS))

__LIBS := $(subst $(obj),,$(LIBS))

 

#########################################################################

#########################################################################

 

 

 

 

#這裏是最終要生成的各種鏡像文件u-boot.hexu-boot.srecu-boot.binSystem.mapu-boot.img

ALL = $(obj)u-boot.srec $(obj)u-boot.bin $(obj)System.map $(U_BOOT_NAND)

all:  $(ALL)

$(obj)u-boot.hex: $(obj)u-boot

  $(OBJCOPY) ${OBJCFLAGS} -O ihex $< $@       # $<$@ 分別表示使用該規則的源文件和目標文件

 

$(obj)u-boot.srec: $(obj)u-boot               

  $(OBJCOPY) ${OBJCFLAGS} -O srec $< $@

 

$(obj)u-boot.bin: $(obj)u-boot

  $(OBJCOPY) ${OBJCFLAGS} -O binary $< $@

 

$(obj)u-boot.img: $(obj)u-boot.bin

  ./tools/mkimage -A $(ARCH) -T firmware -C none /

  -a $(TEXT_BASE) -e 0 /

  -n $(shell sed -n -e 's/.*U_BOOT_VERSION//p' $(VERSION_FILE) | /

   sed -e 's/"[  ]*$$/ for $(BOARD) board"/') /

  -d $< $@

 

$(obj)u-boot.dis: $(obj)u-boot

  $(OBJDUMP) -d $< > $@

 

 

 

#此處生成的是ubootELF文件鏡像

$(obj)u-boot:  depend version $(SUBDIRS) $(OBJS) $(LIBS) $(LDSCRIPT)

  UNDEF_SYM=`$(OBJDUMP) -x $(LIBS) |sed  -n -e 's/.*/(__u_boot_cmd_.*/)/-u/1/p'|sort|uniq`;/

  cd $(LNDIR) && $(LD) $(LDFLAGS) $$UNDEF_SYM $(__OBJS) /

   --start-group $(__LIBS) --end-group $(PLATFORM_LIBS) /

   -Map u-boot.map -o u-boot

 

 

#依賴目標$(OBJS),也就是cpu/start.o

$(OBJS):

  $(MAKE) -C cpu/$(CPU) $(if $(REMOTE_BUILD),$@,$(notdir $@))

 

#依賴目標$(LIBS),目標很多,都是每個子目錄的庫文件*.a,通過執行相應子目錄下的make來完成

$(LIBS):

  $(MAKE) -C $(dir $(subst $(obj),,$@))

 

#這裏解釋一下這個makefile函數 $(dir names...)

#抽取‘names’中每一個文件名的路徑部分,文件名的路徑部分包括從文件名的開始到最後一個斜槓(含斜槓)

#之前的一切字符。如果文件名中沒有斜槓,路徑部分是‘./’。如:

#$(dir src/foo.c hacks)

#產生的結果爲 src/ ./’。

 

 

$(SUBDIRS):

  $(MAKE) -C $@ all

 

$(NAND_SPL): version

  $(MAKE) -C nand_spl/board/$(BOARDDIR) all

 

$(U_BOOT_NAND): $(NAND_SPL) $(obj)u-boot.bin

  cat $(obj)nand_spl/u-boot-spl-16k.bin $(obj)u-boot.bin > $(obj)u-boot-nand.bin

 

 

#依賴目標version:生成版本信息到版本文件VERSION_FILE

version:

  @echo -n "#define U_BOOT_VERSION /"U-Boot " > $(VERSION_FILE); /

  echo -n "$(U_BOOT_VERSION)" >> $(VERSION_FILE); /

  echo -n $(shell $(CONFIG_SHELL) $(TOPDIR)/tools/setlocalversion /

    $(TOPDIR)) >> $(VERSION_FILE); /

  echo "/"" >> $(VERSION_FILE)

 

gdbtools:

  $(MAKE) -C tools/gdb all || exit 1

 

updater:

  $(MAKE) -C tools/updater all || exit 1

 

env:

  $(MAKE) -C tools/env all || exit 1

 

 

 

 

#依賴目標depend:生成各個子目錄.depend文件,.depend列出每個目標文件的依賴文件。

#生成方法:調用每個子目錄的make_depend

depend dep:

  for dir in $(SUBDIRS) ; do $(MAKE) -C $$dir _depend ; done

 

 

tags ctags:

  ctags -w -o $(OBJTREE)/ctags `find $(SUBDIRS) include /

    lib_generic board/$(BOARDDIR) cpu/$(CPU) lib_$(ARCH) /

    fs/cramfs fs/fat fs/fdos fs/jffs2 /

    net disk rtc dtt drivers drivers/sk98lin common /

   /( -name CVS -prune /) -o /( -name '*.[ch]' -print /)`

 

etags:

  etags -a -o $(OBJTREE)/etags `find $(SUBDIRS) include /

    lib_generic board/$(BOARDDIR) cpu/$(CPU) lib_$(ARCH) /

    fs/cramfs fs/fat fs/fdos fs/jffs2 /

    net disk rtc dtt drivers drivers/sk98lin common /

   /( -name CVS -prune /) -o /( -name '*.[ch]' -print /)`

 

$(obj)System.map: $(obj)u-boot

  @$(NM) $< | /

  grep -v '/(compiled/)/|/(/.o$$/)/|/( [aUw] /)/|/(/./.ng$$/)/|/(LASH[RL]DI/)' | /

  sort > $(obj)System.map

 

 

 

 

 

#########################################################################

else

all $(obj)u-boot.hex $(obj)u-boot.srec $(obj)u-boot.bin /

$(obj)u-boot.img $(obj)u-boot.dis $(obj)u-boot /

$(SUBDIRS) version gdbtools updater env depend /

dep tags ctags etags $(obj)System.map:

 @echo "System not configured - see README" >&2

 @ exit 1

endif

 

.PHONY : CHANGELOG

CHANGELOG:

 git log --no-merges U-Boot-1_1_5.. | /

 unexpand -a | sed -e 's//s/s*$$//' > $@

 

 

#########################################################################

# 這裏就是我們所謂的unconfig,應該比較熟悉了!

# 很明顯,它所做的工作就是清除上次生成的include/config.hinclude/config.mk

# 以及開發板目錄下的一些臨時配置文件

# unconfig:

#  @rm -f $(obj)include/config.h $(obj)include/config.mk /

#   $(obj)board/*/config.tmp $(obj)board/*/*/config.tmp

#########################################################################

 

 

假定我們在u-boot-1.1.6的根目錄下編譯,則其中的MKCONFIG就是根目錄下的mkconfig文件。$(@:_config=)的結果就是將“smdk2410_config”中的“_config”去掉,結果爲“smdk2410”。所以“make smdk2410_config”實際上就是執行如下命令:

./mkconfig smdk2410 arm arm920t smdk2410 NULL s3c24x0

 

................................

smdk2400_config : unconfig

 @$(MKCONFIG) $(@:_config=) arm arm920t smdk2400 NULL s3c24x0

 

................................

 

smdk2410_config : unconfig

 @$(MKCONFIG) $(@:_config=) arm arm920t smdk2410 NULL s3c24x0

 

 

#我刪了一部分內容,那些幾乎都是各種不同板子的*_config,也就是目標的定義。

 

最後總結一下,當然這裏也參考了前輩們的許多寶貴經驗,頂層Makefile的主要任務就是組織整個u-boot工程的編譯,概括可以分爲一下幾個步驟:

 

1、首先通過執行make *_config傳入$(@:_config=), ARCH, CPU, BOARD, VENDOR, SOC參數(一共六個參數但不

  

   一定同時存在),給mkconfig

 

2mkconfig接收到傳遞過來的參數後,將include頭文件夾相應的頭文件夾鏈接好,生成config.h

 

3、然後執行make分別調用各個子目錄的makefile文件,以生成所有的obj文件(包括start.o)和obj庫文件*.a

 

4、最後,通過鏈接器把所有目標文件鏈接起來,生成uboot鏡像。不同格式的鏡像都是調用相應工具,經

 

   elf鏡像間接或者直接的生成的。

 

 

發佈了12 篇原創文章 · 獲贊 2 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章