• uboot学习之二----主Makefile学习之四----两种编译方法:原地编译和单独输出文件夹编译


    第57-123行:

    57 # 
     58 # U-boot build supports producing a object files to the separate external 
     59 # directory. Two use cases are supported: 
     60 # 
     61 # 1) Add O= to the make command line 
     62 # 'make O=/tmp/build all' 
     63 # 
     64 # 2) Set environement variable BUILD_DIR to point to the desired location 
     65 # 'export BUILD_DIR=/tmp/build' 
     66 # 'make' 
     67 # 
     68 # The second approach can also be used with a MAKEALL script 
     69 # 'export BUILD_DIR=/tmp/build' 
     70 # './MAKEALL' 
     71 # 
     72 # Command line 'O=' setting overrides BUILD_DIR environent variable. 
     73 # 
     74 # When none of the above methods is used the local build is performed and 
     75 # the object files are placed in the source directory. 
     76 # 
     77  
     78 ifdef O 
     79 ifeq ("$(origin O)", "command line") 
     80 BUILD_DIR := $(O) 
     81 endif 
     82 endif
    
    83  
     84 ifneq ($(BUILD_DIR),) 
     85 saved-output := $(BUILD_DIR) 
     86  
     87 # Attempt to create a output directory. 
     88 $(shell [ -d ${BUILD_DIR} ] || mkdir -p ${BUILD_DIR}) 
     89  
     90 # Verify if it was successful. 
     91 BUILD_DIR := $(shell cd $(BUILD_DIR) && /bin/pwd) 
     92 $(if $(BUILD_DIR),,$(error output directory "$(saved-output)" does not exist)) 
     93 endif # ifneq ($(BUILD_DIR),) 
     94  
     95 OBJTREE         := $(if $(BUILD_DIR),$(BUILD_DIR),$(CURDIR)) 
     96 SRCTREE         := $(CURDIR) 
     97 TOPDIR          := $(SRCTREE) 
     98 LNDIR           := $(OBJTREE) 
     99 export  TOPDIR SRCTREE OBJTREE 
    100  
    101 MKCONFIG        := $(SRCTREE)/mkconfig 
    102 export MKCONFIG 
    103  
    104 ifneq ($(OBJTREE),$(SRCTREE)) 
    105 REMOTE_BUILD    := 1 
    106 export REMOTE_BUILD 
    107 endif 
    108 
    109 # $(obj) and (src) are defined in config.mk but here in main Makefile 
    110 # we also need them before config.mk is included which is the case for 
    111 # some targets like unconfig, clean, clobber, distclean, etc. 
    112 fneq ($(OBJTREE),$(SRCTREE)) 
    113 obj := $(OBJTREE)/ 
    114 src := $(SRCTREE)/ 
    115 else 
    116 obj := 
    117 src := 
    118 endif 
    119 export obj src 
    120  
    121 # Make sure CDPATH settings don't interfere 
    122 unexport CDPATH 
    123 
    

    编译复杂项目:makefile提供两种编译管理方法,默认情况是原地编译。

    原地编译的缺点:

    第一:污染源文件目录。第二:一套源代码只能按照一种配置和编译方法进行处理,无法同时维护超过两个或两个以上的配置编译方法。

    输出文件夹编译:

    为了解决以上缺陷,采用单独输出文件夹的方式编译,Linux kernel支持这样的方法,具体实现思路是:将所有编译生成的.o文件或者

    其他文件全部输出到指定好的目录。uboot也学习了这样的方法。

    具体做法:

    见57行---76行的注释:

      ①在命令行编译时制定make O=输出目录(注意配置时也要加O=输出目录)

     make O=/tmp/build all

    比如我们在root@ubuntu:/usr/local/arm/qt_x210v3/uboot这里面创建一个output文件夹来作为输出目录:
    三步: make O=output/ distclean
        make O=output/ x210_sd_config
       这一步出错:




    解决方法:进入output文件夹后手工创建这个文件:

    root@ubuntu:/usr/local/arm/qt_x210v3/uboot/output# mkdir board/samsung/x210 -p

    然后重新配置。

         make O=output/ all 

    最后发现还是有问题。应该是整个uboot移植时还是不行的。我们以后使用三星版本的uboot进行移植再来研究。

      ②设置环境变量BUILD_DIR指出期望的输出目录。

      'export BUILD_DIR=/tmp/build' 
       'make' 

          第二种方法也可以通过MAKEALL脚本实现。

           'export BUILD_DIR=/tmp/build' 
           './MAKEALL' 
    make o=输出目录会覆盖BUILD_DIR


    很多bsp开发都使用这样的方式,所以有利于后面学习。

    两种编译方法的makefile代码实现在78---123行

  • 相关阅读:
    ArrayList类(转)
    通过XmlDocument读写Xml文档(转)
    js的一些常用方法
    和我一起恶补pl/sql(第三讲)
    js的跑步算法
    细说 Form (表单)(转)
    C#反射设置和读取类的属性
    显示最近30天的记录vs显示这个月的记录(pl\sql)
    nyist 637 我和你
    nyist 子串和
  • 原文地址:https://www.cnblogs.com/yr-linux/p/5361822.html
Copyright © 2020-2023  润新知