zoukankan      html  css  js  c++  java
  • 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
    懒惰不会让你一下子跌到 但会在不知不觉中减少你的收获; 勤奋也不会让你一夜成功 但会在不知不觉中积累你的成果 越努力,越幸运。
  • 相关阅读:
    部署时,出现用户代码未处理 System.Security.Cryptography.CryptographicException 错误解决方法
    sqlserver学习笔记(三)—— 为数据库添加新的用户
    [.Net MVC] Win7下IIS部署
    CSS的4种引入方式及优先级
    阿里巴巴图标库全部下载
    div的默认position值是静态的static
    阿里巴巴图标库iconfont上传svg后,显示不了图片
    ext.net单元格内容换行显示
    WEB内容换行
    SQL修改日期类型字段为字符串类型
  • 原文地址:https://www.cnblogs.com/Rainingday/p/7661937.html
Copyright © 2011-2022 走看看