GNU ARM汇编--(十七)u-boot的makefile和mkconfig解读
[cpp]view plaincopy
- VERSION=2012
- PATCHLEVEL=07
- SUBLEVEL=
- EXTRAVERSION=
- ifneq"$(SUBLEVEL)"""
- U_BOOT_VERSION=$(VERSION).$(PATCHLEVEL).$(SUBLEVEL)$(EXTRAVERSION)
- else
- U_BOOT_VERSION=$(VERSION).$(PATCHLEVEL)$(EXTRAVERSION)
- endif
- ################################
- #定义U_BOOT_VERSION为2012.07
- #####################################
- TIMESTAMP_FILE=$(obj)include/generated/timestamp_autogenerated.h
- VERSION_FILE=$(obj)include/generated/version_autogenerated.h
- ###############################
- #因为obj为空,所以定义TIMESTAMP_FILE为include/generated/timestamp_autogenerated.h
- #定义VERSION_FILE为include/generated/version_autogenerated.h
- #****************
- HOSTARCH:=$(shelluname-m|
- sed-es/i.86/x86/
- -es/sun4u/sparc64/
- -es/arm.*/arm/
- -es/sa110/arm/
- -es/ppc64/powerpc/
- -es/ppc/powerpc/
- -es/macppc/powerpc/
- -es/sh.*/sh/)
- HOSTOS:=$(shelluname-s|tr[:upper:][:lower:]|
- sed-es/
- #Setshelltobashifpossible,otherwisefallbacktosh
- SHELL:=$(shellif[-x"$$BASH"];thenecho$$BASH;
- elseif[-x/bin/bash];thenecho/bin/bash;
- elseechosh;fi;fi)
- exportHOSTARCHHOSTOSSHELL
- #########################
- #HOSTARCH为i686,HOSTOS为linux,SHELL为/bin/sh
- #############################
- #Dealwithcollidingdefinitionsfromtcshetc.
- VENDOR=
- #########################################################################
- #Allowforsilentbuilds
- ifeq(,$(findstrings,$(MAKEFLAGS)))
- XECHO=echo
- else
- XECHO=:
- endif
- ###########################
- #因为MAKEFLAGS变量的字符串为空,找不到s,所以ifeq为真,XECHO=echo
- ###########################
- #########################################################################
- #
- #U-bootbuildsupportsproducingaobjectfilestotheseparateexternal
- #directory.Twousecasesaresupported:
- #
- #1)AddO=tothemakecommandline
- #makeO=/tmp/buildall
- #
- #2)SetenvironementvariableBUILD_DIRtopointtothedesiredlocation
- #exportBUILD_DIR=/tmp/build
- #make
- #
- #ThesecondapproachcanalsobeusedwithaMAKEALLscript
- #exportBUILD_DIR=/tmp/build
- #./MAKEALL
- #
- #CommandlineO=settingoverridesBUILD_DIRenvironentvariable.
- #
- #Whennoneoftheabovemethodsisusedthelocalbuildisperformedand
- #theobjectfilesareplacedinthesourcedirectory.
- #
- ifdefO
- ifeq("$(originO)","commandline")
- BUILD_DIR:=$(O)
- endif
- endif
- #################################
- #如果没有在make命令行中定义O=/tmp之类的,那么BUILD_DIR就为/tmp,否则为空。
- #当使用makeO=/tmp时,表明#ifdefO有定义,而$(originO)返回的就是"commandline"
- #################################
- ifneq($(BUILD_DIR),)
- saved-output:=$(BUILD_DIR)
- #Attempttocreateaoutputdirectory.
- $(shell[-d${BUILD_DIR}]||mkdir-p${BUILD_DIR})
- #Verifyifitwassuccessful.
- BUILD_DIR:=$(shellcd$(BUILD_DIR)&&/bin/pwd)
- $(if$(BUILD_DIR),,$(erroroutputdirectory"$(saved-output)"doesnotexist))
- endif#ifneq($(BUILD_DIR),)
- #################################
- #如果BUILD_DIR不为空,那么这几句就执行:
- #首先,saved-output变量也是BUILD_DIR的值
- #如果BUILD_DIR不存在,那么就创建BUILD_DIR目录
- #检测BUILD_DIR目录是否成功建好了,如果有问题就输出错误信息
- #################################
- OBJTREE:=$(if$(BUILD_DIR),$(BUILD_DIR),$(CURDIR))
- SPLTREE:=$(OBJTREE)/spl
- SRCTREE:=$(CURDIR)
- TOPDIR:=$(SRCTREE)
- LNDIR:=$(OBJTREE)
- exportTOPDIRSRCTREEOBJTREESPLTREE
- ###########################################
- #如果BUILD_DIR有值,那么OBJTREE就是BUILD_DIR的值,如果BUILD_DIR为空,那么OBJTREE就是CURDIR的值,$(CURDIR)时GNUMake内嵌的变量,是当前目录。
- #我们在make时候不加O=/tmp之类的参数,所以OBJTREE就是当前工作目录,SPLTREE是当前工作目录下的spl目录,SRCTREE时当前工作目录,TOPDIR也是当前目录,LNDIR也是当前目录。
- ##########################################
- MKCONFIG:=$(SRCTREE)/mkconfig
- exportMKCONFIG
- #############################################
- #MKCONFIG定义为当前工作目录下的mkconfig脚本,并export
- #############################################
- ifneq($(OBJTREE),$(SRCTREE))
- REMOTE_BUILD:=1
- exportREMOTE_BUILD
- endif
- ####################################################################
- #在我们的执行中,OBJTREE和SRCTREE是相等的,所以不管了
- ###################################################################
- #$(obj)and(src)aredefinedinconfig.mkbuthereinmainMakefile
- #wealsoneedthembeforeconfig.mkisincludedwhichisthecasefor
- #sometargetslikeunconfig,clean,clobber,distclean,etc.
- ifneq($(OBJTREE),$(SRCTREE))
- obj:=$(OBJTREE)/
- src:=$(SRCTREE)/
- else
- obj:=
- src:=
- endif
- exportobjsrc
- #######################################
- #可以先看下上面的注释因为两个路径相同,所以执行else
- #########################################
- #MakesureCDPATHsettingsdontinterfere
- unexportCDPATH
- #########################################################################
- #The"tools"areneededearly,soputthisfirst
- #Dontincludestuffalreadydonein$(LIBS)
- #The"examples"conditionallydependonU-Boot(say,whenUSE_PRIVATE_LIBGCC
- #is"yes"),socompileexamplesafterU-Bootiscompiled.
- SUBDIR_TOOLS=tools
- SUBDIR_EXAMPLES=examples/standaloneexamples/api
- SUBDIRS=$(SUBDIR_TOOLS)
- ###############################################
- #定义SUBDIR_TOOLSSUBDIR_EXAMPLES和SUBDIRS
- ###############################################
- .PHONY:$(SUBDIRS)$(VERSION_FILE)$(TIMESTAMP_FILE)
- ########################
- #定义几个伪目标
- ########################
- ifeq($(obj)include/config.mk,$(wildcard$(obj)include/config.mk))
- #Includeautoconf.mkbeforeconfig.mksothattheconfigoptionsareavailable
- #toalltoplevelbuildfiles.Weneedthedummyall:targettopreventthe
- #dependencytargetinautoconf.mk.depfrombeingthedefault.
- all:
- sinclude$(obj)include/autoconf.mk.dep
- sinclude$(obj)include/autoconf.mk
- ###################################################################################
- #包含auoconf.mk和autoconf.mk.dep文件
- ###################################################################################
- ifndefCONFIG_SANDBOX
- SUBDIRS+=$(SUBDIR_EXAMPLES)
- endif
- ###################################
- #追加SUBDIRS为"toolsexamples/standaloneexamples/api"
- ###################################
- #loadARCH,BOARD,andCPUconfiguration
- include$(obj)include/config.mk
- exportARCHCPUBOARDVENDORSOC
- #######################################
- #包含include/config.mk文件,这个文件是在makexxx_config过程中产生的
- #######################################
- #setdefaulttonothingfornativebuilds
- ifeq($(HOSTARCH),$(ARCH))
- CROSS_COMPILE?=
- endif
- #######################################
- #看看注释就知道了,但是很显示我们的HOSTARCH是x86的,目标时arm的
- ########################################
- #loadotherconfiguration
- include$(TOPDIR)/config.mk
- #######################################
- #包含uboot顶层目录的config.mk文件
- #######################################
- #IfboardcodeexplicitlyspecifiedLDSCRIPTorCONFIG_SYS_LDSCRIPT,use
- #that(orfailifabsent).Otherwise,searchforalinkerscriptina
- #standardlocation.
- LDSCRIPT_MAKEFILE_DIR=$(dir$(LDSCRIPT))
- ##############################################################################
- #用等号赋值的变量是递归方式扩展的变量。变量定义时,变量值中对其他变量的引用不会被替换展开;
- #而是变量在引用它的地方替换展开的同时,它所引用的其它变量才会被一同替换展开。
- #其优点是:
- #这种类型变量在定义时,可以引用其它的之前没有定义的变量(可能在后续部分定义,或者是通过make的命令行选项传递的变量)。
- #LDSCRIPT变量就是后面才定义的
- ##############################################################################
- ifndefLDSCRIPT
- #LDSCRIPT:=$(TOPDIR)/board/$(BOARDDIR)/u-boot.lds.debug
- ifdefCONFIG_SYS_LDSCRIPT
- #needtostripoffdoublequotes
- LDSCRIPT:=$(subst",,$(CONFIG_SYS_LDSCRIPT))
- endif
- endif
- #######################################################################################
- #如果定义了CONFIG_SYS_LDSCRIPT,将CONFIG_SYS_LDSCRIPT代表的字符串去掉双引号后赋值给LDSCRIPT变量
- #这里我们并没有定义CONFIG_SYS_LDSCRIPT
- #######################################################################################
- #Ifthereisnospecifiedlinkscript,welookinanumberofplacesforit
- ifndefLDSCRIPT
- ifeq($(CONFIG_NAND_U_BOOT),y)
- LDSCRIPT:=$(TOPDIR)/board/$(BOARDDIR)/u-boot-nand.lds
- ifeq($(wildcard$(LDSCRIPT)),)
- LDSCRIPT:=$(TOPDIR)/$(CPUDIR)/u-boot-nand.lds
- endif
- endif
- ifeq($(wildcard$(LDSCRIPT)),)
- LDSCRIPT:=$(TOPDIR)/board/$(BOARDDIR)/u-boot.lds
- endif
- ifeq($(wildcard$(LDSCRIPT)),)
- LDSCRIPT:=$(TOPDIR)/$(CPUDIR)/u-boot.lds
- endif
- ifeq($(wildcard$(LDSCRIPT)),)
- LDSCRIPT:=$(TOPDIR)/arch/$(ARCH)/cpu/u-boot.lds
- #WedontexpectaMakefilehere
- LDSCRIPT_MAKEFILE_DIR=
- endif
- ifeq($(wildcard$(LDSCRIPT)),)
- $(errorcouldnotfindlinkerscript)
- endif
- endif
- ##########################################################################################
- #注释写的很明确,如果没有用CONFIG_SYS_LDSCRIPT指定LDSCRIPT,那么就在几个地方搜
- #第一个地方:如果CONFIG_NAND_U_BOOT是y,就用u-boot-nand.lds但是这里没有这个定义
- #第一个地方没找到,就找第二个地方:u-boot-2012.07/board/samsung/smdk2410这个目录没有u-boot.lds文件
- #第二个地方没找到,就找第三个地方:其中CPUDIR是在顶层的config.mk中定义的,在arch/arm/cpu/arm920t中找这个目录也没有
- #第三个地方没找到,就找第四个地方:arch/arm/cpu/u-boot.lds,这里就找到了!!!!
- ##########################################################################################
- #########################################################################
- #U-Bootobjects....orderisimportant(i.e.startmustbefirst)
- OBJS=$(CPUDIR)/start.o
- ifeq($(CPU),x86)
- OBJS+=$(CPUDIR)/start16.o
- OBJS+=$(CPUDIR)/resetvec.o
- endif
- ifeq($(CPU),ppc4xx)
- OBJS+=$(CPUDIR)/resetvec.o
- endif
- ifeq($(CPU),mpc85xx)
- OBJS+=$(CPUDIR)/resetvec.o
- endif
- OBJS:=$(addprefix$(obj),$(OBJS))
- #####################################
- #为OBJS增加前缀,其中obj在顶层目录的config.mk中定义,这里根据实际情况OBJS就是arch/arm/cpu/arm920t/start.o
- #####################################
- LIBS=lib/libgeneric.o
- LIBS+=lib/lzma/liblzma.o
- LIBS+=lib/lzo/liblzo.o
- LIBS+=lib/zlib/libz.o
- ifeq($(CONFIG_TIZEN),y)
- LIBS+=lib/tizen/libtizen.o
- endif
- LIBS+=$(shellif[-fboard/$(VENDOR)/common/Makefile];thenecho
- "board/$(VENDOR)/common/lib$(VENDOR).o";fi)
- LIBS+=$(CPUDIR)/lib$(CPU).o
- ifdefSOC
- LIBS+=$(CPUDIR)/$(SOC)/lib$(SOC).o
- endif
- ifeq($(CPU),ixp)
- LIBS+=arch/arm/cpu/ixp/npe/libnpe.o
- endif
- ifeq($(CONFIG_OF_EMBED),y)
- LIBS+=dts/libdts.o
- endif
- LIBS+=arch/$(ARCH)/lib/lib$(ARCH).o
- LIBS+=fs/cramfs/libcramfs.ofs/fat/libfat.ofs/fdos/libfdos.ofs/jffs2/libjffs2.o
- fs/reiserfs/libreiserfs.ofs/ext2/libext2fs.ofs/yaffs2/libyaffs2.o
- fs/ubifs/libubifs.o
- LIBS+=net/libnet.o
- LIBS+=disk/libdisk.o
- LIBS+=drivers/bios_emulator/libatibiosemu.o
- LIBS+=drivers/block/libblock.o
- LIBS+=drivers/dma/libdma.o
- LIBS+=drivers/fpga/libfpga.o
- LIBS+=drivers/gpio/libgpio.o
- LIBS+=drivers/hwmon/libhwmon.o
- LIBS+=drivers/i2c/libi2c.o
- LIBS+=drivers/input/libinput.o
- LIBS+=drivers/misc/libmisc.o
- LIBS+=drivers/mmc/libmmc.o
- LIBS+=drivers/mtd/libmtd.o
- LIBS+=drivers/mtd/nand/libnand.o
- LIBS+=drivers/mtd/onenand/libonenand.o
- LIBS+=drivers/mtd/ubi/libubi.o
- LIBS+=drivers/mtd/spi/libspi_flash.o
- LIBS+=drivers/net/libnet.o
- LIBS+=drivers/net/phy/libphy.o
- LIBS+=drivers/pci/libpci.o
- LIBS+=drivers/pcmcia/libpcmcia.o
- LIBS+=drivers/power/libpower.o
- LIBS+=drivers/spi/libspi.o
- ifeq($(CPU),mpc83xx)
- LIBS+=drivers/qe/libqe.o
- LIBS+=arch/powerpc/cpu/mpc8xxx/ddr/libddr.o
- LIBS+=arch/powerpc/cpu/mpc8xxx/lib8xxx.o
- endif
- ifeq($(CPU),mpc85xx)
- LIBS+=drivers/qe/libqe.o
- LIBS+=drivers/net/fm/libfm.o
- LIBS+=arch/powerpc/cpu/mpc8xxx/ddr/libddr.o
- LIBS+=arch/powerpc/cpu/mpc8xxx/lib8xxx.o
- endif
- ifeq($(CPU),mpc86xx)
- LIBS+=arch/powerpc/cpu/mpc8xxx/ddr/libddr.o
- LIBS+=arch/powerpc/cpu/mpc8xxx/lib8xxx.o
- endif
- LIBS+=drivers/rtc/librtc.o
- LIBS+=drivers/serial/libserial.o
- ifeq($(CONFIG_GENERIC_LPC_TPM),y)
- LIBS+=drivers/tpm/libtpm.o
- endif
- LIBS+=drivers/twserial/libtws.o
- LIBS+=drivers/usb/eth/libusb_eth.o
- LIBS+=drivers/usb/gadget/libusb_gadget.o
- LIBS+=drivers/usb/host/libusb_host.o
- LIBS+=drivers/usb/musb/libusb_musb.o
- LIBS+=drivers/usb/phy/libusb_phy.o
- LIBS+=drivers/usb/ulpi/libusb_ulpi.o
- LIBS+=drivers/video/libvideo.o
- LIBS+=drivers/watchdog/libwatchdog.o
- LIBS+=common/libcommon.o
- LIBS+=lib/libfdt/libfdt.o
- LIBS+=api/libapi.o
- LIBS+=post/libpost.o
- ifneq($(CONFIG_AM33XX)$(CONFIG_OMAP34XX)$(CONFIG_OMAP44XX)$(CONFIG_OMAP54XX),)
- LIBS+=$(CPUDIR)/omap-common/libomap-common.o
- endif
- ifeq($(SOC),mx5)
- LIBS+=$(CPUDIR)/imx-common/libimx-common.o
- endif
- ifeq($(SOC),mx6)
- LIBS+=$(CPUDIR)/imx-common/libimx-common.o
- endif
- ifeq($(SOC),s5pc1xx)
- LIBS+=$(CPUDIR)/s5p-common/libs5p-common.o
- endif
- ifeq($(SOC),exynos)
- LIBS+=$(CPUDIR)/s5p-common/libs5p-common.o
- endif
-
评论