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