Chinaunix首页 | 论坛 | 博客
  • 博客访问: 14415
  • 博文数量: 6
  • 博客积分: 201
  • 博客等级: 入伍新兵
  • 技术积分: 60
  • 用 户 组: 普通用户
  • 注册时间: 2009-06-19 16:24
文章分类
文章存档

2011年(4)

2009年(2)

我的朋友
最近访客

分类: LINUX

2009-06-19 16:36:00

这个怎么显示不出来颜色呢?
#make smdk2410_config
#make
这两句在干什么?
(1)make smdk2410_config
Makefile中有这样两句:
smdk2410_config : unconfig
@$(MKCONFIG) $(@:_config=) arm arm920t smdk2410 NULL s3c24x0
所以我们的make smdk2410_config是要生成smdk2410_config这目标;为了生成smdk2410_config要依赖于unconfig,unconfig是什么呢?在Makefile中找到这样一段:
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
unconfig的目的是为了删除掉1)include/config.h 2)include/config.mk 3)board/*/config.tmp 4)board/*/*/config.tmp include/autoconf.mk 5)include/autoconf.mk.dep.删除掉上一次编译生成的配置文件,方便下次编译。
再看@$(MKCONFIG)在Makefile中MKCONFIG := $(SRCTREE)/mkconfig,其中的SRCTREE就是uboot的根目录。$(@:_config=)的作用是把smdk2410_config中的_config后缀去掉。所以
smdk2410_config : unconfig
@$(MKCONFIG) $(@:_config=) arm arm920t smdk2410 NULL s3c24x0
等价于
smdk2410_config : unconfig
  /mkconfig smdk2410 arm arm920t smdk2410 NULL s3c24x0
              $1      $2   $3       $4      $5    $6
这样就给mkconfig 传递了6个参数。
再看根目录下的mkconfig文件
#!/bin/sh –e    #指定所用的shell 脚本

# Script to create header files and links to configure
# U-Boot for a specific board.
#
# Parameters:  Target  Architecture  CPU  Board [VENDOR] [SOC]
#
# (C) 2002-2006 DENX Software Engineering, Wolfgang Denk
#

APPEND=no            # Default: Create new config file 定义变量
BOARD_NAME=""    # Name to print in make output

while [ $# -gt 0 ] ; do  #所带参数中没有“--”,”-a”,”-n”所以不执行while这段。shell脚本编程
    case "$1" in
    --) shift ; break ;;
    -a) shift ; APPEND=yes ;;
    -n) shift ; BOARD_NAME="${1%%_config}" ; shift ;;
    *)  break ;;
    esac
done

[ "${BOARD_NAME}" ] || BOARD_NAME="$1"

