U-Boot顶层Makefile分析

 

#
# (C) Copyright 2000-2006
# 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 = 1    //主版本号
PATCHLEVEL = 1   //次版本号 
SUBLEVEL = 6   //修正版本号
EXTRAVERSION =   //版本号扩展
U_BOOT_VERSION = $(VERSION).$(PATCHLEVEL).$(SUBLEVEL)$(EXTRAVERSION) //定义U-Boot的版本1.1.6
VERSION_FILE = $(obj)include/version_autogenerated.h

//:=定义的变量为直接展开式变量即变量中对其他变量或函数的引用,在定义变量时被展开
/*
 uname可显示电脑以及操作系统的相关信息。
   -a或--all   显示全部的信息。
    -m或--machine  显示电脑类型。
   -n或-nodename  显示在网络上的主机名称。
   -r或--release  显示操作系统的发行编号。
   -s或--sysname  显示操作系统名称。
   -v     显示操作系统的版本。
   --help    显示帮助。
     --version   显示版本信息。
*/
/*
 sed [-hnV][-e<script>][-f<script文件>][文本文件]
 [ address [,address]] s/ pattern-to-find /replacement-pattern/[g p w n]
 s选项通知s e d这是一个替换操作,并查询pattern-to-find,成功后用replacement-pattern替换它。
*/
//uname通过管道导出机器类型到sed,sed根据机器的类型,判断机器结构,比如:机器类型powerpc,则机器结构位ppc
HOSTARCH := $(shell uname -m | \
 sed -e s/i.86/i386/ \
     -e s/sun4u/sparc64/ \
     -e s/arm.*/arm/ \
     -e s/sa110/arm/ \
     -e s/powerpc/ppc/ \
     -e s/macppc/ppc/)
//uname得到开发平台的系统名称通过管道输出到tr,tr把系统名Linux转换为linux通过管道输出给sed得到 HOSTOS=linux
HOSTOS := $(shell uname -s | tr '[:upper:]' '[:lower:]' | \
     sed -e 's/\(cygwin\).*/cygwin/')
    
//HOSTARCH HOSTOS 这些变量传递给下一层的Makefile
export HOSTARCH HOSTOS

# Deal with colliding definitions from tcsh etc.
VENDOR=

#########################################################################
#
# 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
# ''
#
# 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.
#
/*
 Uboot支持将目标文件生成在外部的文件夹中,有两种命令可以实现。
 1,加入O=命令
 2,设定环境变量BUILD_DIR
 如果以上两种方式都没有定义,那么它将会被存放在源码目录下
*/
ifdef O   //若果定义了 O
ifeq ("$(origin O)", "command line")//且 O 是在命令行中定义的,例如:make O=/tmp/build all
BUILD_DIR := $(O) //BUILD_DIR=/tmp/build all
endif
endif

ifneq ($(BUILD_DIR),)  //BUILD_DIR不为空
saved-output := $(BUILD_DIR)  //saved-output=$(BUILD_DIR)=/tmp/build all

# Attempt to create a output directory.
/*
 mkdir [-p][--help][--version][-m <目录属性>][目录名称]
 -m<目录属性>或--mode<目录属性>  建立目录时同时设置目录的权限。
   -p或--parents       若所要建立目录的上层目录目前尚未建立,则会一并建立上层目录。
  --help         显示帮助。
   --verbose        执行时显示详细的信息。
   --version        显示版本信息。
*/
$(shell [ -d ${BUILD_DIR} ] || mkdir -p ${BUILD_DIR}) //如果BUILD_DIR是目录则创建目录BUILD_DIR

