u-Boot 高层Makefile解析(二)

u-Boot 顶层Makefile解析(二)
u-Boot -Makefile(二)  声明 : 以下解析大部分来自网络大神之手 所以可以放心阅读  Good luck 参考地址不可考 有事请留言
#########################################################################
#
# 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