#
# (C) Copyright 2000-2008
# 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
#
##################################################################################
# U_BOOT_VERSION = 1.3.4
# 从2008年10月,发行版的名称的含义发生了变化,从数字版本号变为使用时间戳作为版本号,
# 使用发布年份和月份确定发布的版本号(VERSION和PATCHLEVEL),
# (SUBLEVEL和EXTRAVERSION)表示候选发布版或修复bug了的稳定版本
# 指定时间信息头文件和版本信息头文件
VERSION = 1
PATCHLEVEL = 3
SUBLEVEL = 4
EXTRAVERSION =
U_BOOT_VERSION = $(VERSION).$(PATCHLEVEL).$(SUBLEVEL)$(EXTRAVERSION)
VERSION_FILE = $(obj)include/version_autogenerated.h
##################################################################################################################
# HOSTARCH这个变量的赋值,是通过执行一套shell程序来完成的,其中$(shell xxx)的语法就是在shell中执行xxx的命令.
# 这里的'|'就是linux中的管道处理符,''就是换行的连接符,表示下一行与本行是同行程序处理. uname -m,得到机器硬件名。
# sed -e允许在同一行里执行多条命令,就是表示后面跟的是一串命令脚本,s/abc/def/的命令表达式,
# 就是表示要从标准输入中,查找到内容为abc的,然后替换成def。例如电脑使用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/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/)
##########################################################################################
# "uname –s"输出主机内核名字,因此"uname –s"结果是"Linux"。
# "tr '[:upper:]' '[:lower:]'"作用是将标准输入中的所有大写字母转换为响应的小写字母。
# 结果是将HOSTOS = "linux"
HOSTOS := $(shell uname -s | tr '[:upper:]' '[:lower:]' |
sed -e 's/(cygwin).*/cygwin/')
#########################################################################
# export等价于C中的extern,即变量全局可用,这样这些变量将设置成环境变量
# export的作用就是将自定义变量转成环境变量【环境变量就是在哪里都能用】
export HOSTARCH HOSTOS
# Deal with colliding definitions from tcsh etc.
# 定义生产厂家名称
VENDOR=
#########################################################################
# Allow for silent builds
################################################################################
# 检查是否禁止在编译过程中向终端输出信息,findstring函数检查MAKEFLAGS是否为参数s
# 如编译uboot时,输入make -s,则MAKEFLAGS = s,执行XECHO = echo,即输出编译信息
# 否则XECHO = :,不输出编译信息
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.
#
#########################################################################
# U-boot支持定义源码及生成的目标文件存放的目录的功能。有两种方法可以实现:
# 1)指定编译参数 O=目录,例如:make O= /tmp/build all
# 2)设置环境变量BUILD_DIR,该变量指定目录并设置为设置为环境变量
# 例如:export BUILD_DIR=/tmp/build 然后 make
# 第二种方法同样可以用在一个 MAKEALL脚本
# 例如:export BUILD_DIR=/tmp/build 然后执行之 ./MAKEALL
# 命令行参数的设置会覆盖到 BUILD_DIR这一环境变量
# 如果不指定任何目录,则编译生成的目标文件存放在源代码的顶层目录下
#
# 如果参数O不为空(即使用了O参数),则利用函数origin返回的参数O的来源
# 函数$( origin, variable) 输出的结果是一个字符串,输出结果由变量variable定义的方式决定,
# 若variable在命令行中定义过,则origin函数返回值为"command line"。
# 假若在命令行中执行了“export BUILD_DIR=/tmp/build”的命令,则“$(origin O)”值为“command line”,
# 而BUILD_DIR被设置为“/tmp/build”。
ifdef O
ifeq ("$(origin O)", "command line")
BUILD_DIR := $(O)
endif
endif
#########################################################################
# 如果BUILD_DIR不为空,则将BUILD_DIR路径保存到saved-output中
ifneq ($(BUILD_DIR),)
saved-output := $(BUILD_DIR)
# Attempt to create a output directory.
# 如果BUILD_DIR不存在,则创建BUILD_DIR目录
$(shell [ -d ${BUILD_DIR} ] || mkdir -p ${BUILD_DIR})
# Verify if it was successful.
###############################################################################
# 执行cd命令进入BUILD_DIR目录,然后执行pwd命令得到当前目录路径【防止创建失败】
# if(a, b, c) —— 判断a的真假,为真执行b,为假执行c(类似三目运算符)
# 这段意思是如果BUILD_DIR创建成功,则什么不做,失败则返回error这段错误代码
BUILD_DIR := $(shell cd $(BUILD_DIR) && /bin/pwd)
$(if $(BUILD_DIR),,$(error output directory "$(saved-output)" does not exist))
endif # ifneq ($(BUILD_DIR),)
#########################################################################
# 普通的变量赋值,OBJTREE和LNDIR存放生成文件的目录,SRCTREE和TOPDIR为源码
# 目录,CURDIR变量指示当前的工作目录【uboot顶层目录】
# export将这些变量设置成环境变量
OBJTREE := $(if $(BUILD_DIR),$(BUILD_DIR),$(CURDIR))
SRCTREE := $(CURDIR)
TOPDIR := $(SRCTREE)
LNDIR := $(OBJTREE)
export TOPDIR SRCTREE OBJTREE
#########################################################################
# MKCONFIG指向源码根目录下的mkconfig脚本文件,并设置为设置为环境变量
MKCONFIG := $(SRCTREE)/mkconfig
export MKCONFIG
#################################################################################
# 如果存放生成文件的目录和源码目录相同则REMOTE_BUILD = 1,并设置为设置为环境变量
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.
# $(obj)和$(src)在config.mk中有定义,但是在包含config.mk之前主Makefile在执行某些目标
# 如unconfig, clean, clobber, distclean, etc等的时候同样需要$(obj)和$(src)
#
# 如果OBJTREE和SRCTREE不同目录,则指定obj和src为OBJTREE和SRCTREE目录,
# obj:编译文件的输出目录,src:uboot代码顶层目录
# 作为编译输出文件的存放目录,一般OBJTREE和SRCTREE是相同的路径,否则obj和src为空
# 设置obj和src为环境变量
ifneq ($(OBJTREE),$(SRCTREE))
obj := $(OBJTREE)/
src := $(SRCTREE)/
else
obj :=
src :=
endif
export obj src
# Make sure CDPATH settings don't interfere
# 撤销CDPATH为环境变量,设置其为文件私有,为了防止冲突
unexport CDPATH
#########################################################################
# 如果ARCH等价于powerpc,则ARCH等于ppc
ifeq ($(ARCH),powerpc)
ARCH = ppc
endif
##################################################################################################
# 检查include目录下是否存在config.mk文件,【wildcard函数是取匹配模式的文件名】
# 如果include下存在config.mk文件,则$(wildcard $(obj)include/config.mk)就会
# 返回$(obj)include/config.mk,如果不存在config.mk文件,则返回值为空。
# include目录下是否存在config.mk文件。
# 为什么要检查config.mk存在与否呢?原因是:我们在编译U-boot前必须配置目标板的信息,也就是要执行
# make
『本文转载自网络,版权归原作者所有,如有侵权请联系删除』