[ $# -lt 4 ] && exit 1   #如果参数的个数小于4大于6则退出
[ $# -gt 6 ] && exit 1

echo "Configuring for ${BOARD_NAME} board..." #显示信息

#
# Create link to architecture specific headers
#
if [ "$SRCTREE" != "$OBJTREE" ] ; then  #我们的是相等的
    mkdir -p ${OBJTREE}/include
    mkdir -p ${OBJTREE}/include2
    cd ${OBJTREE}/include2
    rm -f asm
    ln -s ${SRCTREE}/include/asm-$2 asm
    LNPREFIX="../../include2/asm/"
    cd ../include
    rm -rf asm-$2
    rm -f asm
    mkdir asm-$2
    ln -s asm-$2 asm
else
    cd ./include  #删除原来的asm文件夹,重新创建一个asm 与asm-arm 软连接
    rm -f asm
    ln -s asm-$2 asm
fi

rm -f asm-$2/arch  #删除asm-arm/arch

if [ -z "$6" -o "$6" = "NULL" ] ; then # 参数6不为空也不为NULL
    ln -s ${LNPREFIX}arch-$3 asm-$2/arch
else
    ln -s ${LNPREFIX}arch-$6 asm-$2/arch # 建立asm-arm/arch==>arch-s3c24x0
fi

if [ "$2" = "arm" ] ; then
    rm -f asm-$2/proc  #删除掉asm-arm/proc
    ln -s ${LNPREFIX}proc-armv asm-$2/proc #建立asm-arm/proc==>proc-armv软连接
fi

#
# Create include file for Make
#创建的include/config.mk
echo "ARCH   = $2" >  config.mk
echo "CPU    = $3" >> config.mk
echo "BOARD  = $4" >> config.mk

 [ "$5" ] && [ "$5" != "NULL" ] && echo "VENDOR = $5" >> config.mk

[ "$6" ] && [ "$6" != "NULL" ] && echo "SOC    = $6" >> config.mk

#
# Create board specific header file
#
if [ "$APPEND" = "yes" ]    # Append to existing config file
then
    echo >> config.h
else
    > config.h        # Create new config file
fi
echo "/* Automatically generated - do not edit */" >>config.h
echo "#include " >>config.h

exit 0
########################mkconfig分析完#############################
########################config.mk分析##############################
ifneq ($(OBJTREE),$(SRCTREE)) # /*2个目录是相同的所以执行else,两个目录在顶层Makefile中定义*/
ifeq ($(CURDIR),$(SRCTREE))
dir :=
else
dir := $(subst $(SRCTREE)/,,$(CURDIR))
endif
obj := $(if $(dir),$(OBJTREE)/$(dir)/,$(OBJTREE)/)
src := $(if $(dir),$(SRCTREE)/$(dir)/,$(SRCTREE)/)
$(shell mkdir -p $(obj))
else
obj :=   #/*obj与src都是空*/
src :=
endif

# clean the slate ...
PLATFORM_RELFLAGS =
PLATFORM_CPPFLAGS =
PLATFORM_LDFLAGS =

#
# When cross-compiling on NetBSD, we have to define __PPC__ or else we
# will pick up a va_list declaration that is incompatible with the
# actual argument lists emitted by the compiler.
#
# [Tested on NetBSD/i386 1.5 + cross-powerpc-netbsd-1.3]
ifeq ($(ARCH),ppc) /**/
ifeq ($(CROSS_COMPILE),powerpc-netbsd-)
PLATFORM_CPPFLAGS+= -D__PPC__
endif
ifeq ($(CROSS_COMPILE),powerpc-openbsd-)
PLATFORM_CPPFLAGS+= -D__PPC__
endif
endif

ifeq ($(ARCH),arm)  # / *我们的结构是arm*/
ifeq ($(CROSS_COMPILE),powerpc-netbsd-)
PLATFORM_CPPFLAGS+= -D__ARM__
endif
ifeq ($(CROSS_COMPILE),powerpc-openbsd-)
PLATFORM_CPPFLAGS+= -D__ARM__
endif
endif

# Load generated board configuration
sinclude $(OBJTREE)/include/autoconf.mk  #把include/autoconf.mk包含进来,没有这文件但不报错*/

ifdef ARCH
#包含arm_config.mk,就一句话
#PLATFORM_CPPFLAGS += -DCONFIG_ARM -D__ARM__
sinclude $(TOPDIR)/$(ARCH)_config.mk  #include architecture dependend rules
endif
ifdef CPU
#cpu/arm920t/config.mk,只有4句设置PLATFORM_RELFLAGS 参数的。
sinclude $(TOPDIR)/cpu/$(CPU)/config.mk  # include CPU specific rules
endif
ifdef SOC
#实际上不存在cpu/arm920t/smdk2410/config.mk
sinclude $(TOPDIR)/cpu/$(CPU)/$(SOC)/config.mk # include SoC specific rules
endif
ifdef VENDOR
BOARDDIR = $(VENDOR)/$(BOARD) #VENDOR为空,所以BOARDDIR=/BOARD
else
BOARDDIR = $(BOARD)
endif
ifdef BOARD
#board/smdk2410/config.mk,就一句话:TEXT_BASE = 0x33F80000
sinclude $(TOPDIR)/board/$(BOARDDIR)/config.mk # include board specific rules
endif

#########################################################################
###把主机上可用的shell赋给CONFIG_SHELL
CONFIG_SHELL := $(shell if [ -x "$$BASH" ]; then echo $$BASH; \
else if [ -x /bin/bash ]; then echo /bin/bash; \
else echo sh; fi ; fi)

ifeq ($(HOSTOS)-$(HOSTARCH),darwin-ppc)
HOSTCC = cc
else
##主机的编译器是gcc
HOSTCC = gcc
endif
HOSTCFLAGS = -Wall -Wstrict-prototypes -O2 -fomit-frame-pointer   #编译选项
HOSTSTRIP = strip

#########################################################################
#
# Option checker (courtesy linux kernel) to ensure
# only supported compiler options are used
#
cc-option = $(shell if $(CC) $(CFLAGS) $(1) -S -o /dev/null -xc /dev/null \
> /dev/null 2>&1; then echo "$(1)"; else echo "$(2)"; fi ;)

#
# Include the make variables (CC, etc...)
# 定义交叉编译工具
AS = $(CROSS_COMPILE)as
LD = $(CROSS_COMPILE)ld
CC = $(CROSS_COMPILE)gcc
CPP = $(CC) -E
AR = $(CROSS_COMPILE)ar
NM = $(CROSS_COMPILE)nm
LDR = $(CROSS_COMPILE)ldr
STRIP = $(CROSS_COMPILE)strip
OBJCOPY = $(CROSS_COMPILE)objcopy
OBJDUMP = $(CROSS_COMPILE)objdump
RANLIB = $(CROSS_COMPILE)RANLIB

ifneq (,$(findstring s,$(MAKEFLAGS))) ####MAKEFLAGS我还不知道在什么地方定义没有???###
ARFLAGS = cr
else
ARFLAGS = crv
endif
RELFLAGS= $(PLATFORM_RELFLAGS)
DBGFLAGS= -g  # -DDEBUG
OPTFLAGS= -Os  #-fomit-frame-pointer
ifndef LDSCRIPT
#LDSCRIPT := $(TOPDIR)/board/$(BOARDDIR)/u-boot.lds.debug
ifeq ($(CONFIG_NAND_U_BOOT),y)
LDSCRIPT := $(TOPDIR)/board/$(BOARDDIR)/u-boot-nand.lds
else
LDSCRIPT := $(TOPDIR)/board/$(BOARDDIR)/u-boot.lds  #指定连接脚本
endif
endif
OBJCFLAGS += --gap-fill=0xff     #####这些都是arm-linux-gcc的编译和链接选项

gccincdir := $(shell $(CC) -print-file-name=include)

CPPFLAGS := $(DBGFLAGS) $(OPTFLAGS) $(RELFLAGS) \
-D__KERNEL__
ifneq ($(TEXT_BASE), )
CPPFLAGS += -DTEXT_BASE=$(TEXT_BASE)
endif

ifneq ($(OBJTREE),$(SRCTREE))
CPPFLAGS += -I$(OBJTREE)/include2 -I$(OBJTREE)/include
endif

CPPFLAGS += -I$(TOPDIR)/include
CPPFLAGS += -fno-builtin -ffreestanding -nostdinc \
-isystem $(gccincdir) -pipe $(PLATFORM_CPPFLAGS)

ifdef BUILD_TAG
CFLAGS := $(CPPFLAGS) -Wall -Wstrict-prototypes \
-DBUILD_TAG='"$(BUILD_TAG)"'
else
CFLAGS := $(CPPFLAGS) -Wall -Wstrict-prototypes
endif

# avoid trigraph warnings while parsing pci.h (produced by NIOS gcc-2.9)
# this option have to be placed behind -Wall -- that's why it is here
ifeq ($(ARCH),nios)
ifeq ($(findstring 2.9,$(shell $(CC) --version)),2.9)
CFLAGS := $(CPPFLAGS) -Wall -Wno-trigraphs
endif
endif

# $(CPPFLAGS) sets -g, which causes gcc to pass a suitable -g
# option to the assembler.
AFLAGS_DEBUG :=

# turn jbsr into jsr for m68k
ifeq ($(ARCH),m68k)
ifeq ($(findstring 3.4,$(shell $(CC) --version)),3.4)
AFLAGS_DEBUG := -Wa,-gstabs,-S
endif
endif

AFLAGS := $(AFLAGS_DEBUG) -D__ASSEMBLY__ $(CPPFLAGS)

LDFLAGS += -Bstatic -T $(LDSCRIPT) $(PLATFORM_LDFLAGS)
ifneq ($(TEXT_BASE),)
LDFLAGS += -Ttext $(TEXT_BASE)
endif

# Location of a usable BFD library, where we define "usable" as
# "built for ${HOST}, supports ${TARGET}". Sensible values are
# - When cross-compiling: the root of the cross-environment
# - Linux/ppc (native): /usr
# - NetBSD/ppc (native): you lose ... (must extract these from the
# binutils build directory, plus the native and U-Boot include
# files don't like each other)
#
# So far, this is used only by tools/gdb/Makefile.

ifeq ($(HOSTOS)-$(HOSTARCH),darwin-ppc)
BFD_ROOT_DIR = /usr/local/tools
else
ifeq ($(HOSTARCH),$(ARCH))
# native
BFD_ROOT_DIR = /usr
else
#BFD_ROOT_DIR = /LinuxPPC/CDK # Linux/i386
#BFD_ROOT_DIR = /usr/pkg/cross # NetBSD/i386
BFD_ROOT_DIR = /opt/powerpc
endif
endif

ifeq ($(PCI_CLOCK),PCI_66M)
CFLAGS := $(CFLAGS) -DPCI_66M
endif

#########################################################################
#MAKE这个变量不知道在什么地方定义的?是不是预定义的变量
#见GNU+Make手册
export CONFIG_SHELL HPATH HOSTCC HOSTCFLAGS CROSS_COMPILE \
AS LD CC CPP AR NM STRIP OBJCOPY OBJDUMP \
MAKE
export TEXT_BASE PLATFORM_CPPFLAGS PLATFORM_RELFLAGS CPPFLAGS CFLAGS AFLAGS

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

ifndef REMOTE_BUILD  #没有定义REMOTE_BUILD。$@=所有的目标文件
                         #$<所有的比目标文件新的依赖文件
#下面是定义Makefile的隐式规则
%.s: %.S   #所有的.S文件都编译成.s目标文件
$(CPP) $(AFLAGS) -o $@ $<   # CPP = $(CC) -E
%.o: %.S  #所有的.S文件都编译成.o文件
$(CC) $(AFLAGS) -c -o $@ $<  # CC = $(CROSS_COMPILE)gcc
%.o: %.c  #所有的.c文件都编译成.o目标文件
$(CC) $(CFLAGS) -c -o $@ $<

else

$(obj)%.s: %.S
$(CPP) $(AFLAGS) -o $@ $<
$(obj)%.o: %.S
$(CC) $(AFLAGS) -c -o $@ $<
$(obj)%.o: %.c
$(CC) $(CFLAGS) -c -o $@ $<
endif
####################################config.mk算是分析完了#####################

下面进行顶层的Makefile的分析。
#####################################顶层Makefile分析########################

#
# (C) Copyright 2000-2008
# Wolfgang Denk, DENX Software Engineering, wd@denx.de.
VERSION = 1
PATCHLEVEL = 3
SUBLEVEL = 2
EXTRAVERSION =
U_BOOT_VERSION = $(VERSION).$(PATCHLEVEL).$(SUBLEVEL)$(EXTRAVERSION)
                       1       .       3       .     2         
VERSION_FILE = $(obj)include/version_autogenerated.h #这个obj变量现在并没有包含进来,可用?
####把主机的体系(i386)给HOSTARCH
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/ppc64/ppc/ \
-e s/macppc/ppc/)
###把主机的操作系统给HOSTOS
HOSTOS := $(shell uname -s | tr '[:upper:]' '[:lower:]' | \
sed -e 's/\(cygwin\).*/cygwin/')

export HOSTARCH  HOSTOS

# Deal with colliding definitions from tcsh etc.
VENDOR=

#########################################################################
# Allow for silent builds
ifeq (,$(findstring s,$(MAKEFLAGS))) #还是不知道MAKEFLAGS有没有定义?
XECHO = echo
else
XECHO = :
endif

#########################################################################
#
# U-boot build supports producing a object files to the separate external
# directory. Two use cases are supported: uboot 支持编译产生的文件放在独立的目录中
#
# 1) Add O= to the make command line
# 'make O=/tmp/build all'  用O选项指定编译产生文件的目录
#
# 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.
#

ifdef O  ######O这个大些字母O不知道定义了没有?似乎没有看到过
##判断O是否是在命令行中定义的(大写字母O)?
ifeq ("$(origin O)", "command line")
BUILD_DIR := $(O)
endif
endif
##判断BUILD—DIR是不是非空,实际是为空的。
ifneq ($(BUILD_DIR),)
saved-output := $(BUILD_DIR)

# Attempt to create a output directory.
$(shell [ -d ${BUILD_DIR} ] || mkdir -p ${BUILD_DIR})

# 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),)
#######OBJTREE=$(CURDIR),一下4个是相同的。都为此Makefile所在的当前目录。
OBJTREE := $(if $(BUILD_DIR),$(BUILD_DIR),$(CURDIR))
SRCTREE := $(CURDIR)
TOPDIR := $(SRCTREE)
LNDIR := $(OBJTREE)
export TOPDIR SRCTREE OBJTREE

MKCONFIG := $(SRCTREE)/mkconfig
export MKCONFIG
#不执行,因为相等。
ifneq ($(OBJTREE),$(SRCTREE))
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.
#不执行,因为相等。
ifneq ($(OBJTREE),$(SRCTREE))
obj := $(OBJTREE)/
src := $(SRCTREE)/
else
obj :=
src :=
endif
export obj src

# Make sure CDPATH settings don't interfere
unexport CDPATH

#########################################################################
########执行make smdk2410_config后才有/include/config.mk文件,否则报错!!!!
####从下行开始到443行是一块.#################################################
ifeq ($(obj)include/config.mk,$(wildcard $(obj)include/config.mk)) #wildcard对字符扩展

# load ARCH, BOARD, and CPU configuration
include $(obj)include/config.mk
export ARCH CPU BOARD VENDOR SOC
#####定义CROSS_COMPILE了吗?何处?ans=没有定义
ifndef CROSS_COMPILE
#####没有定义CROSS_COMPILE,那HOSTARCH与ARCH相等不?相等
###CROSS_COMPILE=空,不等......
ifeq ($(HOSTARCH),$(ARCH))
CROSS_COMPILE =
else
ifeq ($(ARCH),ppc)
CROSS_COMPILE = ppc_8xx-
endif
ifeq ($(ARCH),arm)
CROSS_COMPILE = arm-linux-
endif
ifeq ($(ARCH),i386)
CROSS_COMPILE = i386-linux-
endif
ifeq ($(ARCH),mips)
CROSS_COMPILE = mips_4KC-
endif
ifeq ($(ARCH),nios)
CROSS_COMPILE = nios-elf-
endif
ifeq ($(ARCH),nios2)
CROSS_COMPILE = nios2-elf-
endif
ifeq ($(ARCH),m68k)
CROSS_COMPILE = m68k-elf-
endif
ifeq ($(ARCH),microblaze)
CROSS_COMPILE = mb-
endif
ifeq ($(ARCH),blackfin)
CROSS_COMPILE = bfin-uclinux-
endif
ifeq ($(ARCH),avr32)
CROSS_COMPILE = avr32-linux-
endif
ifeq ($(ARCH),sh)
CROSS_COMPILE = sh4-linux-
endif # sh
endif # HOSTARCH,ARCH
endif # CROSS_COMPILE
########确定交叉编译器为arm-linux-############
export CROSS_COMPILE

# load other configuration
##########把根目录下的config.mk包含进来。
include $(TOPDIR)/config.mk

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

OBJS = cpu/$(CPU)/start.o   #向目标文件变量中添加目标文件start.o
ifeq ($(CPU),i386)
OBJS += cpu/$(CPU)/start16.o
OBJS += cpu/$(CPU)/reset.o
endif
ifeq ($(CPU),ppc4xx)
OBJS += cpu/$(CPU)/resetvec.o
endif
ifeq ($(CPU),mpc85xx)
OBJS += cpu/$(CPU)/resetvec.o
endif
#######给$(OBJS)增加前缀$(obj)为空#############
OBJS := $(addprefix $(obj),$(OBJS))

#########添加库,但这时各个库.a文件还没有生成????!!!!#####################
LIBS = lib_generic/libgeneric.a
LIBS += $(shell if [ -f board/$(VENDOR)/common/Makefile ]; then echo \
"board/$(VENDOR)/common/lib$(VENDOR).a"; fi)  ## -f 对象存在切文件,Makefile文件存在。
LIBS += board/$(BOARDDIR)/lib$(BOARD).a
LIBS += cpu/$(CPU)/lib$(CPU).a
ifdef SOC
LIBS += cpu/$(CPU)/$(SOC)/lib$(SOC).a
endif
# lib_generic/libgeneric.a  board/common/lib.a  board/smdk2410/libsmdk2410.a  cpu/arm920t/libarm920t.a
#cpu/arm920t/s3c2410/libs3c2410.a  ………….现在 LIBS所包含的库…………
ifeq ($(CPU),ixp)
LIBS += cpu/ixp/npe/libnpe.a
endif
LIBS += lib_$(ARCH)/lib$(ARCH).a  #lib_arm/libarm.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                 #fs目录
LIBS += net/libnet.a                                    #net目录
LIBS += disk/libdisk.a                                  #disk目录
LIBS += drivers/bios_emulator/libatibiosemu.a             # drivers/bios_emulator目录
LIBS += drivers/block/libblock.a                         #drivers/block目录
LIBS += drivers/dma/libdma.a                           #drivers/dma目录
LIBS += drivers/hwmon/libhwmon.a                      #drivers/hwmon目录
LIBS += drivers/i2c/libi2c.a                              #drivers/i2c目录
LIBS += drivers/input/libinput.a                          # drivers/input目录
LIBS += drivers/misc/libmisc.a                           #drivers/misc目录
LIBS += drivers/mtd/libmtd.a                            # drivers/mtd目录
LIBS += drivers/mtd/nand/libnand.a                      # drivers/mtd/nand目录
LIBS += drivers/mtd/nand_legacy/libnand_legacy.a         # drivers/mtd/nand_legacy 目录
LIBS += drivers/mtd/onenand/libonenand.a                #drivers/mtd/onenand目录
LIBS += drivers/net/libnet.a                             # drivers/net目录
LIBS += drivers/net/sk98lin/libsk98lin.a                   #drivers/net/sk98lin目录
LIBS += drivers/pci/libpci.a                             # drivers/pci目录
LIBS += drivers/pcmcia/libpcmcia.a                      # drivers/pcmcia目录
LIBS += drivers/spi/libspi.a                             # drivers/spi目录
ifeq ($(CPU),mpc83xx)  
LIBS += drivers/qe/qe.a
endif
ifeq ($(CPU),mpc85xx)
LIBS += drivers/qe/qe.a
endif
LIBS += drivers/rtc/librtc.a                                   # drivers/rtc目录
LIBS += drivers/serial/libserial.a                              # drivers/serial目录
LIBS += drivers/usb/libusb.a                                 # drivers/usb目录
LIBS += drivers/video/libvideo.a                              # drivers/video目录
LIBS += post/libpost.a post/drivers/libpostdrivers.a              # post目录 post/drivers目录
LIBS += $(shell if [ -d post/lib_$(ARCH) ]; then echo \            #没有lib_arm,不包含任何库
"post/lib_$(ARCH)/libpost$(ARCH).a"; fi)
LIBS += $(shell if [ -d post/lib_$(ARCH)/fpu ]; then echo \        #没有lib_arm目录,不包含任何库
"post/lib_$(ARCH)/fpu/libpost$(ARCH)fpu.a"; fi)
LIBS += $(shell if [ -d post/cpu/$(CPU) ]; then echo \           #没有post/cpu/arm920t,不包含任何库
"post/cpu/$(CPU)/libpost$(CPU).a"; fi)
LIBS += $(shell if [ -d post/board/$(BOARDDIR) ]; then echo \
"post/board/$(BOARDDIR)/libpost$(BOARD).a"; fi)       #没有post/board/smdk2410,不包含任何库

LIBS += common/libcommon.a                       # common目录
LIBS += libfdt/libfdt.a                              # libfdt目录
LIBS += api/libapi.a                                # api 目录
LIBS := $(addprefix $(obj),$(LIBS))                  #给所有的库文件加上前缀obj(为空)
.PHONY : $(LIBS) $(VERSION_FILE)               #把所有的库文件和
#include/version_autogenerated.h定义为伪目标,

# Add GCC lib ?
PLATFORM_LIBS += -L $(shell dirname `$(CC) $(CFLAGS) -print-libgcc-file-name`) -lgcc
#dirname是取目录
# The "tools" are needed early, so put this first
# Don't include stuff already done in $(LIBS)
SUBDIRS = tools \
examples \
api_examples

.PHONY : $(SUBDIRS)    #创建伪目标

ifeq ($(CONFIG_NAND_U_BOOT),y)
NAND_SPL = nand_spl
U_BOOT_NAND = $(obj)u-boot-nand.bin
endif

ifeq ($(CONFIG_ONENAND_U_BOOT),y)
ONENAND_IPL = onenand_ipl
U_BOOT_ONENAND = $(obj)u-boot-onenand.bin
endif

__OBJS := $(subst $(obj),,$(OBJS))  #把$(OBJS)中的$(obj)换成空
__LIBS := $(subst $(obj),,$(LIBS))

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

ALL += $(obj)u-boot.srec $(obj)u-boot.bin $(obj)System.map $(U_BOOT_NAND)\
$(U_BOOT_ONENAND) # ALL =u-boot.srec u-boot.bin System.map  
ifeq ($(ARCH),blackfin)
ALL += $(obj)u-boot.ldr
endif

all: $(ALL)                                      #all 依赖于u-boot.srec u-boot.bin System.map

$(obj)u-boot.hex: $(obj)u-boot                      #u-boot.hex 依赖于u-boot
$(OBJCOPY) ${OBJCFLAGS} -O ihex $< $@

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

$(obj)u-boot.bin: $(obj)u-boot                       #u-boot.bin依赖于u-boot
$(OBJCOPY) ${OBJCFLAGS} -O binary $< $@

$(obj)u-boot.ldr: $(obj)u-boot                      #u-boot.lds依赖于u-boot
$(LDR) -T $(CONFIG_BFIN_CPU) -f -c $@ $< $(LDR_FLAGS)

$(obj)u-boot.ldr.hex: $(obj)u-boot.ldr                #u-boot.ldr.hex依赖于u-boot.ldr
$(OBJCOPY) ${OBJCFLAGS} -O ihex $< $@ -I binary

$(obj)u-boot.ldr.srec: $(obj)u-boot.ldr                #u-boot.ldr.srec依赖于u-boot.ldr
$(OBJCOPY) ${OBJCFLAGS} -O srec $< $@ -I binary

$(obj)u-boot.img: $(obj)u-boot.bin                   #u-boot.img依赖于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.sha1: $(obj)u-boot.bin                  #u-boot.shal依赖于u-boot.bin
$(obj)tools/ubsha1 $(obj)u-boot.bin                  #tools/ubshal依赖于u-boot.bin

$(obj)u-boot.dis: $(obj)u-boot                       # u-boot.dis依赖于u-boot
$(OBJDUMP) -d $< > $@
####应该好好分析一下下一段
$(obj)u-boot: depend $(SUBDIRS) $(OBJS) $(LIBS) $(LDSCRIPT)
UNDEF_SYM=`$(OBJDUMP) -x $(LIBS) |sed -n –e \
's/.*\($(SYM_PREFIX)__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): depend $(obj)include/autoconf.mk
$(MAKE) -C cpu/$(CPU) $(if $(REMOTE_BUILD),$@,$(notdir $@))

$(LIBS): depend $(obj)include/autoconf.mk
$(MAKE) -C $(dir $(subst $(obj),,$@))

$(SUBDIRS): depend $(obj)include/autoconf.mk
$(MAKE) -C $@ all

$(LDSCRIPT): depend $(obj)include/autoconf.mk
$(MAKE) -C $(dir $@) $(notdir $@)

$(NAND_SPL): $(VERSION_FILE) $(obj)include/autoconf.mk
$(MAKE) -C nand_spl/board/$(BOARDDIR) all

$(U_BOOT_NAND): $(NAND_SPL) $(obj)u-boot.bin $(obj)include/autoconf.mk
cat $(obj)nand_spl/u-boot-spl-16k.bin $(obj)u-boot.bin > $(obj)u-boot-nand.bin

$(ONENAND_IPL): $(VERSION_FILE) $(obj)include/autoconf.mk
$(MAKE) -C onenand_ipl/board/$(BOARDDIR) all

$(U_BOOT_ONENAND): $(ONENAND_IPL) $(obj)u-boot.bin $(obj)include/autoconf.mk
cat $(obj)onenand_ipl/onenand-ipl-2k.bin $(obj)u-boot.bin > $(obj)u-boot-onenand.bin

$(VERSION_FILE):
@( echo -n "#define U_BOOT_VERSION \"U-Boot " ; \
echo -n "$(U_BOOT_VERSION)" ; \
echo -n $(shell $(CONFIG_SHELL) $(TOPDIR)/tools/setlocalversion \
$(TOPDIR)) ; \
echo "\"" ) > $@.tmp
@cmp -s $@ $@.tmp && rm -f $@.tmp || mv -f $@.tmp $@

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

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

env:
$(MAKE) -C tools/env all MTD_VERSION=${MTD_VERSION} || exit 1

depend dep: $(VERSION_FILE)
for dir in $(SUBDIRS) ; do $(MAKE) -C $$dir _depend ; done

TAG_SUBDIRS += include
TAG_SUBDIRS += lib_generic board/$(BOARDDIR)
TAG_SUBDIRS += cpu/$(CPU)
TAG_SUBDIRS += lib_$(ARCH)
TAG_SUBDIRS += fs/cramfs
TAG_SUBDIRS += fs/fat
TAG_SUBDIRS += fs/fdos
TAG_SUBDIRS += fs/jffs2
TAG_SUBDIRS += net
TAG_SUBDIRS += disk
TAG_SUBDIRS += common
TAG_SUBDIRS += drivers/bios_emulator
TAG_SUBDIRS += drivers/block
TAG_SUBDIRS += drivers/hwmon
TAG_SUBDIRS += drivers/i2c
TAG_SUBDIRS += drivers/input
TAG_SUBDIRS += drivers/misc
TAG_SUBDIRS += drivers/mtd
TAG_SUBDIRS += drivers/mtd/nand
TAG_SUBDIRS += drivers/mtd/nand_legacy
TAG_SUBDIRS += drivers/mtd/onenand
TAG_SUBDIRS += drivers/net
TAG_SUBDIRS += drivers/net/sk98lin
TAG_SUBDIRS += drivers/pci
TAG_SUBDIRS += drivers/pcmcia
TAG_SUBDIRS += drivers/qe
TAG_SUBDIRS += drivers/rtc
TAG_SUBDIRS += drivers/serial
TAG_SUBDIRS += drivers/spi
TAG_SUBDIRS += drivers/usb
TAG_SUBDIRS += drivers/video

tags ctags:
ctags -w -o $(obj)ctags `find $(SUBDIRS) $(TAG_SUBDIRS) \
-name '*.[ch]' -print`

etags:
etags -a -o $(obj)etags `find $(SUBDIRS) $(TAG_SUBDIRS) \
-name '*.[ch]' -print`
cscope:
find $(SUBDIRS) $(TAG_SUBDIRS) -name '*.[ch]' -print \
> cscope.files
cscope -b -q -k

$(obj)System.map: $(obj)u-boot
@$(NM) $< | \
grep -v '\(compiled\)\|\(\.o$$\)\|\( [aUw] \)\|\(\.\.ng$$\)\|\(LASH[RL]DI\)' | \
sort > $(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: $(obj)include/config.h $(VERSION_FILE)
@$(XECHO) Generating include/autoconf.mk ; \
set -e ; \
: Generate the dependancies ; \
$(CC) -M $(HOST_CFLAGS) $(CPPFLAGS) -MQ $@ include/common.h > $@.dep ; \
: Extract the config macros ; \
$(CPP) $(CFLAGS) -dM include/common.h | sed -n -f tools/scripts/define2mk.sed > $@

sinclude $(obj)include/autoconf.mk.dep

#########################################################################
else # !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 \
$(SUBDIRS) $(VERSION_FILE) gdbtools updater env depend \
dep tags ctags etags cscope $(obj)System.map:
@echo "System not configured - see README" >&2
@ exit 1
endif # config.mk
##########***********************###########################################
.PHONY : CHANGELOG
CHANGELOG:
git log --no-merges U-Boot-1_1_5.. | \
unexpand -a | sed -e 's/\s\s*$$//' > $@

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

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
#======================================================================== 
阅读(1102) | 评论(0) | 转发(0) |
0

上一篇:没有了

下一篇:进程和程序关系

给主人留下些什么吧!~~