• u-boot的makefile中的一些目录的设定,以及涉及的shell,make语法。


    分析U-boot的makefile时,需要确定一些文件的位置,BUILD_DIR,SRCTREE,TOPDIR,LNDIR,obj,src。

    首先分析BUILD_DIR是怎么确定的——

    指定输出目录有两种方法,分别为make O=dir或者export BUILD_DIR=dir。两种方式指定如果没有指定,则设定为源码的根目录。

    By default the build is performed locally and the objects are saved
    in the source directory. One of the two methods can be used to change
    this behavior and build U-Boot to some external directory:
    
    1. Add O= to the make command line invocations:
    
        make O=/tmp/build distclean
        make O=/tmp/build NAME_config
        make O=/tmp/build all
    
    2. Set environment variable BUILD_DIR to point to the desired location:
    
        export BUILD_DIR=/tmp/build
        make distclean
        make NAME_config
        make all

    makefile通过以下确定BUILD_DIR的

    ifdef O                                   
    ifeq ("$(origin O)", "command line")         #命令行里有“O”
    BUILD_DIR := $(O)                            #BUILD_DIR指定为命令中的目录
    endif
    endif
    
    ifneq ($(BUILD_DIR),)                       #如果BUILD_DIR有定义 不等于空
    saved-output := $(BUILD_DIR)                #saved-output保存$(BUILD_DIR)
    
    # Attempt to create a output directory.
    $(shell [ -d ${BUILD_DIR} ] || mkdir -p ${BUILD_DIR})
    #此条命令——检测BUILD_DIR是否是一个目录,如果不存在则创建这个BUILD_DIR对应的目录
    #[]和test测试命令一样,Shell中的 test 命令用于检查某个条件是否成立,它可以进行数值、字符和文件三个方面的测试;
    #-d的作用——如果文件存在且为目录则为真;
    #||运算符——如果||左边的命令(命令1)未执行成功,那么就执行||右边的命令(命令2);或者换句话说,“如果这个命令执行失败了||那么就执行这个命令。 #mkdir的-p参数——需要时创建上层目录,如目录早已存在则不当作错误,例如,我们要在当前目录创建目录Projects/a/src,
    #使用命令mkdir -p Project/a/src,例如想要建立目录Project,其中含有4个文件夹a, b, c, d,且这4个文件都含有一个src文件夹。
    #
    使用命令mkdir -p Project/{a,b,c,d}/src

    # Verify
    if it was successful. BUILD_DIR := $(shell cd $(BUILD_DIR) && /bin/pwd)
    #如果能cd $(BUILD_DIR),则输出这个目录的路径
    #&&运算符——左边的命令(命令1)返回真(即返回0,成功被执行)后,&&右边的命令(命令2)才能够被执行;
    #换句话说,“如果这个命令执行成功&&那么执行这个命令”。 $(
    if $(BUILD_DIR),,$(error output directory "$(saved-output)" does not exist))
    #检测BUILD_DIR是否为空,如果为空则提示错误并终止make
    #if函数——$(if CONDITION,THEN-PART[,ELSE-PART]).如果“CONDITION”的展开结果非空,则将第二个
    #参数“THEN-PART”作为函数计算表达式;“CONDITION”的展开结果为空,则执行第三个参数。
    #error——$(error TEXT...)产生致命错误,并提示“TEXT...”信息给用户,并退出make执行,没有返回值。 endif # ifneq ($(BUILD_DIR),)

    OBJTREE        := $(if $(BUILD_DIR),$(BUILD_DIR),$(CURDIR))
    #如果定义了BUILD_DIR则OBJTREE=$(BUILD_DIR),否则=$(CURDIR)
    SRCTREE        := $(CURDIR) #源目录为$(CURDIR)
    TOPDIR        := $(SRCTREE) #顶层目录为$(CURDIR)
    LNDIR        := $(OBJTREE) #链接目录为$(CURDIR)
    export    TOPDIR SRCTREE OBJTREE

    MKCONFIG    := $(SRCTREE)/mkconfig
    export MKCONFIG

    ifneq ($(OBJTREE),$(SRCTREE))
    REMOTE_BUILD     := 1
    export REMOTE_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 case for
    # some targets like unconfig, clean, clobber, distclean, etc.
    ifneq ($(OBJTREE),$(SRCTREE)) #如果$(OBJTREE)不等于$(SRCTREE)
    obj := $(OBJTREE)/
    src := $(SRCTREE)/
    else
    obj :=
    src :=
    endif
    export obj src
    懒惰不会让你一下子跌到 但会在不知不觉中减少你的收获; 勤奋也不会让你一夜成功 但会在不知不觉中积累你的成果 越努力,越幸运。
  • 相关阅读:
    自动化测试-appium常用元素
    自动化测试-微信小程序
    自动化测试-环境搭建appium for windows
    安全测试-docker搭建sonar完成代码质量检测
    工具安装-pycharm使用已配置的虚拟环境
    安全测试-sonarscanner扫描代码
    工具安装-java集成到maven
    iOS 提升代码的安全性,可以做哪些措施???
    iOS 绘制一个表盘时钟,秒针效果可以“扫秒/游走”
    iOS 关于BTC 一些知识点
  • 原文地址:https://www.cnblogs.com/Rainingday/p/7661937.html
Copyright © 2020-2023  润新知