# Verify if it was successful.
BUILD_DIR := $(shell cd $(BUILD_DIR) && /bin/pwd) //用cd进入此目录并用pwd获得此路径名并赋值给BUILD_DIR
/*
 $(if CONDITION,THEN-PART[,ELSE-PART])
 如果$(BUILD_DIR)不为空则什么都不做,如果为空则error output directory "$(saved-output)" does not exist
*/
$(if $(BUILD_DIR),,$(error output directory "$(saved-output)" does not exist))
endif # ifneq ($(BUILD_DIR),)
/*
 OBJTREE和LNDIR为存放生成文件的目录,TOPDIR与SRCTREE为源码所在目录
*/
OBJTREE  := $(if $(BUILD_DIR),$(BUILD_DIR),$(CURDIR))//如果$(BUILD_DIR)不为空则OBJTREE:=BUILD_DIR,否则OBJTREE:=CURDIR
SRCTREE  := $(CURDIR)
TOPDIR  := $(SRCTREE)
LNDIR  := $(OBJTREE)
/*
 GNU make环境变量CURDIR
 CURDIR此变量代表make的工作目录。当使用-C选项进入一个子目录后,此变量将被重新赋值
 总之,如果在Makefile中没有对此变量进行显式的赋值操作,那么它代表make的工作目录
 我们也可以在Makefile为这个变量赋一个新的值。此时这变量将不再代表make的工作目录
*/
/*
 OPDIR SRCTREE OBJTREE这三个目录会给下层的makefile调用,需要在这里指定并export
*/
export TOPDIR SRCTREE OBJTREE

MKCONFIG := $(SRCTREE)/mkconfig
export MKCONFIG
/*
 SRCTREE变量就是U-Boot代码顶层目录,而OBJTREE变量就是输出目录,若没有定义BUILD_DIR环境变量,
 则SRCTREE变量与OBJTREE变量都是U-Boot源代码目录CURDIR。而MKCONFIG则表示U-Boot根目录下的mkconfig脚本。

*/
/*
 从以上代码可知如果CURDIR和OBJTREE相等即BUILD_DIR没有被定义
*/
ifneq ($(OBJTREE),$(SRCTREE)) //如果CURDIR和OBJTREE不相等即路径不同
REMOTE_BUILD  := 1
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)和$(src)已经在config.mk中定义,之所以在这里include config.mk之前定义$(obj)和$(src)
 是为了其他的一些目标像: some targets like unconfig, clean, clobber, distclean, etc.
*/
ifneq ($(OBJTREE),$(SRCTREE))//如果CURDIR和OBJTREE不相等即路径不同
obj := $(OBJTREE)/
src := $(SRCTREE)/
else
obj :=
src :=
endif
export obj src

#########################################################################
/* $(wildcard PATTERN)
 函数名称:获取匹配模式文件名函数—wildcard
 函数功能:列出当前目录下所有符合模式“PATTERN”格式的文件名。
 返回值:空格分割的、存在当前目录下的所有符合模式“PATTERN”的文件名。
*/
ifeq ($(OBJTREE)/include/config.mk,$(wildcard $(OBJTREE)/include/config.mk))//判断$(OBJTREE)/include/config.mk存在且唯一

# load ARCH, BOARD, and CPU configuration
/*
 config.mk中有ARCH CPU BOARD VENDOR SOC的定义,在此把他们包含进来,然后再export共下层Makefile使用
*/
include $(OBJTREE)/include/config.mk
export ARCH CPU BOARD VENDOR SOC

ifndef CROSS_COMPILE //如果没有定义了CROSS_COMPILE交叉编译环境

ifeq ($(HOSTARCH),ppc) //如果主机硬件结构$(HOSTARCH)=ppc
CROSS_COMPILE =   //CROSS_COMPILE为空
else
ifeq ($(ARCH),ppc)  
CROSS_COMPILE = powerpc-linux-
endif

ifeq ($(ARCH),arm)  //如果开发板ARCH=arm
CROSS_COMPILE = /opt/EmbedSky/crosstools_3.4.5_softfloat/gcc-3.4.5-glibc-2.3.6/arm-linux/bin/arm-linux-
endif

ifeq ($(ARCH),i386)  //如果开发板ARCH=i386
ifeq ($(HOSTARCH),i386) //并且主机HOSTARCH=i386
CROSS_COMPILE =
else     //如果主机HOSTARCH不等于i386
CROSS_COMPILE = i386-linux-
endif
endif

