#
# (C) Copyright 2000-2011
# Wolfgang Denk, DENX Software Engineering, wd@denx.de.
#
# See file CREDITS for list of people who contributed to this
# project.
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License as
# 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 General Public License for more details.
#
# You should have received a copy of the 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 = 2011
PATCHLEVEL = 09
SUBLEVEL =
EXTRAVERSION =
ifneq "$(SUBLEVEL)" ""
U_BOOT_VERSION = $(VERSION).$(PATCHLEVEL).$(SUBLEVEL)$(EXTRAVERSION)
else
U_BOOT_VERSION = $(VERSION).$(PATCHLEVEL)$(EXTRAVERSION)
endif
TIMESTAMP_FILE = $(obj)include /timestamp_autogenerated .h
VERSION_FILE = $(obj)include /version_autogenerated .h
#########################################################################
#@定义主机系统架构@:
# “sed –e”表示后面跟的是一串命令脚本,而表达式“s/abc/def/”表示要从标准输入中,
# 查找到内容为“abc”的,然后替换成“def”。其中“abc”表达式用可以使用“.”作为通配符。
# 命令“uname –m”将输出主机CPU的体系架构类型。作者的电脑使用Intel Core2系列的CPU,
# 因此“uname –m”输出“i686”。 “i686”可以匹配命令“sed -e s/i.86/i386/”中的“i.86”,
# 因此在作者的机器上执行Makefile,HOSTARCH 将被设置成“i386” 。
#########################################################################
HOSTARCH := $(shell uname -m | \
sed -e s /i .86 /x86/ \
-e s /sun4u/sparc64/ \
-e s /arm .* /arm/ \
-e s /sa110/arm/ \
-e s /ppc64/powerpc/ \
-e s /ppc/powerpc/ \
-e s /macppc/powerpc/ \
-e s /sh .* /sh/ )
#########################################################################
#@定义主机操作系统类型@:
# “uname –s”输出主机内核名字,作者使用Linux发行版Ubuntu11.10,因此“uname –s”结果是“Linux”。
# “tr '[:upper:]' '[:lower:]'”作用是将标准输入中的所有大写字母转换为响应的小写字母。
# 因此执行结果是将HOSTOS 设置为“linux”。
#########################################################################
HOSTOS := $(shell uname -s | tr '[:upper:]' '[:lower:]' | \
sed -e 's/\(cygwin\).*/cygwin/' )
#########################################################################
#@定义执行shell脚本的shell@:
# "$$BASH"的作用实质上是生成了字符串“$BASH”(前一个$号的作用是指明第二个$是普通的字符)。
# 若执行当前Makefile的shell中定义了“$BASH”环境变量,且文件“$BASH”是可执行文件,
# 则SHELL的值为“$BASH”。否则,若“/bin/bash”是可执行文件,则SHELL值为“/bin/bash”。
# 若以上两条都不成立,则将“sh”赋值给SHELL变量。
# 由于作者的机器安装了bash shell,SHELL 被设置为 /bin/bash。
#########################################################################
# Set shell to bash if possible, otherwise fall back to sh
SHELL := $(shell if [ -x "$$BASH" ]; then echo $$BASH; \
else if [ -x /bin/bash ]; then echo /bin/bash ; \
else echo sh; fi ; fi )
#导出变量HOSTARCH HOSTOS SHELL,使别的文件可以使用这些变量
export HOSTARCH HOSTOS SHELL
# Deal with colliding definitions from tcsh etc.
VENDOR=
#因为MAKEFLAGS变量的字符串为空,找不到s字符串,所以ifeq条件为真,则XECHO = echo
# Allow for silent builds
ifeq (,$(findstring s,$(MAKEFLAGS)))
XECHO = echo
else
XECHO = :
endif
#########################################################################
#
# U-boot build supports producing a object files to the separate external
# directory. Two use cases are supported:
#
# 1) Add O= to the make command line
# '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
# 'export BUILD_DIR=/tmp/build'
# './MAKEALL'
#
# Command line 'O=' setting overrides BUILD_DIR environent variable.
#
# When none of the above methods is used the local build is performed and
# the object files are placed in the source directory.
#
#########################################################################
#@设定编译输出目录@:
# 函数$( origin, variable) 输出的结果是一个字符串,输出结果由变量variable定义的方式决定,
# 若variable在命令行中定义过,则origin函数返回值为"command line"。
# 假若在命令行中执行了“export BUILD_DIR=/tmp/build”的命令,则“$(origin O)”值为“command line”,
# 而BUILD_DIR被设置为“/tmp/build”。
#
# 假若在命令行中执行了“make O=am335x am335x_evm”的命令,则“$(origin O)”值为“command line”,
# 而BUILD_DIR被设置为“am335x”。
#########################################################################
ifdef O
ifeq ( "$(origin O)" , "command line" )
BUILD_DIR := $(O)
endif
endif
#判断 BUILD_DIR 变量是否为空,当前 BUILD_DIR 为 am335x,条件为真,则 saved-output 为 am335x
ifneq ($(BUILD_DIR),)
saved-output := $(BUILD_DIR)
#若${BUILD_DIR}表示的目录没有定义,则创建该目录。
# Attempt to create a output directory.
$(shell [ -d ${BUILD_DIR} ] || mkdir -p ${BUILD_DIR})
#若$(BUILD_DIR)为创建失败或不存在,则将其赋值为当前目录路径(源代码目录)。
#并检查$(BUILD_DIR)目录是否存在。
#Pwd命令用以获取当前路径
# Verify if it was successful.
BUILD_DIR := $(shell cd $(BUILD_DIR) && /bin/pwd )
$( if $(BUILD_DIR),,$(error output directory "$(saved-output)" does not exist))
endif # ifneq ($(BUILD_DIR),)
#########################################################################
#CURDIR变量指示Make当前的工作目录,由于当前Make在U-Boot顶层目录执行Makefile,
#因此CURDIR此时就是U-Boot顶层目录。
#执行完上面的代码后, SRCTREE,src变量就是U-Boot代码顶层目录,而OBJTREE,obj变量就是输出目录,
#若没有定义BUILD_DIR环境变量,则SRCTREE,src变量与OBJTREE,obj变量都是U-Boot源代码目录。
#而MKCONFIG则表示U-Boot根目录下的mkconfig脚本。
#if函数计算OBJTREE的值,如果BUILD_DIR不为空,if函数的值就是BUILD_DIR,否则是CURDIR.
#CURDIR是个环境变量。代表当前文件的目录,即uboot根目录,设为 : ./。
# CURDIR = ./
# OBJTREE = ./am335x
# SPLTREE = ./am335x/spl
# SRCTREE = ./
# TOPDIR = ./
# LNDIR = ./am335x
#导出变量TOPDIR SRCTREE OBJTREE SPLTREE,使别的文件可以使用这些变量
#########################################################################
OBJTREE := $( if $(BUILD_DIR),$(BUILD_DIR),$(CURDIR))
SPLTREE := $(OBJTREE) /spl
SRCTREE := $(CURDIR)
TOPDIR := $(SRCTREE)
LNDIR := $(OBJTREE)
export TOPDIR SRCTREE OBJTREE SPLTREE
# MKCONFIG = ./mkconfig
#导出变量MKCONFIG
MKCONFIG := $(SRCTREE) /mkconfig
export MKCONFIG
#########################################################################
#判断变量OBJTREE 与 SRCTREE 是否相等,OBJTREE为./am335x,SRCTREE为./变量,条件为真。
#则变量 REMOTE_BUILD 为 1,
#导出变量 REMOTE_BUILD
#########################################################################
ifneq ($(OBJTREE),$(SRCTREE))
REMOTE_BUILD := 1
export REMOTE_BUILD
endif
#########################################################################
#判断变量OBJTREE 与 SRCTREE 是否相等,OBJTREE为./am335x,SRCTREE为./变量,条件为真。
#则 obj 为 ./am335x/
# src 为 ./
#导出变量 obj src
#########################################################################
# $(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.
ifneq ($(OBJTREE),$(SRCTREE))
obj := $(OBJTREE)/
src := $(SRCTREE)/
else
obj :=
src :=
endif
export obj src
#失能导出变量 CDPATH的使用域,这样下文中如果定义了或使用了CDPATH变量,将不会收到导出变量CDPATH的影响。
# Make sure CDPATH settings don't interfere
unexport CDPATH
# The "tools" are needed early, so put this first
# Don't include stuff already done in $(LIBS)
SUBDIRS = tools \
examples /standalone \
examples /api
#定义SUBDIRS VERSION_FILE伪目标
.PHONY : $(SUBDIRS) $(VERSION_FILE)
#########################################################################
#使用“$(wildcard *.c) ”来获取工作目录下的所有的.c 文件列表
#在当前例子中,则是为了找到 ./am335x/include/config.mk
#判断是否找到 ./am335x/include/config.mk
#########################################################################
ifeq ($(obj)include /config .mk,$(wildcard $(obj)include /config .mk))
#########################################################################
#使用“include FILENAMES... ”,make程序处理时,如果“FILENAMES ”列表
# 中的任何一个文件不能正常读取而且不存在一个创建此文件的规则时make 程序将会提示错误并退出。
#
#使用“-include FILENAMES... ”的情况是,当所包含的文件不存在或者不存在一
# 个规则去创建它,make程序会继续执行,只有真正由于不能正确完成终极目标的重建
# 时(某些必需的目标无法在当前已读取的makefile 文件内容中找到正确的重建规则),
# 才会提示致命错误并退出。
#
#为了和其它的make 程序进行兼容。也可以使用“sinclude ”来代替“-include ”(GNU所支持的方式)
#
# include/autoconf.mk(./am335x/include/autoconf.mk)文件中是与开发板相关的一些宏定义,
# 在Makefile执行过程中需要根据某些宏来确定执行哪些操作。
# include/autoconf.mk生成的规则为下文的:$(obj)include/autoconf.mk: $(obj)include/config.h
# include/autoconf.mk.dep 同理.
#########################################################################
# Include autoconf.mk before config.mk so that the config options are available
# to all top level build files. We need the dummy all: target to prevent the
# dependency target in autoconf.mk.dep from being the default.
#执行make的时候默认就是执行make all
all:
sinclude $(obj)include /autoconf .mk.dep
sinclude $(obj)include /autoconf .mk
#包含./am335x/include/config.mk 文件,加载该文件中的ARCH CPU BOARD VENDOR SOC,并导出
# load ARCH, BOARD, and CPU configuration
include $(obj)include /config .mk
export ARCH CPU BOARD VENDOR SOC
#########################################################################
#FOO ?= bar
# 其含义是,如果 FOO 没有被定义过,那么变量 FOO 的值就是“bar”,如果 FOO 先前被定义
# 过,那么这条语将什么也不做,其等价于:
# ifeq ($(origin FOO), undefined)
# FOO = bar
# endif
#若主机架构与开发板结构相同,就使用主机的编译器,而不是交叉编译器
#当前 HOSTARCH 为 i386
#当前 ARCH 为 arm
#条件为假,则 CROSS_COMPILE 为交叉编译器,即 CROSS_COMPILE = arm-arago-linux-gnueabi-
#########################################################################
# set default to nothing for native builds
ifeq ($(HOSTARCH),$(ARCH))
CROSS_COMPILE ?=
endif
#包含 ./config.mk 文件,其主要是一些变量和函数的定义,编译链接的参数设置以及依赖规则.
# load other configuration
include $(TOPDIR) /config .mk
#########################################################################
#判断是否定义了 LDSCRIPT 变量,当前并没有定义该变量,条件为真
#
#如果定义了CONFIG_SYS_LDSCRIPT,将CONFIG_SYS_LDSCRIPT代表的字符串去掉双引号后赋值给LDSCRIPT变量
#这里我们并没有定义CONFIG_SYS_LDSCRIPT
#########################################################################
# If board code explicitly specified LDSCRIPT or CONFIG_SYS_LDSCRIPT, use
# that (or fail if absent). Otherwise, search for a linker script in a
# standard location.
ifndef LDSCRIPT
#LDSCRIPT := $(TOPDIR)/board/$(BOARDDIR)/u-boot.lds.debug
ifdef CONFIG_SYS_LDSCRIPT
# need to strip off double quotes
LDSCRIPT := $(subst ",,$(CONFIG_SYS_LDSCRIPT))
endif
endif
#BOARDDIR 定义与 ./mkconfig中,在当前例子中 BOARDDIR = $(VENDOR)/$(BOARD) = ti/am335x
#########################################################################
#如果没有用CONFIG_SYS_LDSCRIPT指定LDSCRIPT,那么就在以下几个地方搜
#判断是否定义了 LDSCRIPT 变量,当前并没有定义该变量,条件为真
#########################################################################
ifndef LDSCRIPT
#########################################################################
#如果CONFIG_NAND_U_BOOT变量是否等于 y,当前没有定义CONFIG_NAND_U_BOOT变量,条件为假。
#则不执行条件中的代码
#########################################################################
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
#########################################################################
#判断变量 LDSCRIPT 是否为空,当前 LDSCRIPT 为空,条件为真,执行条件中的代码。
# BOARDDIR 定义与 ./mkconfig中,在当前例子中 BOARDDIR = $(VENDOR)/$(BOARD) = ti/am335x
# TOPDIR = ./
# LDSCRIPT := $(TOPDIR)/board/$(BOARDDIR)/u-boot.lds -> LDSCRIPT = ./board/ti/am335x/u-boot.lds,
# 查找 ./board/ti/am335x/ 目录下的 u-boot.lds 文件,没有找到对应的文件,所以 LDSCRIPT 为空。
#########################################################################
ifeq ($(wildcard $(LDSCRIPT)),)
LDSCRIPT := $(TOPDIR) /board/ $(BOARDDIR) /u-boot .lds
endif
#########################################################################
#判断变量 LDSCRIPT 是否为空,当前 LDSCRIPT 为空,条件为真,执行条件中的代码。
# 在顶层 config.mk 中 得 CPUDIR = CPUDIR=arch/$(ARCH)/cpu/$(CPU) = arch/arm/cpu/armv7
# TOPDIR = ./
# LDSCRIPT := $(TOPDIR)/$(CPUDIR)/u-boot.lds -> LDSCRIPT = ./arch/arm/cpu/armv7/u-boot.lds,
# 查找 ./arch/arm/cpu/armv7/ 目录下的 u-boot.lds 文件,找到了对应的 u-boot.lds 文件,
# 因此,LDSCRIPT = ./arch/arm/cpu/armv7/u-boot.lds
#########################################################################
ifeq ($(wildcard $(LDSCRIPT)),)
LDSCRIPT := $(TOPDIR)/$(CPUDIR) /u-boot .lds
endif
#########################################################################
#判断变量 LDSCRIPT 是否为空, 当前 LDSCRIPT = ./arch/arm/cpu/armv7/u-boot.lds,
#条件为假,不执行条件中的代码
#########################################################################
ifeq ($(wildcard $(LDSCRIPT)),)
$(error could not find linker script)
endif
endif
#########################################################################
# U-Boot objects....order is important (i.e. start must be first)
# U-boot需要的目标文件,顺序很重要,start.o必须放第一位
# 在顶层 config.mk 中 得 CPUDIR = CPUDIR=arch/$(ARCH)/cpu/$(CPU) = arch/arm/cpu/armv7
OBJS = $(CPUDIR) /start .o
# 根据 ./am335x/include/config.mk 得 CPU = armv7
# 在顶层 config.mk 中 得 CPUDIR = CPUDIR=arch/$(ARCH)/cpu/$(CPU) = arch/arm/cpu/armv7
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
# obj = ./am335x
OBJS := $(addprefix $(obj),$(OBJS))
# 根据 ./am335x/include/config.mk 得 VENDOR = ti
LIBS = lib /libgeneric .o
LIBS += lib /lzma/liblzma .o
LIBS += lib /lzo/liblzo .o
LIBS += lib /zlib/libz .o
LIBS += $(shell if [ -f board/$(VENDOR) /common/Makefile ]; then echo \
"board/$(VENDOR)/common/lib$(VENDOR).o" ; fi )
LIBS += $(CPUDIR) /lib $(CPU).o
#根据 ./am335x/include/config.mk 得 SOC = ti81xx
ifdef SOC
LIBS += $(CPUDIR)/$(SOC) /lib $(SOC).o
endif
ifeq ($(CPU),ixp)
LIBS += arch /arm/cpu/ixp/npe/libnpe .o
endif
# 根据 ./am335x/include/config.mk 得 ARCH = arm
LIBS += arch/$(ARCH) /lib/lib $(ARCH).o
LIBS += fs /cramfs/libcramfs .o fs /fat/libfat .o fs /fdos/libfdos .o fs /jffs2/libjffs2 .o \
fs /reiserfs/libreiserfs .o fs /ext2/libext2fs .o fs /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/lib8xxx .o
endif
ifeq ($(CPU),mpc85xx)
LIBS += drivers /qe/libqe .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
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 /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
#根据 ./am335x/include/config.mk 得 SOC = ti81xx
ifeq ($(SOC),ti81xx)
LIBS += $(CPUDIR) /omap-common/libomap-common .o
endif
ifeq ($(SOC),omap3)
LIBS += $(CPUDIR) /omap-common/libomap-common .o
endif
ifeq ($(SOC),omap4)
LIBS += $(CPUDIR) /omap-common/libomap-common .o
endif
ifeq ($(SOC),s5pc1xx)
LIBS += $(CPUDIR) /s5p-common/libs5p-common .o
endif
ifeq ($(SOC),s5pc2xx)
LIBS += $(CPUDIR) /s5p-common/libs5p-common .o
endif
#########################################################################/*
# 8.3.6 $(addprefix PREFIX,NAMES…)
# 函数名称:加前缀函数—addprefix。
#
# 函数功能:为“NAMES…”中的每一个文件名添加前缀“PREFIX”。参数“ NAMES…”
# 是空格分割的文件名序列,将“SUFFIX”添加到此序列的每一个文件名之前。
#
# 返回值:以单空格分割的添加了前缀“PREFIX”的文件名序列。
#
#函数说明:
#示例:
#$(addprefix src/,foo bar)
#返回值为“src/foo src/bar”。
#
#
# obj = ./am335x
#########################################################################*/
LIBS := $(addprefix $(obj),$( sort $(LIBS)))
#定义LIBS TIMESTAMP_FILE伪目标
#TIMESTAMP_FILE = $(obj)include/timestamp_autogenerated.h -> ./am335x/include/timestamp_autogenerated.h
.PHONY : $(LIBS) $(TIMESTAMP_FILE)
# BOARDDIR 定义与 ./mkconfig中,在当前例子中 BOARDDIR = $(VENDOR)/$(BOARD) = ti/am335x
#根据 ./am335x/include/config.mk 得 BOARD = am335x
LIBBOARD = board/$(BOARDDIR) /lib $(BOARD).o
LIBBOARD := $(addprefix $(obj),$(LIBBOARD))
# 没有定义 USE_PRIVATE_LIBGCC
# Add GCC lib
ifdef USE_PRIVATE_LIBGCC
ifeq ( "$(USE_PRIVATE_LIBGCC)" , "yes" )
PLATFORM_LIBGCC = $(OBJTREE) /arch/ $(ARCH) /lib/libgcc .o
else
PLATFORM_LIBGCC = -L $(USE_PRIVATE_LIBGCC) -lgcc
endif
else
# 在顶层 config.mk(./config.mk) 中 得CC,CFLAGS:
#CC = $(CROSS_COMPILE)gcc
#CROSS_COMPILE = arm-arago-linux-gnueabi-
#CC = arm-arago-linux-gnueabi-gcc
PLATFORM_LIBGCC = -L $(shell dirname `$(CC) $(CFLAGS) -print-libgcc- file -name`) -lgcc
endif
PLATFORM_LIBS += $(PLATFORM_LIBGCC)
#导出变量 PLATFORM_LIBS
export PLATFORM_LIBS
# Special flags for CPP when processing the linker script.
# Pass the version down so we can handle backwards compatibility
# on the fly.
LDPPFLAGS += \
-include $(TOPDIR) /include/u-boot/u-boot .lds.h \
$(shell $(LD) --version | \
sed - ne 's/GNU ld version \([0-9][0-9]*\)\.\([0-9][0-9]*\).*/-DLD_MAJOR=\1 -DLD_MINOR=\2/p' )
__OBJS := $(subst $(obj),,$(OBJS))
__LIBS := $(subst $(obj),,$(LIBS)) $(subst $(obj),,$(LIBBOARD))
#########################################################################
#########################################################################
#没有定义变量 CONFIG_BOARD_SIZE_LIMIT,因此 BOARD_SIZE_CHECK 为空
ifneq ($(CONFIG_BOARD_SIZE_LIMIT),)
BOARD_SIZE_CHECK = \
@actual=` wc -c $@ | awk '{print $$1}' `; \
limit=$(CONFIG_BOARD_SIZE_LIMIT); \
if test $$actual -gt $$limit; then \
echo "$@ exceeds file size limit:" ; \
echo " limit: $$limit bytes" ; \
echo " actual: $$actual bytes" ; \
echo " excess: $$((actual - limit)) bytes" ; \
exit 1; \
fi
else
BOARD_SIZE_CHECK =
endif
#最终生成的各种镜像文件,及其生成方法
# Always append ALL so that arch config.mk's can add custom ones
ALL-y += $(obj)u-boot.srec $(obj)u-boot.bin $(obj)System.map
ALL-$(CONFIG_NAND_U_BOOT) += $(obj)u-boot-nand.bin
ALL-$(CONFIG_ONENAND_U_BOOT) += $(obj)u-boot-onenand.bin
ONENAND_BIN ?= $(obj)onenand_ipl /onenand-ipl-2k .bin
ALL-$(CONFIG_MMC_U_BOOT) += $(obj)mmc_spl /u-boot-mmc-spl .bin
ALL-$(CONFIG_SPL) += $(obj)spl /u-boot-spl .bin
all: $(ALL-y)
# 在uboot顶层 config.mk 中 得 OBJCOPY = $(CROSS_COMPILE)objcopy -> arm-arago-linux-gnueabi-objcopy,
# 生成 .hex 格式的文件
$(obj)u-boot.hex: $(obj)u-boot
$(OBJCOPY) ${OBJCFLAGS} -O ihex $< $@
# 在uboot顶层 config.mk 中 得 OBJCOPY = $(CROSS_COMPILE)objcopy -> arm-arago-linux-gnueabi-objcopy,
# 生成某个格式的文件
$(obj)u-boot.srec: $(obj)u-boot
$(OBJCOPY) -O srec $< $@
# BOARD_SIZE_CHECK 为空
# 生成 .bin 文件
$(obj)u-boot.bin: $(obj)u-boot
$(OBJCOPY) ${OBJCFLAGS} -O binary $< $@
$(BOARD_SIZE_CHECK)
$(obj)u-boot.ldr: $(obj)u-boot
$(CREATE_LDR_ENV)
$(LDR) -T $(CONFIG_BFIN_CPU) -c $@ $< $(LDR_FLAGS)
$(BOARD_SIZE_CHECK)
$(obj)u-boot.ldr.hex: $(obj)u-boot.ldr
$(OBJCOPY) ${OBJCFLAGS} -O ihex $< $@ -I binary
$(obj)u-boot.ldr.srec: $(obj)u-boot.ldr
$(OBJCOPY) ${OBJCFLAGS} -O srec $< $@ -I binary
# 在uboot顶层 config.mk 中 得 CONFIG_SYS_TEXT_BASE=0x80800000
$(obj)u-boot.img: $(obj)u-boot.bin
$(obj)tools /mkimage -A $(ARCH) -T firmware -C none \
-O u-boot -a $(CONFIG_SYS_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.imx: $(obj)u-boot.bin
$(obj)tools /mkimage -n $(CONFIG_IMX_CONFIG) -T imximage \
-e $(CONFIG_SYS_TEXT_BASE) -d $< $@
$(obj)u-boot.kwb: $(obj)u-boot.bin
$(obj)tools /mkimage -n $(CONFIG_SYS_KWD_CONFIG) -T kwbimage \
-a $(CONFIG_SYS_TEXT_BASE) -e $(CONFIG_SYS_TEXT_BASE) -d $< $@
$(obj)u-boot.sha1: $(obj)u-boot.bin
$(obj)tools /ubsha1 $(obj)u-boot.bin
$(obj)u-boot.dis: $(obj)u-boot
$(OBJDUMP) -d $< > $@
$(obj)u-boot.ubl: $(obj)u-boot-nand.bin
$(obj)tools /mkimage -n $(UBL_CONFIG) -T ublimage \
-e $(CONFIG_SYS_TEXT_BASE) -d $< $@
GEN_UBOOT = \
UNDEF_SYM=`$(OBJDUMP) -x $(LIBBOARD) $(LIBS) | \
sed -n -e 's/.*\($(SYM_PREFIX)__u_boot_cmd_.*\)/-u\1/p' | sort | uniq `;\
cd $(LNDIR) && $(LD) $(LDFLAGS) $(LDFLAGS_$(@F)) $$UNDEF_SYM $(__OBJS) \
--start-group $(__LIBS) --end-group $(PLATFORM_LIBS) \
-Map u-boot.map -o u-boot
#########################################################################/*
#u-boot ELF文件镜像的生成是最关键的.
#u-boot 依赖depend $(SUBDIR_TOOLS) $(OBJS) $(LIBBOARD) $(LIBS) $(LDSCRIPT) $(obj)u-boot.lds.
#然后用$(GEN_UBOOT)生成最后的u-boot,GEN_UBOOT就是用 ld 链接的过程
#########################################################################*/
$(obj)u-boot: depend \
$(SUBDIRS) $(OBJS) $(LIBBOARD) $(LIBS) $(LDSCRIPT) $(obj)u-boot.lds
$(GEN_UBOOT)
#没有定义 CONFIG_KALLSYMS
ifeq ($(CONFIG_KALLSYMS),y)
smap=`$(call SYSTEM_MAP,u-boot) | \
awk '$$2 ~ /[tTwW]/ {printf $$1 $$3 "\\\\000"}' ` ; \
$(CC) $(CFLAGS) -DSYSTEM_MAP= "\"$${smap}\"" \
-c common /system_map .c -o $(obj)common /system_map .o
$(GEN_UBOOT) $(obj)common /system_map .o
endif
# 在顶层 config.mk 中 得 CPUDIR = CPUDIR=arch/$(ARCH)/cpu/$(CPU) = arch/arm/cpu/armv7
#依赖目标$(OBJS),执行arch/arm/cpu/armv7 目录下的 makefile, 生成 ./am335x/arch/arm/cpu/armv7/start.o
#REMOTE_BUILD := 1
#看下$(if $(REMOTE_BUILD),$@,$(notdir $@))
#因为$(REMOTE_BUILD)为1,所以返回的是 $@ 的值,即 OBJS;
$(OBJS): depend
$(MAKE) -C $(CPUDIR) $( if $(REMOTE_BUILD),$@,$(notdir $@))
#依赖目标$(LIBS),进入到LIBS包含的很多目录,执行make,生成很多.a文件
$(LIBS): depend $(SUBDIRS)
$(MAKE) -C $( dir $(subst $(obj),,$@))
# BOARDDIR 定义与 ./mkconfig中,在当前例子中 BOARDDIR = $(VENDOR)/$(BOARD) = ti/am335x
# 根据 ./am335x/include/config.mk 得 BOARD = am335x
# LIBBOARD = board/$(BOARDDIR)/lib$(BOARD).o
# LIBBOARD := $(addprefix $(obj),$(LIBBOARD))
# LIBBOARD = ./am335x/board/ti/am335x/libam335x.o
$(LIBBOARD): depend $(LIBS)
$(MAKE) -C $( dir $(subst $(obj),,$@))
#伪目标SUBDIRS: 执行tools ,examples ,post,post\cpu 子目录下面的make文件
$(SUBDIRS): depend
$(MAKE) -C $@ all
#LDSCRIPT = ./arch/arm/cpu/armv7/u-boot.lds
# 其实就是把start.o和各个子目录makefile生成的库文件按照LDFLAGS连接在一起,
# 生成ELF文件u-boot 和连接时内存分配图文件u-boot.map。
$(LDSCRIPT): depend
$(MAKE) -C $( dir $@) $(notdir $@)
$(obj)u-boot.lds: $(LDSCRIPT)
$(CPP) $(CPPFLAGS) $(LDPPFLAGS) -ansi -D__ASSEMBLY__ -P - <$^ >$@
nand_spl: $(TIMESTAMP_FILE) $(VERSION_FILE) depend
$(MAKE) -C nand_spl /board/ $(BOARDDIR) all
$(obj)u-boot-nand.bin: nand_spl $(obj)u-boot.bin
cat $(obj)nand_spl /u-boot-spl-16k .bin $(obj)u-boot.bin > $(obj)u-boot-nand.bin
onenand_ipl: $(TIMESTAMP_FILE) $(VERSION_FILE) $(obj)include /autoconf .mk
$(MAKE) -C onenand_ipl /board/ $(BOARDDIR) all
$(obj)u-boot-onenand.bin: onenand_ipl $(obj)u-boot.bin
cat $(ONENAND_BIN) $(obj)u-boot.bin > $(obj)u-boot-onenand.bin
mmc_spl: $(TIMESTAMP_FILE) $(VERSION_FILE) depend
$(MAKE) -C mmc_spl /board/ $(BOARDDIR) all
$(obj)mmc_spl /u-boot-mmc-spl .bin: mmc_spl
$(obj)spl /u-boot-spl .bin: depend
$(MAKE) -C spl all
$(TIMESTAMP_FILE):
@LC_ALL=C date + '#define U_BOOT_DATE "%b %d %C%y"' > $@
@LC_ALL=C date + '#define U_BOOT_TIME "%T"' >> $@
updater:
$(MAKE) -C tools /updater all
#########################################################################/*
#TIMESTAMP_FILE = $(obj)include/timestamp_autogenerated.h -> ./am335x/include/timestamp_autogenerated.h
#VERSION_FILE = $(obj)include/version_autogenerated.h -> ./am335x/include/version_autogenerated.h
#obj = ./am335x/
#SUBDIRS = tools examples/standalone examples/api
#CPUDIR = CPUDIR = arch/$(ARCH)/cpu/$(CPU) -> arch/arm/cpu/armv7
#LDSCRIPT = $(TOPDIR)/$(CPUDIR)/u-boot.lds -> ./arch/arm/cpu/armv7/u-boot.lds
# 依赖目标depend :生成各个子目录的.depend文件,.depend列出每个目标文件的依赖文件。
# 生成方法,调用每个子目录的 make _depend
# 对$(SUBDIRS) $(CPUDIR) $(LDSCRIPT_MAKEFILE_DIR)目录生成depend依赖文件;
# 而_depend是在uboot根目录下的rules.mk(./rules.mk)中定义的,利用CC的-M选项生成依赖文件.
# 注意: 所有的 .depend 文件都是隐藏文件。
# 当前所有的 .depend 文件都生成在 ./am335x 目录下的各个子目录中。
#########################################################################*/
# Explicitly make _depend in subdirs containing multiple targets to prevent
# parallel sub-makes creating .depend files simultaneously.
depend dep: $(TIMESTAMP_FILE) $(VERSION_FILE) \
$(obj)include /autoconf .mk \
$(obj)include /generated/generic-asm-offsets .h \
$(obj)include /generated/asm-offsets .h
for dir in $(SUBDIRS) $(CPUDIR) $( dir $(LDSCRIPT)) ; do \
$(MAKE) -C $$ dir _depend ; done
TAG_SUBDIRS = $(SUBDIRS)
TAG_SUBDIRS += $( dir $(__LIBS))
TAG_SUBDIRS += include
FIND := find
FINDFLAGS := -L
tags ctags:
ctags -w -o $(obj)ctags `$(FIND) $(FINDFLAGS) $(TAG_SUBDIRS) \
-name '*.[chS]' -print`
etags:
etags -a -o $(obj)etags `$(FIND) $(FINDFLAGS) $(TAG_SUBDIRS) \
-name '*.[chS]' -print`
cscope:
$(FIND) $(FINDFLAGS) $(TAG_SUBDIRS) -name '*.[chS]' -print > \
cscope.files
cscope -b -q -k
SYSTEM_MAP = \
$(NM) $1 | \
grep - v '\(compiled\)\|\(\.o$$\)\|\( [aUw] \)\|\(\.\.ng$$\)\|\(LASH[RL]DI\)' | \
LC_ALL=C sort
$(obj)System.map: $(obj)u-boot
@$(call SYSTEM_MAP,$<) > $(obj)System.map
#
# Auto-generate the autoconf.mk file (which is included by all makefiles)
#
# This target actually generates 2 files; autoconf.mk and autoconf.mk.dep.
# the dep file is only include in this top level makefile to determine when
# to regenerate the autoconf.mk file.
$(obj)include /autoconf .mk.dep: $(obj)include /config .h include /common .h
@$(XECHO) Generating $@ ; \
set -e ; \
: Generate the dependancies ; \
$(CC) -x c -DDO_DEPS_ONLY -M $(HOSTCFLAGS) $(CPPFLAGS) \
-MQ $(obj)include /autoconf .mk include /common .h > $@
#########################################################################/*
# include/autoconf.mk依赖于make <board_name>_config 命令生成的include/config.h。
# 因此执行make <board_name>_config命令后再执行make all将更新include/autoconf.mk。
#
# 编译选项“-dM”的作用是输出include/common.h中定义的所有宏。
# 根据上面的规则,编译器提取include/common.h中定义的宏,
# 然后输出给tools/scripts/define2mk.sed脚本处理,处理的结果就是include/autoconf.mk文件。
# 其中tools/scripts/define2mk.sed脚本的主要完成了在include/common.h中查找和处理以“CONFIG_”开头的宏定义的功能。
#
# include/common.h文件包含了include/config.h(./am335x/include/config.h)文件,
# 而include/config.h文件又包含了以下4 个文件:
# #include <config_cmd_defaults.h> 位于: ./include/config_cmd_defaults.h
# #include <config_defaults.h> 位于: ./include/config_defaults.h
# #include <configs am335x_evm.h=""> 位于: ./include/configs/am335x_evm.h
# #include <asm config.h=""> 位于: ./arch/arm/include/asm/config.h
# 。因此include/autoconf.mk实质上就是以上5个文件中“CONFIG_”开头的有效的宏定义的集合。
#########################################################################*/
$(obj)include /autoconf .mk: $(obj)include /config .h
@$(XECHO) Generating $@ ; \
set -e ; \
: Extract the config macros ; \
$(CPP) $(CFLAGS) -DDO_DEPS_ONLY -dM include /common .h | \
sed -n -f tools /scripts/define2mk . sed > $@.tmp && \
mv $@.tmp $@
$(obj)include /generated/generic-asm-offsets .h: $(obj)include /autoconf .mk.dep \
$(obj)lib /asm-offsets .s
@$(XECHO) Generating $@
tools /scripts/make-asm-offsets $(obj)lib /asm-offsets .s $@
$(obj)lib /asm-offsets .s: $(obj)include /autoconf .mk.dep \
$(src)lib /asm-offsets .c
@ mkdir -p $(obj)lib
$(CC) -DDO_DEPS_ONLY \
$(CFLAGS) $(CFLAGS_$(BCURDIR)/$(@F)) $(CFLAGS_$(BCURDIR)) \
-o $@ $(src)lib /asm-offsets .c -c -S
$(obj)include /generated/asm-offsets .h: $(obj)include /autoconf .mk.dep \
$(obj)$(CPUDIR)/$(SOC) /asm-offsets .s
@ echo Generating $@
tools /scripts/make-asm-offsets $(obj)$(CPUDIR)/$(SOC) /asm-offsets .s $@
$(obj)$(CPUDIR)/$(SOC) /asm-offsets .s: $(obj)include /autoconf .mk.dep
@ mkdir -p $(obj)$(CPUDIR)/$(SOC)
if [ -f $(src)$(CPUDIR)/$(SOC) /asm-offsets .c ]; then \
$(CC) -DDO_DEPS_ONLY \
$(CFLAGS) $(CFLAGS_$(BCURDIR)/$(@F)) $(CFLAGS_$(BCURDIR)) \
-o $@ $(src)$(CPUDIR)/$(SOC) /asm-offsets .c -c -S; \
else \
touch $@; \
fi
#########################################################################
else # !config.mk ; ifeq ($(obj)include/config.mk,$(wildcard $(obj)include/config.mk))
all $(obj)u-boot.hex $(obj)u-boot.srec $(obj)u-boot.bin \
$(obj)u-boot.img $(obj)u-boot.dis $(obj)u-boot \
$(filter-out tools,$(SUBDIRS)) $(TIMESTAMP_FILE) \
updater depend dep tags ctags etags cscope $(obj)System.map:
@ echo "System not configured - see README" >&2
@ exit 1
tools: $(VERSION_FILE)
$(MAKE) -C $@ all
endif # config.mk ; ifeq ($(obj)include/config.mk,$(wildcard $(obj)include/config.mk))
#生成版本信息到版本文件VERSION_FILE中
$(VERSION_FILE):
@ mkdir -p $( dir $(VERSION_FILE))
@( localvers= '$(shell $(TOPDIR)/tools/setlocalversion $(TOPDIR))' ; \
printf '#define PLAIN_VERSION "%s%s"\n' \
"$(U_BOOT_VERSION)" "$${localvers}" ; \
printf '#define U_BOOT_VERSION "U-Boot %s%s"\n' \
"$(U_BOOT_VERSION)" "$${localvers}" ; \
) > $@.tmp
@( printf '#define CC_VERSION_STRING "%s"\n' \
'$(shell $(CC) --version | head -n 1)' )>> $@.tmp
@( printf '#define LD_VERSION_STRING "%s"\n' \
'$(shell $(LD) -v | head -n 1)' )>> $@.tmp
@ cmp -s $@ $@.tmp && rm -f $@.tmp || mv -f $@.tmp $@
easylogo env gdb:
$(MAKE) -C tools/$@ all MTD_VERSION=${MTD_VERSION}
gdbtools: gdb
tools-all: easylogo env gdb $(VERSION_FILE)
$(MAKE) -C tools HOST_TOOLS_ALL=y
.PHONY : CHANGELOG
CHANGELOG:
git log --no-merges U-Boot-1_1_5.. | \
unexpand -a | sed -e 's/\s\s*$$//' > $@
include /license .h: tools /bin2header COPYING
cat COPYING | gzip -9 -c | . /tools/bin2header license_gzip > include /license .h
#########################################################################
unconfig:
@ rm -f $(obj)include /config .h $(obj)include /config .mk \
$(obj)board/* /config .tmp $(obj)board/*/* /config .tmp \
$(obj)include /autoconf .mk $(obj)include /autoconf .mk.dep
#########################################################################
# %代表着任意字符
#%_config目标后面是双冒号,而我们平常看的只有一个冒号,这个就是makefile 的双冒号规则了,
#而平常我们见的单冒号就是普通规则。Makefile 中规定:一个目标可以出现在多个规则中。
#但是这些规则必须是同一类型的规则,要么都是普通规则,要么都是双冒号规则。
#而不允许一个目标同时出现在两种不同类型的规则中。双冒号规则和普通规则的处理的不同点表现在以下几个方面:
#1. 双冒号规则中,当依赖文件比目标更新时。规则将会被执行。对于一个没有依赖而只有命令行的双冒号规则,
# 当引用此目标时,规则的命令将会被无条件执行。而普通规则,当规则的目标文件存在时,
# 此规则的命令永远不会被执行(目标文件永远是最新的)。
#2. 当同一个文件作为多个双冒号规则的目标时。这些不同的规则会被独立的处理,
# 而不是像普通规则那样合并所有的依赖到一个目标文件。这就意味着对这些规则的处理就像多个不同
# 的普通规则一样。就是说多个双冒号规则中的每一个的依赖文件被改变之后,make只执行此规则定义的命令,
# 而其它的以这个文件作为目标的双冒号规则将不会被执行。
#@的作用是在执行这条命令的时候不进行显示,$(MKCONFIG)是取变量MKCONFIG,
#由MKCONFIG := $(SRCTREE)/mkconfig这条语句知,就是当前目录下的mkconfig文件,
#$(@:_config=)的意思是,讲目标文件名字中含有的_config用等号后面的的字符替换掉,
#这里=后面为空,所以其效果就是把_config去掉
# 格式为“$(VAR:A=B)”(或者“${VAR:A=B}”),意思是:替换变量“VAR”中所有“A”字符结尾的字为“B”结尾的字。
#########################################################################
%_config:: unconfig
@$(MKCONFIG) -A $(@:_config=)
#########################################################################
#读取uboot根目录下的 boards.cfg 文件生成 .boards.depend 隐藏文件,该文件位于 obj 目录下。
#########################################################################
sinclude $(obj).boards.depend
$(obj).boards.depend: boards.cfg
awk '(NF && $$1 !~ /^#/) { print $$1 ": " $$1 "_config; $$(MAKE)" }' $< > $@
#
# Functions to generate common board directory names
#
lcname = $(shell echo $(1) | sed -e 's/\(.*\)_config/\L\1/' )
ucname = $(shell echo $(1) | sed -e 's/\(.*\)_config/\U\1/' )
#########################################################################
## Coldfire
#########################################################################
astro_mcf5373l_config \
astro_mcf5373l_RAM_config : unconfig
@$(MKCONFIG) -n $@ -t $@ astro_mcf5373l m68k mcf532x mcf5373l astro
M52277EVB_config \
M52277EVB_spansion_config \
M52277EVB_stmicro_config : unconfig
@ case "$@" in \
M52277EVB_config) FLASH=SPANSION;; \
M52277EVB_spansion_config) FLASH=SPANSION;; \
M52277EVB_stmicro_config) FLASH=STMICRO;; \
esac ; \
if [ "$${FLASH}" = "SPANSION" ] ; then \
echo "#define CONFIG_SYS_SPANSION_BOOT" >> $(obj)include /config .h ; \
echo "CONFIG_SYS_TEXT_BASE = 0x00000000" > $(obj)board /freescale/m52277evb/config .tmp ; \
cp $(obj)board /freescale/m52277evb/u-boot .spa $(obj)board /freescale/m52277evb/u-boot .lds ; \
fi ; \
if [ "$${FLASH}" = "STMICRO" ] ; then \
echo "#define CONFIG_CF_SBF" >> $(obj)include /config .h ; \
echo "#define CONFIG_SYS_STMICRO_BOOT" >> $(obj)include /config .h ; \
echo "CONFIG_SYS_TEXT_BASE = 0x43E00000" > $(obj)board /freescale/m52277evb/config .tmp ; \
cp $(obj)board /freescale/m52277evb/u-boot .stm $(obj)board /freescale/m52277evb/u-boot .lds ; \
fi
@$(MKCONFIG) -n $@ -a M52277EVB m68k mcf5227x m52277evb freescale
M5235EVB_config \
M5235EVB_Flash16_config \
M5235EVB_Flash32_config: unconfig
@ case "$@" in \
M5235EVB_config) FLASH=16;; \
M5235EVB_Flash16_config) FLASH=16;; \
M5235EVB_Flash32_config) FLASH=32;; \
esac ; \
if [ "$${FLASH}" != "16" ] ; then \
echo "#define NORFLASH_PS32BIT 1" >> $(obj)include /config .h ; \
echo "CONFIG_SYS_TEXT_BASE = 0xFFC00000" > $(obj)board /freescale/m5235evb/config .tmp ; \
cp $(obj)board /freescale/m5235evb/u-boot .32 $(obj)board /freescale/m5235evb/u-boot .lds ; \
else \
echo "CONFIG_SYS_TEXT_BASE = 0xFFE00000" > $(obj)board /freescale/m5235evb/config .tmp ; \
cp $(obj)board /freescale/m5235evb/u-boot .16 $(obj)board /freescale/m5235evb/u-boot .lds ; \
fi
@$(MKCONFIG) -n $@ -a M5235EVB m68k mcf523x m5235evb freescale
cobra5272_config : unconfig
@$(MKCONFIG) $@ m68k mcf52x2 cobra5272
EB+MCF-EV123_config : unconfig
@ mkdir -p $(obj)include
@ mkdir -p $(obj)board /BuS/EB +MCF-EV123
@ echo "CONFIG_SYS_TEXT_BASE = 0xFFE00000" | tee $(obj)board /BuS/EB +MCF-EV123 /textbase .mk
@$(MKCONFIG) -n $@ EB+MCF-EV123 m68k mcf52x2 EB+MCF-EV123 BuS
EB+MCF-EV123_internal_config : unconfig
@ mkdir -p $(obj)include
@ mkdir -p $(obj)board /BuS/EB +MCF-EV123
@ echo "CONFIG_SYS_TEXT_BASE = 0xF0000000" | tee $(obj)board /BuS/EB +MCF-EV123 /textbase .mk
@$(MKCONFIG) -n $@ EB+MCF-EV123 m68k mcf52x2 EB+MCF-EV123 BuS
M5329AFEE_config \
M5329BFEE_config : unconfig
@ case "$@" in \
M5329AFEE_config) NAND=0;; \
M5329BFEE_config) NAND=16;; \
esac ; \
if [ "$${NAND}" != "0" ] ; then \
echo "#define NANDFLASH_SIZE $${NAND}" > $(obj)include /config .h ; \
fi
@$(MKCONFIG) -n $@ -a M5329EVB m68k mcf532x m5329evb freescale
M5373EVB_config : unconfig
@ case "$@" in \
M5373EVB_config) NAND=16;; \
esac ; \
if [ "$${NAND}" != "0" ] ; then \
echo "#define NANDFLASH_SIZE $${NAND}" > $(obj)include /config .h ; \
fi
@$(MKCONFIG) -a M5373EVB m68k mcf532x m5373evb freescale
M54451EVB_config \
M54451EVB_stmicro_config : unconfig
@ case "$@" in \
M54451EVB_config) FLASH=NOR;; \
M54451EVB_stmicro_config) FLASH=STMICRO;; \
esac ; \
if [ "$${FLASH}" = "NOR" ] ; then \
echo "CONFIG_SYS_TEXT_BASE = 0x00000000" > $(obj)board /freescale/m54451evb/config .tmp ; \
cp $(obj)board /freescale/m54451evb/u-boot .spa $(obj)board /freescale/m54451evb/u-boot .lds ; \
fi ; \
if [ "$${FLASH}" = "STMICRO" ] ; then \
echo "#define CONFIG_CF_SBF" >> $(obj)include /config .h ; \
echo "#define CONFIG_SYS_STMICRO_BOOT" >> $(obj)include /config .h ; \
echo "CONFIG_SYS_TEXT_BASE = 0x47E00000" > $(obj)board /freescale/m54451evb/config .tmp ; \
cp $(obj)board /freescale/m54451evb/u-boot .stm $(obj)board /freescale/m54451evb/u-boot .lds ; \
fi ; \
echo "#define CONFIG_SYS_INPUT_CLKSRC 24000000" >> $(obj)include /config .h ;
@$(MKCONFIG) -n $@ -a M54451EVB m68k mcf5445x m54451evb freescale
M54455EVB_config \
M54455EVB_atmel_config \
M54455EVB_intel_config \
M54455EVB_a33_config \
M54455EVB_a66_config \
M54455EVB_i33_config \
M54455EVB_i66_config \
M54455EVB_stm33_config : unconfig
@ case "$@" in \
M54455EVB_config) FLASH=ATMEL; FREQ=33333333;; \
M54455EVB_atmel_config) FLASH=ATMEL; FREQ=33333333;; \
M54455EVB_intel_config) FLASH=INTEL; FREQ=33333333;; \
M54455EVB_a33_config) FLASH=ATMEL; FREQ=33333333;; \
M54455EVB_a66_config) FLASH=ATMEL; FREQ=66666666;; \
M54455EVB_i33_config) FLASH=INTEL; FREQ=33333333;; \
M54455EVB_i66_config) FLASH=INTEL; FREQ=66666666;; \
M54455EVB_stm33_config) FLASH=STMICRO; FREQ=33333333;; \
esac ; \
if [ "$${FLASH}" = "INTEL" ] ; then \
echo "#define CONFIG_SYS_INTEL_BOOT" >> $(obj)include /config .h ; \
echo "CONFIG_SYS_TEXT_BASE = 0x00000000" > $(obj)board /freescale/m54455evb/config .tmp ; \
cp $(obj)board /freescale/m54455evb/u-boot .int $(obj)board /freescale/m54455evb/u-boot .lds ; \
fi ; \
if [ "$${FLASH}" = "ATMEL" ] ; then \
echo "#define CONFIG_SYS_ATMEL_BOOT" >> $(obj)include /config .h ; \
echo "CONFIG_SYS_TEXT_BASE = 0x04000000" > $(obj)board /freescale/m54455evb/config .tmp ; \
cp $(obj)board /freescale/m54455evb/u-boot .atm $(obj)board /freescale/m54455evb/u-boot .lds ; \
fi ; \
if [ "$${FLASH}" = "STMICRO" ] ; then \
echo "#define CONFIG_CF_SBF" >> $(obj)include /config .h ; \
echo "#define CONFIG_SYS_STMICRO_BOOT" >> $(obj)include /config .h ; \
echo "CONFIG_SYS_TEXT_BASE = 0x4FE00000" > $(obj)board /freescale/m54455evb/config .tmp ; \
cp $(obj)board /freescale/m54455evb/u-boot .stm $(obj)board /freescale/m54455evb/u-boot .lds ; \
fi ; \
echo "#define CONFIG_SYS_INPUT_CLKSRC $${FREQ}" >> $(obj)include /config .h ; \
$(XECHO) "... with $${FREQ}Hz input clock"
@$(MKCONFIG) -n $@ -a M54455EVB m68k mcf5445x m54455evb freescale
M5475AFE_config \
M5475BFE_config \
M5475CFE_config \
M5475DFE_config \
M5475EFE_config \
M5475FFE_config \
M5475GFE_config : unconfig
@ case "$@" in \
M5475AFE_config) BOOT=2;CODE=0;VID=0;USB=0;RAM=64;RAM1=0;; \
M5475BFE_config) BOOT=2;CODE=16;VID=0;USB=0;RAM=64;RAM1=0;; \
M5475CFE_config) BOOT=2;CODE=16;VID=1;USB=1;RAM=64;RAM1=0;; \
M5475DFE_config) BOOT=2;CODE=0;VID=0;USB=1;RAM=64;RAM1=0;; \
M5475EFE_config) BOOT=2;CODE=0;VID=1;USB=1;RAM=64;RAM1=0;; \
M5475FFE_config) BOOT=2;CODE=32;VID=1;USB=1;RAM=64;RAM1=64;; \
M5475GFE_config) BOOT=4;CODE=0;VID=0;USB=0;RAM=64;RAM1=0;; \
esac ; \
echo "#define CONFIG_SYS_BUSCLK 133333333" > $(obj)include /config .h ; \
echo "#define CONFIG_SYS_BOOTSZ $${BOOT}" >> $(obj)include /config .h ; \
echo "#define CONFIG_SYS_DRAMSZ $${RAM}" >> $(obj)include /config .h ; \
if [ "$${RAM1}" != "0" ] ; then \
echo "#define CONFIG_SYS_DRAMSZ1 $${RAM1}" >> $(obj)include /config .h ; \
fi ; \
if [ "$${CODE}" != "0" ] ; then \
echo "#define CONFIG_SYS_NOR1SZ $${CODE}" >> $(obj)include /config .h ; \
fi ; \
if [ "$${VID}" == "1" ] ; then \
echo "#define CONFIG_SYS_VIDEO" >> $(obj)include /config .h ; \
fi ; \
if [ "$${USB}" == "1" ] ; then \
echo "#define CONFIG_SYS_USBCTRL" >> $(obj)include /config .h ; \
fi
@$(MKCONFIG) -n $@ -a M5475EVB m68k mcf547x_8x m547xevb freescale
M5485AFE_config \
M5485BFE_config \
M5485CFE_config \
M5485DFE_config \
M5485EFE_config \
M5485FFE_config \
M5485GFE_config \
M5485HFE_config : unconfig
@ case "$@" in \
M5485AFE_config) BOOT=2;CODE=0;VID=0;USB=0;RAM=64;RAM1=0;; \
M5485BFE_config) BOOT=2;CODE=16;VID=0;USB=0;RAM=64;RAM1=0;; \
M5485CFE_config) BOOT=2;CODE=16;VID=1;USB=1;RAM=64;RAM1=0;; \
M5485DFE_config) BOOT=2;CODE=0;VID=0;USB=1;RAM=64;RAM1=0;; \
M5485EFE_config) BOOT=2;CODE=0;VID=1;USB=1;RAM=64;RAM1=0;; \
M5485FFE_config) BOOT=2;CODE=32;VID=1;USB=1;RAM=64;RAM1=64;; \
M5485GFE_config) BOOT=4;CODE=0;VID=0;USB=0;RAM=64;RAM1=0;; \
M5485HFE_config) BOOT=2;CODE=16;VID=1;USB=0;RAM=64;RAM1=0;; \
esac ; \
echo "#define CONFIG_SYS_BUSCLK 100000000" > $(obj)include /config .h ; \
echo "#define CONFIG_SYS_BOOTSZ $${BOOT}" >> $(obj)include /config .h ; \
echo "#define CONFIG_SYS_DRAMSZ $${RAM}" >> $(obj)include /config .h ; \
if [ "$${RAM1}" != "0" ] ; then \
echo "#define CONFIG_SYS_DRAMSZ1 $${RAM1}" >> $(obj)include /config .h ; \
fi ; \
if [ "$${CODE}" != "0" ] ; then \
echo "#define CONFIG_SYS_NOR1SZ $${CODE}" >> $(obj)include /config .h ; \
fi ; \
if [ "$${VID}" == "1" ] ; then \
echo "#define CONFIG_SYS_VIDEO" >> $(obj)include /config .h ; \
fi ; \
if [ "$${USB}" == "1" ] ; then \
echo "#define CONFIG_SYS_USBCTRL" >> $(obj)include /config .h ; \
fi
@$(MKCONFIG) -n $@ -a M5485EVB m68k mcf547x_8x m548xevb freescale
#========================================================================
# ARM
#========================================================================
xtract_omap1610xxx = $(subst _cs0boot,,$(subst _cs3boot,,$(subst _cs_autoboot,,$(subst _config,,$1))))
omap1610inn_config \
omap1610inn_cs0boot_config \
omap1610inn_cs3boot_config \
omap1610inn_cs_autoboot_config \
omap1610h2_config \
omap1610h2_cs0boot_config \
omap1610h2_cs3boot_config \
omap1610h2_cs_autoboot_config: unconfig
@ mkdir -p $(obj)include
@ if [ "$(findstring _cs0boot_, $@)" ] ; then \
echo "#define CONFIG_CS0_BOOT" >> .$(obj)include /config .h ; \
elif [ "$(findstring _cs_autoboot_, $@)" ] ; then \
echo "#define CONFIG_CS_AUTOBOOT" >> $(obj)include /config .h ; \
else \
echo "#define CONFIG_CS3_BOOT" >> $(obj)include /config .h ; \
fi ;
@$(MKCONFIG) -n $@ -a $(call xtract_omap1610xxx,$@) arm arm926ejs omap1610inn ti omap
omap730p2_config \
omap730p2_cs0boot_config \
omap730p2_cs3boot_config : unconfig
@ mkdir -p $(obj)include
@ if [ "$(findstring _cs0boot_, $@)" ] ; then \
echo "#define CONFIG_CS0_BOOT" >> $(obj)include /config .h ; \
else \
echo "#define CONFIG_CS3_BOOT" >> $(obj)include /config .h ; \
fi ;
@$(MKCONFIG) -n $@ -a omap730p2 arm arm926ejs omap730p2 ti omap
spear300_config \
spear310_config \
spear320_config : unconfig
@$(MKCONFIG) -n $@ -t $@ spear3xx arm arm926ejs $(@:_config=) spear spear
spear600_config : unconfig
@$(MKCONFIG) -n $@ -t $@ spear6xx arm arm926ejs $(@:_config=) spear spear
SX1_stdout_serial_config \
SX1_config: unconfig
@ mkdir -p $(obj)include
@ if [ "$(findstring _stdout_serial_, $@)" ] ; then \
echo "#undef CONFIG_STDOUT_USBTTY" >> $(obj)include /config .h ; \
else \
echo "#define CONFIG_STDOUT_USBTTY" >> $(obj)include /config .h ; \
fi ;
@$(MKCONFIG) -n $@ SX1 arm arm925t sx1
tx25_config : unconfig
@ echo "CONFIG_NAND_U_BOOT = y" >> $(obj)include /config .mk
@$(MKCONFIG) $@ arm arm926ejs tx25 karo mx25
ti8168_evm_config \
ti8168_evm_config_nand \
ti8168_evm_config_nor \
ti8168_evm_config_spi \
ti8168_evm_min_ocmc \
ti8168_evm_min_sd: unconfig
@ mkdir -p $(obj)include
@ echo "#define CONFIG_TI81XX" >>$(obj)include /config .h
@ echo "#define CONFIG_TI816X" >>$(obj)include /config .h
@ if [ "$(findstring _nand,$@)" ] ; then \
echo "#define CONFIG_SYS_NO_FLASH" >>$(obj)include /config .h ; \
echo "#define CONFIG_NAND_ENV" >>$(obj)include /config .h ; \
echo "Setting up TI8168 NAND build with ENV in NAND..." ; \
elif [ "$(findstring _nor,$@)" ] ; then \
echo "#define CONFIG_NOR" >>$(obj)include /config .h ; \
echo "#define CONFIG_NOR_BOOT" >>$(obj)include /config .h ; \
echo "Setting up TI8168 NOR build with ENV in NOR..." ; \
elif [ "$(findstring _spi,$@)" ] ; then \
echo "#define CONFIG_SYS_NO_FLASH" >>$(obj)include /config .h ; \
echo "#define CONFIG_SPI_ENV" >>$(obj)include /config .h ; \
echo "#define CONFIG_TI81XX_SPI_BOOT" >>$(obj)include /config .h ; \
echo "Setting up TI8168 SPI build with ENV in SPI..." ; \
elif [ "$(findstring _sd,$@)" ] ; then \
echo "#define CONFIG_SYS_NO_FLASH" >>$(obj)include /config .h ; \
echo "#define CONFIG_SD_BOOT" >>$(obj)include /config .h ; \
echo "TI_IMAGE = u-boot.min.sd" >>$(obj)board /ti/ti8168/config .tmp; \
echo "Setting up TI8168 SD boot minimal build..." ; \
elif [ "$(findstring _ocmc,$@)" ] ; then \
echo "#define CONFIG_SYS_NO_FLASH" >>$(obj)include /config .h ; \
echo "#define CONFIG_MINIMAL" >>$(obj)include /config .h ; \
echo "CONFIG_SYS_TEXT_BASE = 0x40410000" >>$(obj)board /ti/ti8168/config .tmp; \
echo "Setting up TI8168 minimal build..." ; \
else \
echo "#define CONFIG_SYS_NO_FLASH" >>$(obj)include /config .h ; \
echo "#define CONFIG_NAND_ENV" >>$(obj)include /config .h ; \
echo "Setting up TI8168 default build with NAND..." ; \
fi ;
@$(MKCONFIG) -a ti8168_evm arm armv7 ti8168 ti ti81xx
#########################################################################
## XScale Systems
#########################################################################
pdnb3_config \
scpu_config: unconfig
@ mkdir -p $(obj)include
@ if [ "$(findstring scpu_,$@)" ] ; then \
echo "#define CONFIG_SCPU" >>$(obj)include /config .h ; \
fi
@$(MKCONFIG) -n $@ -a pdnb3 arm ixp pdnb3 prodrive
#########################################################################
## ARM1136 Systems
#########################################################################
apollon_config : unconfig
@ mkdir -p $(obj)include
@ echo "#define CONFIG_ONENAND_U_BOOT" > $(obj)include /config .h
@ echo "CONFIG_ONENAND_U_BOOT = y" >> $(obj)include /config .mk
@$(MKCONFIG) $@ arm arm1136 apollon - omap24xx
imx31_phycore_eet_config \
imx31_phycore_config : unconfig
@ mkdir -p $(obj)include
@ if [ -n "$(findstring _eet_,$@)" ]; then \
echo "#define CONFIG_IMX31_PHYCORE_EET" >> $(obj)include /config .h; \
fi
@$(MKCONFIG) -n $@ -a imx31_phycore arm arm1136 imx31_phycore - mx31
mx31pdk_config \
mx31pdk_nand_config : unconfig
@ mkdir -p $(obj)include
@ if [ -n "$(findstring _nand_,$@)" ]; then \
echo "#define CONFIG_NAND_U_BOOT" >> $(obj)include /config .h; \
else \
echo "#define CONFIG_SKIP_LOWLEVEL_INIT" >> $(obj)include /config .h; \
fi
@$(MKCONFIG) -n $@ -a mx31pdk arm arm1136 mx31pdk freescale mx31
#########################################################################
## ARM1176 Systems
#########################################################################
smdk6400_noUSB_config \
smdk6400_config : unconfig
@ mkdir -p $(obj)include $(obj)board /samsung/smdk6400
@ mkdir -p $(obj)nand_spl /board/samsung/smdk6400
@ echo "#define CONFIG_NAND_U_BOOT" > $(obj)include /config .h
@ echo "CONFIG_NAND_U_BOOT = y" >> $(obj)include /config .mk
@ if [ -z "$(findstring smdk6400_noUSB_config,$@)" ]; then \
echo "RAM_TEXT = 0x57e00000" >> $(obj)board /samsung/smdk6400/config .tmp;\
else \
echo "RAM_TEXT = 0xc7e00000" >> $(obj)board /samsung/smdk6400/config .tmp;\
fi
@$(MKCONFIG) smdk6400 arm arm1176 smdk6400 samsung s3c64xx
@ echo "CONFIG_NAND_U_BOOT = y" >> $(obj)include /config .mk
#########################################################################
#########################################################################
clean:
@ rm -f $(obj)examples /standalone/82559_eeprom \
$(obj)examples /standalone/atmel_df_pow2 \
$(obj)examples /standalone/eepro100_eeprom \
$(obj)examples /standalone/hello_world \
$(obj)examples /standalone/interrupt \
$(obj)examples /standalone/mem_to_mem_idma2intr \
$(obj)examples /standalone/sched \
$(obj)examples /standalone/smc911 {11,x}_eeprom \
$(obj)examples /standalone/test_burst \
$(obj)examples /standalone/timer
@ rm -f $(obj)examples /api/demo {,.bin}
@ rm -f $(obj)tools /bmp_logo $(obj)tools /easylogo/easylogo \
$(obj)tools /env/ {fw_printenv,fw_setenv} \
$(obj)tools /envcrc \
$(obj)tools /gdb/ {astest,gdbcont,gdbsend} \
$(obj)tools /gen_eth_addr $(obj)tools /img2srec \
$(obj)tools /mkimage $(obj)tools /mpc86x_clk \
$(obj)tools /ncb $(obj)tools /ubsha1
@ rm -f $(obj)board /cray/L1/ {bootscript.c,bootscript.image} \
$(obj)board /matrix_vision/ * /bootscript .img \
$(obj)board /voiceblue/eeprom \
$(obj)u-boot.lds \
$(obj)arch /blackfin/cpu/bootrom-asm-offsets .[chs] \
$(obj)arch /blackfin/cpu/init .{lds,elf}
@ rm -f $(obj)include /bmp_logo .h
@ rm -f $(obj)lib /asm-offsets .s
@ rm -f $(obj)include /generated/asm-offsets .h
@ rm -f $(obj)$(CPUDIR)/$(SOC) /asm-offsets .s
@ rm -f $(obj)nand_spl/{u-boot.lds,u-boot-nand_spl.lds,u-boot-spl,u-boot-spl.map,System.map}
@ rm -f $(obj)onenand_ipl /onenand- {ipl,ipl.bin,ipl.map}
@ rm -f $(obj)mmc_spl/{u-boot.lds,u-boot-spl,u-boot-spl.map,u-boot-spl.bin,u-boot-mmc-spl.bin}
@ rm -f $(ONENAND_BIN)
@ rm -f $(obj)onenand_ipl /u-boot .lds
@ rm -f $(obj)spl/{u-boot-spl,u-boot-spl.bin,u-boot-spl.lds,u-boot-spl.map}
@ rm -f $(TIMESTAMP_FILE) $(VERSION_FILE)
@ find $(OBJTREE) - type f \
\( -name 'core' -o -name '*.bak' -o -name '*~' \
-o -name '*.o' -o -name '*.a' -o -name '*.exe' \) -print \
| xargs rm -f
clobber: clean
@ find $(OBJTREE) - type f \( -name '*.depend' \
-o -name '*.srec' -o -name '*.bin' -o -name u-boot.img \) \
-print0 \
| xargs -0 rm -f
@ rm -f $(OBJS) $(obj)*.bak $(obj)ctags $(obj)etags $(obj)TAGS \
$(obj)cscope.* $(obj)*.*~
@ rm -f $(obj)u-boot $(obj)u-boot.map $(obj)u-boot.hex $(ALL-y)
@ rm -f $(obj)u-boot.kwb
@ rm -f $(obj)u-boot.imx
@ rm -f $(obj)u-boot.ubl
@ rm -f $(obj)tools/{ env /crc32 .c,inca-swap-bytes}
@ rm -f $(obj)arch /powerpc/cpu/mpc824x/bedbug_603e .c
@ rm -fr $(obj)include /asm/proc $(obj)include /asm/arch $(obj)include /asm
@ rm -fr $(obj)include /generated
@[ ! -d $(obj)nand_spl ] || find $(obj)nand_spl -name "*" - type l -print | xargs rm -f
@[ ! -d $(obj)onenand_ipl ] || find $(obj)onenand_ipl -name "*" - type l -print | xargs rm -f
@[ ! -d $(obj)mmc_spl ] || find $(obj)mmc_spl -name "*" - type l -print | xargs rm -f
mrproper \
distclean: clobber unconfig
ifneq ($(OBJTREE),$(SRCTREE))
rm -rf $(obj)*
endif
backup:
F=` basename $(TOPDIR)` ; cd .. ; \
gtar --force- local -zcvf `LC_ALL=C date "+$$F-%Y-%m-%d-%T.tar.gz" ` $$F
#########################################################################
< /asm >< /configs >< /config_defaults .h>< /config_cmd_defaults .h>< /board_name >< /board_name >
|