#########################################################################
#
# U-boot build supports producing a object files to the separate external
# directory. Two use cases are supported:
# 可以将 U-Boot的创建指向其他外部路径(可以理解为自定义的directory) 来存放最终生成的目标文件。支持以下两种方法:
#
# 1) Add O= to the make command line
# 'make O=/tmp/build all'
# 第一种用法:通过在终端执行命令make O=/dir (/dir即为我们指定的生成的目标文件的存放目录)
# 然后执行 "make O=/dir"
# 2) Set environement variable BUILD_DIR to point to the desired location
# 'export BUILD_DIR=/tmp/build'
# 'make'
# 第二种用法:通过设置环境变量来指定目标文件存放目录
# 'export BUILD_DIR=/tmp/build'
# then excute : 'make'
# The second approach can also be used with a MAKEALL script
# 第二中方式还可以写成一个MAKEALL脚本 然后执行 ./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.
# 当以上两种方式都未被采用时,默认创建路径是当前u-boot所在的目录的也就是存放在u-boot自己的顶层目录下
# 理解了上面一段英文,这里就不难理解了 都是对应着的
ifdef O #如果定义了变量'O'
ifeq ("$(origin O)", "command line") #如果变量上面那个变量'O'在command line(命令行)里定义过
BUILD_DIR := $(O) #就把变量'O'的值赋给BUILD_DIR这个环境变量
endif #endif
endif #endif
ifneq ($(BUILD_DIR),) #如果BUILD_DIR被定义过
saved-output := $(BUILD_DIR) #就把它的值赋给saved-output
# Attempt to create a output directory. #尝试创建一个输出路径BUILD_DIR
$(shell [ -d ${BUILD_DIR} ] || mkdir -p ${BUILD_DIR}) #创建这个路径的shell命令
# Verify if it was successful. #检测是否创建成功
BUILD_DIR := $(shell cd $(BUILD_DIR) && /bin/pwd)
$(if $(BUILD_DIR),,$(error output directory "$(saved-output)" does not exist)) #如果BUILD_DIR非空则什么都不做
endif #如果为空则用error输出错误信息
# ifneq ($(BUILD_DIR),) #被注释了?看上去有点怪怪的
OBJTREE := $(if $(BUILD_DIR),$(BUILD_DIR),$(CURDIR)) #如果BUILD_DIR为非空则将BUILD_DIR路径赋给OBJTREE否则将当前路径CURDIR赋给OBJTREE
SRCTREE := $(CURDIR) #把当前源码所在目录 $(CURDIR) 赋给SRCTREE
TOPDIR := $(SRCTREE) #你懂的
LNDIR := $(OBJTREE) #就是最终设置好的生成目标文件的存放路径
export TOPDIR SRCTREE OBJTREE #导出这三个路径变量
MKCONFIG := $(SRCTREE)/mkconfig #让MKCONFIG指向U-BOOT源码存放的顶层目录下的mkconfig配置文件
export MKCONFIG #并且导出MKCONFIG
ifneq ($(OBJTREE),$(SRCTREE)) #当目标存放目录不是U-BOOT顶层目录(源码目录)时
REMOTE_BUILD := 1 #REMOTE_BUILD=1 只是flag?
export REMOTE_BUILD #导出REMOTE_BUILD
endif #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)) #当目标存放目录不是U-BOOT顶层目录(源码目录)时
obj := $(OBJTREE)/ #定义变量obj让其等于目标存放目录 多了一个/ 他们是目录
src := $(SRCTREE)/ #定义变量src让其等于uboot顶层目录
else #else
obj := #obj = 空
src := #src = 空
endif #endif
export obj src #export them