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‘ 比如我们在[email protected]:/usr/local/arm/qt_x210v3/uboot这里面创建一个output文件夹来作为输出目录:三步: make O=output/ distclean    make O=output/ x210_sd_config   这一步出错:

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

[email protected]:/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行

时间: 2024-10-11 07:07:51

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

uboot学习之二----主Makefile学习之一----版本号 u_boot_version(U_BOOT_VERSION = $(VERSION).$(PATCHLEVEL).$(SUBLEVEL).$(EXTRAVERSION)) (24-29行)

BSP支持包(https://yunpan.cn/cqB5i8LCAMzhM  访问密码 c425,解压后/uboot目录下的Makefile) VERSION = 1      //主版本号PATCHLEVEL = 3    //修补版本号SUBLEVEL = 4     //次版本号EXTRAVERSION =    //附加信息,一般默认为空,我们可以自己设置U_BOOT_VERSION = $(VERSION).$(PATCHLEVEL).$(SUBLEVEL).$(EXTRAVERSI

uboot学习之二----主Makefile学习之三----静默编译

第45-54行: 45 # Deal with colliding definitions from tcsh etc. 46 VENDOR= 47 48 ######################################################################### 49 # Allow for silent builds 50 ifeq (,$(findstring s,$(MAKEFLAGS))) //判断findstring函数是否为空 51 XECHO

uboot学习之二----主Makefile学习之二----环境变量之:主机的操作系统和主机架构(HOSTOS、HOSTARCH)(31-43行)

HOSTARCH := $(shell uname -m | \    sed -e s/i.86/i386/ \ -e s/sun4u/sparc64/ \ -e s/arm.*/arm/ \ -e s/sa110/arm/ \ -e s/powerpc/ppc/ \ -e s/ppc64/ppc/ \ -e s/macppc/ppc/) HOSTOS := $(shell uname -s | tr '[:upper:]' '[:lower:]' | \ sed -e 's/\(cygwin

TQ2440学习笔记——Linux上I2C驱动的两种实现方法(1)

作者:彭东林 邮箱:[email protected] 内核版本:Linux-3.14 u-boot版本:U-Boot 2015.04 硬件:TQ2440 (NorFlash:2M   NandFlash:256M  内存:64M) 摘要 这里并不深入分析Linux下I2C驱动的实现,只是以TQ2440硬件平台为例分析I2C驱动的两种方法. 第一种方法: 使用S3C2440自带的I2C控制器实现,这个kernel已经支持,我们只需要配置即可. 第二种方法: 使用GPIO模拟,这个在kernel中

MyBatis中主键回填的两种实现方式

主键回填其实是一个非常常见的需求,特别是在数据添加的过程中,我们经常需要添加完数据之后,需要获取刚刚添加的数据 id,无论是 Jdbc 还是各种各样的数据库框架都对此提供了相关的支持,本文我就来和和大家分享下数据库主键回填在 MyBatis 中的两种实现思路. 原生写法 框架来源于我们学过的基础知识,主键回填实际上是一个在 JDBC 中就被支持的写法,有的小伙伴可能不知道这一点,因此这里我先来说说在 JDBC 中如何实现主键回填. JDBC 中实现主键回填其实非常容易,主要是在构造 Prepar

从头開始写项目Makefile(七):统一目标输出文件夹

[版权声明:转载请保留出处:blog.csdn.net/gentleliu. Mail:shallnew at 163 dot com] 上一节我们把规则单独提取出来,方便了Makefile的维护,每一个模块仅仅须要给出关于自己的一些变量,然后再使用统一的规则Makefile.这一节我们继续改进我们的Makefile,到眼下为止我们的Makefile编译链接输出的目标都在源文件同文件夹下或模块Makefile同一文件夹下.当一个项目大了之后,这样会显得非常乱,寻找编译输出的文件也比較困难. 既然

二、C++迭代器的两种实现方式 (Range for和C#、Java中的foreach)

一.迭代器概述 这个标题其实有点"标题党"的含义,因为C++在标准库中的实现迭代器的方式只有一种,也就是为类定义begin()和end()函数,C++11增加了range for语句,可以用来遍历迭代器中的元素.实现迭代器的第二种方式,就是用C++模拟C#和Java中的迭代器模式,并且我们可以定义出自己的foreach语句.除此之外,迭代器可能还有很多种实现的方法,各个库也会多自己的迭代器的实现有所定义,在这里只要明白迭代器的本质意义即可. 迭代器,也称作游标,是一种设计模式,我们可以

GUI学习之二十三——QDialog学习总结

今天学习对话框输入控件的基类(QDialog). 一.描述 是对话类窗口(字体框.颜色选择.文件选择框等)的基类. 对话框窗口是顶级窗口(就是说不包含于哪个父类的显示界面里),主要用于短期任务和与用户的短期通信. QDialogs是可以有返回值的(字体.颜色等),有默认按钮(确认.取消和关闭). 二.对话框的种类 对话框可以是模态或非模态的对话框 模态对话框也分两种 应用程序级别(exec()),当该种对话框出现时,用户必须首先对该对话框进行操作,直至关闭后才能访问程序中的其他窗口(注意是访问而

JavaWeb学习总结(二)——Tomcat服务器学习和使用(一)

一.Tomcat服务器端口的配置 Tomcat的所有配置都放在conf文件夹之中,里面的server.xml文件是配置的核心文件. 如果想修改Tomcat服务器的启动端口,则可以在server.xml配置文件中的Connector节点进行的端口修改 例如:将Tomcat服务器的启动端口由默认的8080改成8081端口 Tomcat服务器启动端口默认配置 1 <Connector port="8080" protocol="HTTP/1.1" 2 connect