ifeq ($(ARCH),mips)  //如果开发板ARCH=mips
CROSS_COMPILE = mips_4KC-
endif
ifeq ($(ARCH),nios)  //如果开发板ARCH=nios
CROSS_COMPILE = nios-elf-
endif
ifeq ($(ARCH),nios2) //如果开发板ARCH=nios2
CROSS_COMPILE = nios2-elf-
endif
ifeq ($(ARCH),m68k)  //如果开发板ARCH=m68k
CROSS_COMPILE = m68k-elf-
endif 
ifeq ($(ARCH),microblaze)//如果开发板ARCH=microblaze
CROSS_COMPILE = mb-
endif
ifeq ($(ARCH),blackfin) //如果开发板ARCH=blackfin
CROSS_COMPILE = bfin-elf-
endif
ifeq ($(ARCH),avr32) //如果开发板ARCH=avr32
CROSS_COMPILE = avr32-
endif

endif
endif

export CROSS_COMPILE

# load other configuration
include $(TOPDIR)/config.mk

#########################################################################
# U-Boot objects....order is important (i.e. start must be first)
/*
 U-Boot目标文件,顺序很重要。start.o必须是第一个
*/
OBJS  = cpu/$(CPU)/start.o
//一下所包含的.o文件均在相应的$(CPU)文件夹下

ifeq ($(CPU),i386)   //开发板CPU类型为$(CPU)=i386
OBJS += cpu/$(CPU)/start16.o//以追加的方式增加start16.o,reset.o
OBJS += cpu/$(CPU)/reset.o
endif

ifeq ($(CPU),ppc4xx) //开发板CPU类型为$(CPU)=ppc4xx
OBJS += cpu/$(CPU)/resetvec.o//以追加的方式增加resetvec.o
endif

ifeq ($(CPU),mpc83xx) //开发板CPU类型为$(CPU)=mpc83xx
OBJS += cpu/$(CPU)/resetvec.o//以追加的方式增加resetvec.o
endif

ifeq ($(CPU),mpc85xx) //开发板CPU类型为$(CPU)=mpc85xx
OBJS += cpu/$(CPU)/resetvec.o//以追加的方式增加resetvec.o
endif

ifeq ($(CPU),mpc86xx) //开发板CPU类型为$(CPU)=mpc86xx
OBJS += cpu/$(CPU)/resetvec.o//以追加的方式增加resetvec.o
endif

ifeq ($(CPU),bf533)  //开发板CPU类型为$(CPU)=bf533
OBJS += cpu/$(CPU)/start1.o cpu/$(CPU)/interrupt.o cpu/$(CPU)/cache.o
OBJS += cpu/$(CPU)/cplbhdlr.o cpu/$(CPU)/cplbmgr.o cpu/$(CPU)/flush.o
endif //以追加的方式增加start1.o,interrupt.o,cache.o,cplbhdlr.o,cplbmgr.o,flush.o

/* $(addprefix PREFIX,NAMES…)
 函数名称:加前缀函数—addprefix。
 函数功能:为“NAMES…”中的每一个文件名添加前缀“PREFIX”。参数“NAMES…”是空格分割的文件名序列,将“SUFFIX”添加到此序列的每一个文件名之前。
 返回值:以单空格分割的添加了前缀“PREFIX”的文件名序列。
*/
OBJS := $(addprefix $(obj),$(OBJS))//把$(OBJS)下的所有.o文件放到$(obj)的下面

/* 添加库,但这时各个库.a文件还没有生成*/
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/jffs2/libjffs2.a//fst目录
LIBS += net/libnet.a   //net目录
LIBS += rtc/librtc.a   //rtc目录
LIBS += drivers/libdrivers.a //drivers目录
LIBS += drivers/nand/libnand.a //drivers目录
LIBS += drivers/nand_legacy/libnand_legacy.a//drivers目录
LIBS += drivers/lcd/liblcd.a //drivers目录
LIBS += modules/usb.modules  //modules目录
LIBS += modules/wince.module //modules目录
LIBS += common/libcommon.a  //common目录
LIBS += $(BOARDLIBS)

