Boot 顶层Makefile解析(2)

#########################################################################
#
# 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

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:http://www.heiqu.com/ad00de73f80fc7c227f48d502e9657da.html