#########################################################################
#
# U-boot build supports producing a object files to the separate external
# directory. Two use cases are supported:
# U-boot构建支持在单独的外部目录中生成目标文件。支持两种用例:
#
# 1) Add O= to the make command line 将O=添加到生成命令行
# 'make O=/tmp/build all'
#
# 2) Set environement variable BUILD_DIR to point to the desired location
# 将环境变量BUILD_DIR设置为指向所需位置
# 'export BUILD_DIR=/tmp/build' 设置方法
# 'make'
#
# The second approach can also be used with a MAKEALL script
# 第二种方法也可以用于MAKEALL脚本
# 'export BUILD_DIR=/tmp/build'
# './MAKEALL'
#
# Command line 'O=' setting overrides BUILD_DIR environent variable.
# 命令行“O=”设置覆盖BUILD_DIR环境变量。
#
# When none of the above methods is used the local build is performed and
# the object files are placed in the source directory.
# 当不使用上述任何方法时,将执行本地构建,并将目标文件放在源目录中。
//这是第一种方法的实现过程,$(origin O)是输出变量O的定义来源,假设在命令行模式输//入#make O=/tmp/build all来编译,//那么O的定义来源是命令行,函数的输出是command line。
ifdef O//如果定义了Oifeq("$(origin O)","command line")//比如make O=/tmp/build all//:=用来赋值,就是直接就地解析,只用往前看即可BUILD_DIR:=$(O)//将O的值赋值给BUILD_DIR
endif
endif
//倘若BUILD_DIR定义过了,也就是不希望目标文件与源文件混在一起,//那么直到“endif # //ifneq ($(BUILD_DIR),)”//的内容都有效;倘若没有定义BUILD_DIR,那么这部分代码将不起作用。ifneq($(BUILD_DIR),)//如果BUILD_DIR不为空的话//:=用来赋值,就是直接就地解析,只用往前看即可
saved-output :=$(BUILD_DIR)//将BUILD_DIR保存在saved-output变量中
# Attempt to create a output directory.
# 尝试创建输出目录
//-d是判断BUILD_DIR是否存在,倘若不存在就就创建。mkdir的-p参数代表若路径中的某些目录不存在//也一并创建$(shell [-d ${
BUILD_DIR}]|| mkdir -p ${
BUILD_DIR})
# Verify if it was successful.验证是否成功。
//试图进入$(BUILD_DIR),倘若能进入,则将它的路径赋给BUILD_DIR,注意这时的BUILD_DIR已经是一个//真实存在目录的代言人,而之前的只是希望创建的目录。需要说明的是倘若BUILD_DIR还没有创建,//那么cd $(BUILD_DIR)将执行错误,返回值是空,虽然这时发生错误,//但是编译会忽略这个错误还能继续进行。BUILD_DIR:=$(shell cd $(BUILD_DIR)&&/bin/pwd)//如果没有创建成功,就执行error函数,输出信息output directory "$(saved-output)" does not exist),然后编译终止$(if$(BUILD_DIR),,$(error output directory "$(saved-output)" does not exist))
endif # ifneq($(BUILD_DIR),)//如果BUILD_DIR不为空,目标目录就等于BUILD_DIR;倘若没定义,就取为当前目录OBJTREE:=$(if$(BUILD_DIR),$(BUILD_DIR),$(CURDIR))SRCTREE:=$(CURDIR)//源文件目录等于当前文件夹TOPDIR:=$(SRCTREE)//顶层目录等于源文件目录LNDIR:=$(OBJTREE)//连接目录等于BUILD_DIRexportTOPDIRSRCTREEOBJTREE//将这三个变量导出MKCONFIG:=$(SRCTREE)/mkconfig //指定mkconfig的位置exportMKCONFIG//将MKCONFIG变量导出ifneq($(OBJTREE),$(SRCTREE))//如果目标目录和源文件目录不相等REMOTE_BUILD:=1//就定义REMOTE_BUILD变量并取值为1exportREMOTE_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 casefor
# some targets like unconfig, clean, clobber, distclean, etc.//$(obj)和(src)是在config.mk中定义的,但是在主Makefile中,我们在包含config.mk//之前也需要它们,这是一些目标的情况,比如unpack、clean、clobber、distclean等。//定义变量obj和src,并将这两个变量导出,obj是编译目标文件的前缀,从而实现生成的目标文件在于//源文件相区别的目录中ifneq($(OBJTREE),$(SRCTREE))
obj :=$(OBJTREE)/
src :=$(SRCTREE)/else
obj :=
src :=
endif
export obj src
# Make sure CDPATH settings don't interfere 确保CDPATH设置不会干扰
u