LIBS := $(addprefix $(obj),$(LIBS))//把$LIBS)下的所有.a文件放到$(obj)的下面
.PHONY : $(LIBS) //定义$(LIBS)为为目标

// Add GCC lib
/*
 dirname是取目录
 反引号用于设置系统命令的输出到变量,shell将反引号中的内容作为一个系统命令,并执行其内容
 `$(CC) $(CFLAGS) -print-libgcc-file-name`将得到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)
/*
 SUBDIRS=tools examples post post/cpu且定义为伪目标
*/
SUBDIRS = tools \
   examples \
   post \
   post/cpu
.PHONY : $(SUBDIRS)

ifeq ($(CONFIG_NAND_U_BOOT),y) //如果CONFIG_NAND_U_BOOT被定义
NAND_SPL = nand_spl
U_BOOT_NAND = $(obj)u-boot-nand.bin
endif

/* $(subst FROM,TO,TEXT)
 函数名称:字符串替换函数—subst。
 函数功能:把字串“TEXT”中的“FROM”字符替换为“TO”。
*/
__OBJS := $(subst $(obj),,$(OBJS)) //取所有的.o文件并去掉路径名
__LIBS := $(subst $(obj),,$(LIBS)) //取所有的.a文件并去掉路径名

#########################################################################
#########################################################################
//ALL =$(obj)目录下的u-boot.srec u-boot.bin System.map $(U_BOOT_NAND)
ALL = $(obj)u-boot.srec $(obj)u-boot.bin $(obj)System.map $(U_BOOT_NAND)

all:  $(ALL) //all依赖于$(ALL)

/*
 在顶层config.mk中定义:
 OBJCOPY = $(CROSS_COMPILE)objcopy
 OBJDUMP = $(CROSS_COMPILE)objdump
 OBJCFLAGS += --gap-fill=0xff
 相应的ihex,srec,binary生成相应的文件所需要的标示吧,就行生成.o文件需要 o 一样
*/
$(obj)u-boot.hex: $(obj)u-boot
  $(OBJCOPY) ${OBJCFLAGS} -O ihex $< $@//$<=$(obj)u-boot$@=$(obj)u-boot.hex 一下类推

$(obj)u-boot.srec: $(obj)u-boot
  $(OBJCOPY) ${OBJCFLAGS} -O srec $< $@

$(obj)u-boot.bin: $(obj)u-boot
  $(OBJCOPY) ${OBJCFLAGS} -O binary $< $@
/*
 mkimage使用详解
 uboot源代码的tools/目录下有mkimage工具,这个工具可以用来制作不压缩或者压缩的多种可启动映象文件。
 mkimage在制作映象文件的时候,是在原来的可执行映象文件的前面加上一个0x40字节的头,记录参数所指定的信息,
 这样uboot才能识别这个映象是针对哪个CPU体系结构的,哪个OS的,哪种类型,加载内存中的哪个位置,
 入口点在内存的那个位置以及映象名是什么.
 
 -A 指定CPU的体系结构:
  alpha Alpha arm ARM x86 Intel x86 ia64 IA64 mips MIPS mips64 MIPS 64 Bit ppc PowerPC s390 IBM S390
  sh SuperH sparc SPARC sparc64 SPARC 64 Bit m68k MC68000
 -O 指定操作系统类型,可以取以下值:
  openbsd、netbsd、freebsd、4_4bsd、linux、svr4、esix、solaris、irix、sco、dell、ncr、lynxos、vxworks、
  psos、qnx、u-boot、rtems、artos
 -T 指定映象类型,可以取以下值:
  tandalone、kernel、ramdisk、multi、firmware、、filesystem 
 -C 指定映象压缩方式,可以取以下值:
  one 不压缩
  zip 用gzip的压缩方式
  zip2 用bzip2的压缩方式
 -a 指定映象在内存中的加载地址,映象下载到内存中时,要按照用mkimage制作映象时,这个参数所指定的地址值来下载
 -e 指定映象运行的入口点地址,这个地址就是-a参数指定的值加上0x40(因为前面有个mkimage添加的0x40个字节的头)
 -n 指定映象名
 -d 指定制作映象的源文件
*/
$(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 $< $@

/*
 objdump有点象那个快速查看之流的工具,就是以一种可阅读的格式让你更多地了解二进制文件可能带有的附加信息。
 对于一般只想让自己程序 跑起来的程序员,这个命令没有更多意义,对于想进一步了解系统的程序员,应该掌握这种工具,
    至少你可以自己写写shellcode了,或者看看人家给的exploit中的shellcode是什么东西。
   
    -d 反汇编那些应该还有指令机器码的section
 -x 显示所有可用的头信息,包括符号表、重定位入口。-x 等价于-a -f -h -r -t 同时指定。

*/
$(obj)u-boot.dis: $(obj)u-boot
  $(OBJDUMP) -d $< > $@

$(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):
 echo $(OBJS) 
  $(MAKE) -C cpu/$(CPU) $(if $(REMOTE_BUILD),$@,$(notdir $@))

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

lcd:
 $(MAKE) -C drivers/lcd

$(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:
  @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 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/jffs2 \
    net rtc drivers wince 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/jffs2 \
    net rtc drivers wince 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的作用是强制删除$(obj)include下的config.h核config.mk以及$(obj)board下的所有config.tmp和config.tmp
 即删除删词make所产生的文件,为了下一次的make做准备
*/
unconfig:
 @rm -f $(obj)include/config.h $(obj)include/config.mk \
  $(obj)board/*/config.tmp $(obj)board/*/*/config.tmp


#========================================================================
# ARM
#========================================================================
#########################################################################
## StrongARM Systems
#########################################################################

assabet_config : unconfig
 @$(MKCONFIG) $(@:_config=) arm sa1100 assabet

dnp1110_config : unconfig
 @$(MKCONFIG) $(@:_config=) arm sa1100 dnp1110

gcplus_config : unconfig
 @$(MKCONFIG) $(@:_config=) arm sa1100 gcplus

lart_config : unconfig
 @$(MKCONFIG) $(@:_config=) arm sa1100 lart

shannon_config : unconfig
 @$(MKCONFIG) $(@:_config=) arm sa1100 shannon

#########################################################################
## ARM92xT Systems
#########################################################################
/*把$1中的_config替换为空,_old替换为空,_bigflash替换为空,_bigram替换为空*/
xtract_trab = $(subst _bigram,,$(subst _bigflash,,$(subst _old,,$(subst _config,,$1))))

/*把$1中的_config替换为空,_cs_autoboot替换为空,_cs3boot替换为空,_cs0boot替换为空*/
xtract_omap1610xxx = $(subst _cs0boot,,$(subst _cs3boot,,$(subst _cs_autoboot,,$(subst _config,,$1))))

/*把$1中的_config替换为空,_cs3boot替换为空,_cs0boot替换为空*/
xtract_omap730p2 = $(subst _cs0boot,,$(subst _cs3boot,, $(subst _config,,$1)))

at91rm9200dk_config : unconfig
/*向mkconfig中传递5个参数 arm arm920t at91rm9200dk NULL at91rm9200*/
 @$(MKCONFIG) $(@:_config=) arm arm920t at91rm9200dk NULL at91rm9200

cmc_pu2_config : unconfig
/*向mkconfig中传递5个参数 arm arm920t cmc_pu2 NULL at91rm9200*/
 @$(MKCONFIG) $(@:_config=) arm arm920t cmc_pu2 NULL at91rm9200

csb637_config : unconfig
/*向mkconfig中传递5个参数 arm arm920t csb637 NULL at91rm9200*/
 @$(MKCONFIG) $(@:_config=) arm arm920t csb637 NULL at91rm9200

mp2usb_config : unconfig
/*向mkconfig中传递5个参数 arm arm920t mp2usb NULL at91rm9200*/
 @$(MKCONFIG) $(@:_config=) arm arm920t mp2usb NULL at91rm9200


########################################################################
## ARM Integrator boards - see doc/README-integrator for more info.
integratorap_config \
ap_config  \
ap966_config  \
ap922_config  \
ap922_XA10_config \
ap7_config  \
ap720t_config    \
ap920t_config  \
ap926ejs_config  \
ap946es_config: unconfig
 @board/integratorap/split_by_variant.sh $@ //执行次脚本board/integratorap/split_by_variant.sh

integratorcp_config \
cp_config  \
cp920t_config  \
cp926ejs_config  \
cp946es_config  \
cp1136_config  \
cp966_config  \
cp922_config  \
cp922_XA10_config \
cp1026_config: unconfig
 @board/integratorcp/split_by_variant.sh $@//执行次脚本board/integratorcp/split_by_variant.sh

kb9202_config : unconfig
/*向mkconfig中传递5个参数 arm arm920t mp2usb NULL at91rm9200*/
 @$(MKCONFIG) $(@:_config=) arm arm920t kb9202 NULL at91rm9200

lpd7a400_config \
lpd7a404_config: unconfig
/*向mkconfig中传递5个参数 arm lh7a40x lpd7a40x*/
 @$(MKCONFIG) $(@:_config=) arm lh7a40x lpd7a40x

mx1ads_config : unconfig
/*向mkconfig中传递5个参数 arm arm920t mx1ads NULL imx*/
 @$(MKCONFIG) $(@:_config=) arm arm920t mx1ads NULL imx

mx1fs2_config : unconfig
/*向mkconfig中传递5个参数arm arm920t mx1fs2 NULL imx*/
 @$(MKCONFIG) $(@:_config=) arm arm920t mx1fs2 NULL imx
/*
 mkdir [-p][--help][--version][-m <目录属性>][目录名称]
 -m<目录属性>或--mode<目录属性>   建立目录时同时设置目录的权限。
   -p或--parents   若所要建立目录的上层目录目前尚未建立,则会一并建立上层目录。
   --help   显示帮助。
   --verbose   执行时显示详细的信息。
   --version   显示版本信息。
*/
/*
 $(findstring FIND,IN)
 函数名称:查找字符串函数—findstring。
 函数功能:搜索字串“IN”,查找“FIND”字串。
 返回值:如果在“IN”之中存在“FIND”,则返回“FIND”,否则返回空。
 
 Te s t命令用于测试字符串,文件状态和数字等于[ ]
 [ -z  ] -z 空串。
*/
netstar_32_config \
netstar_config:  unconfig
 @mkdir -p $(obj)include  //强制建立$(obj)include目录
 @if [ "$(findstring _32_,$@)" ] ; then \//如果$@中含有_32_此处$@为netstar_32_config或netstar_config
  echo "... 32MB SDRAM" ; \
  /*shell中显示#define PHYS_SDRAM_1_SIZE SZ_32M并导入到$(obj)include/config.h*/
  echo "#define PHYS_SDRAM_1_SIZE SZ_32M" >>$(obj)include/config.h ; \
 else \
  echo "... 64MB SDRAM" ; \
  echo "#define PHYS_SDRAM_1_SIZE SZ_64M" >>$(obj)include/config.h ; \
 fi
 @$(MKCONFIG) -a netstar arm arm925t netstar

omap1510inn_config : unconfig
 @$(MKCONFIG) $(@:_config=) arm arm925t omap1510inn

omap5912osk_config : unconfig
 @$(MKCONFIG) $(@:_config=) arm arm926ejs omap5912osk NULL omap

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 ; \
  echo "... configured for CS0 boot"; \
 elif [ "$(findstring _cs_autoboot_, $@)" ] ; then \
  echo "#define CONFIG_CS_AUTOBOOT" >> $(obj)./include/config.h ; \
  echo "... configured for CS_AUTO boot"; \
 else \
  echo "#define CONFIG_CS3_BOOT" >> $(obj)./include/config.h ; \
  echo "... configured for CS3 boot"; \
 fi;
/*
 $(call VARIABLE,PARAM,PARAM,...)
 reverse = $(2) $(1)
 foo = $(call reverse,a,b)
 变量foo的值为ba
*/
 @$(MKCONFIG) -a $(call xtract_omap1610xxx,$@) arm arm926ejs omap1610inn NULL 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 ; \
  echo "... configured for CS0 boot"; \
 else \
  echo "#define CONFIG_CS3_BOOT" >> $(obj)include/config.h ; \
  echo "... configured for CS3 boot"; \
 fi;
 @$(MKCONFIG) -a $(call xtract_omap730p2,$@) arm arm926ejs omap730p2 NULL omap

sbc2410x_config: unconfig
 @$(MKCONFIG) $(@:_config=) arm arm920t sbc2410x NULL s3c24x0

scb9328_config : unconfig
 @$(MKCONFIG) $(@:_config=) arm arm920t scb9328 NULL imx

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

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

EmbedSky_config : unconfig
 @$(MKCONFIG) $(@:_config=) arm arm920t EmbedSky NULL s3c24x0

SX1_config :  unconfig
 @$(MKCONFIG) $(@:_config=) arm arm925t sx1

# TRAB default configuration: 8 MB Flash, 32 MB RAM
trab_config \
trab_bigram_config \
trab_bigflash_config \
trab_old_config: unconfig
 @mkdir -p $(obj)include
 @mkdir -p $(obj)board/trab
 @ >$(obj)include/config.h
 @[ -z "$(findstring _bigram,$@)" ] || \
  { echo "#define CONFIG_FLASH_8MB"  >>$(obj)include/config.h ; \
    echo "#define CONFIG_RAM_32MB"   >>$(obj)include/config.h ; \
    echo "... with 8 MB Flash, 32 MB RAM" ; \
  }
 @[ -z "$(findstring _bigflash,$@)" ] || \
  { echo "#define CONFIG_FLASH_16MB" >>$(obj)include/config.h ; \
    echo "#define CONFIG_RAM_16MB"   >>$(obj)include/config.h ; \
    echo "... with 16 MB Flash, 16 MB RAM" ; \
    echo "TEXT_BASE = 0x0CF40000" >$(obj)board/trab/config.tmp ; \
  }
 @[ -z "$(findstring _old,$@)" ] || \
  { echo "#define CONFIG_FLASH_8MB"  >>$(obj)include/config.h ; \
    echo "#define CONFIG_RAM_16MB"   >>$(obj)include/config.h ; \
    echo "... with 8 MB Flash, 16 MB RAM" ; \
    echo "TEXT_BASE = 0x0CF40000" >$(obj)board/trab/config.tmp ; \
  }
 @$(MKCONFIG) -a $(call xtract_trab,$@) arm arm920t trab NULL s3c24x0

VCMA9_config : unconfig
 @$(MKCONFIG) $(@:_config=) arm arm920t vcma9 mpl s3c24x0

#========================================================================
# ARM supplied Versatile development boards
#========================================================================
versatile_config \
versatileab_config \
versatilepb_config : unconfig
 @board/versatile/split_by_variant.sh $@

voiceblue_smallflash_config \
voiceblue_config: unconfig
 @mkdir -p $(obj)include
 @mkdir -p $(obj)board/voiceblue
 @if [ "$(findstring _smallflash_,$@)" ] ; then \
  echo "... boot from lower flash bank" ; \
  echo "#define VOICEBLUE_SMALL_FLASH" >>$(obj)include/config.h ; \
  echo "VOICEBLUE_SMALL_FLASH=y" >$(obj)board/voiceblue/config.tmp ; \
 else \
  echo "... boot from upper flash bank" ; \
  >$(obj)include/config.h ; \
  echo "VOICEBLUE_SMALL_FLASH=n" >$(obj)board/voiceblue/config.tmp ; \
 fi
 @$(MKCONFIG) -a voiceblue arm arm925t voiceblue

cm4008_config : unconfig
 @$(MKCONFIG) $(@:_config=) arm arm920t cm4008 NULL ks8695

cm41xx_config : unconfig
 @$(MKCONFIG) $(@:_config=) arm arm920t cm41xx NULL ks8695

gth2_config  :  unconfig
 @mkdir -p $(obj)include
 @ >$(obj)include/config.h
 @echo "#define CONFIG_GTH2 1" >>$(obj)include/config.h
 @$(MKCONFIG) -a gth2 mips mips gth2

#########################################################################
## S3C44B0 Systems
#########################################################################

B2_config : unconfig
 @$(MKCONFIG) $(@:_config=) arm s3c44b0 B2 dave

 


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

clean:
 find $(OBJTREE) -type f \
  \( -name 'core' -o -name '*.bak' -o -name '*~' \
  -o -name '*.o'  -o -name '*.a'  \) -print \
  | xargs rm -f
 rm -f $(obj)examples/hello_world $(obj)examples/timer \
       $(obj)examples/eepro100_eeprom $(obj)examples/sched \
       $(obj)examples/mem_to_mem_idma2intr $(obj)examples/82559_eeprom \
       $(obj)examples/smc91111_eeprom $(obj)examples/interrupt \
       $(obj)examples/test_burst
 rm -f $(obj)tools/img2srec $(obj)tools/mkimage $(obj)tools/envcrc \
  $(obj)tools/gen_eth_addr
 rm -f $(obj)tools/mpc86x_clk $(obj)tools/ncb
 rm -f $(obj)tools/easylogo/easylogo $(obj)tools/bmp_logo
 rm -f $(obj)tools/gdb/astest $(obj)tools/gdb/gdbcont $(obj)tools/gdb/gdbsend
 rm -f $(obj)tools/env/fw_printenv $(obj)tools/env/fw_setenv
 rm -f $(obj)board/cray/L1/bootscript.c $(obj)board/cray/L1/bootscript.image
 rm -f $(obj)board/netstar/eeprom $(obj)board/netstar/crcek $(obj)board/netstar/crcit
 rm -f $(obj)board/netstar/*.srec $(obj)board/netstar/*.bin
 rm -f $(obj)board/trab/trab_fkt $(obj)board/voiceblue/eeprom
 rm -f $(obj)board/integratorap/u-boot.lds $(obj)board/integratorcp/u-boot.lds
 rm -f $(obj)include/bmp_logo.h
 rm -f $(obj)nand_spl/u-boot-spl $(obj)nand_spl/u-boot-spl.map

clobber: clean
 find $(OBJTREE) -type f \( -name .depend \
  -o -name '*.srec' -o -name '*.bin' -o -name u-boot.dis -o -name u-boot.img \) \
  -print0 \
  | xargs -0 rm -f
 rm -f $(OBJS) $(obj)*.bak $(obj)ctags $(obj)etags $(obj)TAGS $(obj)include/version_autogenerated.h
 rm -fr $(obj)*.*~
 rm -f $(obj)u-boot $(obj)u-boot.map $(obj)u-boot.hex $(ALL)
 rm -f $(obj)tools/crc32.c $(obj)tools/environment.c $(obj)tools/env/crc32.c
 rm -f $(obj)tools/inca-swap-bytes $(obj)cpu/mpc824x/bedbug_603e.c
 rm -f $(obj)include/asm/proc $(obj)include/asm/arch $(obj)include/asm
 [ ! -d $(OBJTREE)/nand_spl ] || find $(obj)nand_spl -lname "*" -print | xargs rm -f

ifeq ($(OBJTREE),$(SRCTREE))
mrproper \
distclean: clobber unconfig
else
mrproper \
distclean: clobber unconfig
 rm -rf $(OBJTREE)/*
endif

backup:
 F=`basename $(TOPDIR)` ; cd .. ; \
 gtar --force-local -zcvf `date "+$$F-%Y-%m-%d-%T.tar.gz"` $$F

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值