从头開始写项目Makefile(七):统一目标输出文件夹
【版权声明:转载请保留出处:blog.csdn.net/gentleliu。
Mail:shallnew at 163 dot com】
上一节我们把规则单独提取出来,方便了Makefile的维护,每一个模块仅仅须要给出关于自己的一些变量,然后再使用统一的规则Makefile。这一节我们继续改进我们的Makefile,到眼下为止我们的Makefile编译链接输出的目标都在源文件同文件夹下或模块Makefile同一文件夹下。当一个项目大了之后,这样会显得非常乱,寻找编译输出的文件也比較困难。
既然Makefile本身就是依照我们的的规则来编译链接程序,那么我们就能够指定其编译链接目标的文件夹。这样。我们能够清楚输出文件的地方,而且在清除已编译的目标时直接删除指定文件夹就可以。不须要一层一层的进入源码文件夹进行删除。这样又提高了效率。
既然要统一目标输出文件夹,那么该文件夹就须要存在。所以我们能够添加一条规则来创建这些文件夹。包含创建可运行文件的文件夹、链接库文件的文件夹以及.o文件的文件夹。而且文件夹还能够通过条件推断依据是否产生调试信息来区分开对应的目标文件。
一般一个project的顶层文件夹下都会有一个build文件夹来存放编译的目标文件结果,眼下我的project文件夹下通过Makefile创建的文件夹build的文件夹树例如以下:
build/ //build根文件夹
├── unix //unix平台项目下不带调试信息输出文件夹
│ ├── bin //存放可运行文件文件夹
│ ├── lib //存放可文件文件夹
│ └── obj //存放.o文件文件夹,该文件夹下将每一个模块生成的.o文件各自的文件夹以下
│ ├── ipc
│ ├── main
│ └── tools
└── unix_dbg ////unix平台项目下带调试信息输出文件夹
├── bin
├── lib
└── obj
├── ipc
├── main
└── tools 14 directories, 0 files
以上文件夹中bin和lib文件夹在顶层Makefile中创建,obj及其以下模块子文件夹在各模块的Makefile里面创建。
顶层Makefile创建文件夹例如以下:
ifeq ($(DEBUG_SYMBOLS), TRUE)
>---BUILDDIR = ./build/$(PLATFORM)_dbg
else
>---BUILDDIR = ./build/$(PLATFORM)
endif all : $(BUILDDIR) $(MODULES) $(BUILDDIR):
>---@echo " Create directory $@ ..."
>---mkdir -p $(BUILDDIR)/bin $(BUILDDIR)/lib
我们在all目标里面添加了其依赖目标BUILDDIR。该目标相应的规则为创建bin文件夹和lib文件夹。这样每次编译之前都会创建文件夹。
各模块内部Makefile创建生成.O文件的文件夹。如上文件夹树所看到的。
类似于顶层Makefile,各模块内部Makefile须要依据平台、编译调试信息、以及模块名称来生成须要的文件夹名称,然后再添加创建该文件夹的规则。
由于每一个模块都会做这些处理。所以我们将这部分写在规则Makefile(Makefile.rule)里面。例如以下:
……
# define a root build directory base on the platform
# if without a SRC_BASE defined, just use local src directory
ifeq ($(SRC_BASE),)
>---BUILDDIR = $(MOD_SRC_DIR)
>---OBJDIR = $(MOD_SRC_DIR)
>---LIBDIR = $(MOD_SRC_DIR)
>---BINDIR = $(MOD_SRC_DIR)
else
>---ifeq ($(DEBUG_SYMBOLS), TRUE)
>--->---BUILDDIR = $(SRC_BASE)/build/$(PLATFORM)_dbg
>---else
>--->---BUILDDIR = $(SRC_BASE)/build/$(PLATFORM)
>---endif
>---OBJDIR = $(BUILDDIR)/obj/$(MODULE)
>---LIBDIR = $(BUILDDIR)/lib
>---BINDIR = $(BUILDDIR)/bin
endif
……
ifeq ($(MAKELEVEL), 0)
all : msg
else
all : lib bin
endif lib : $(OBJDIR) $(SRC_LIB) bin : $(OBJDIR) $(SRC_BIN) $(OBJDIR) :
>---@echo " MKDIR $(notdir $@)..."
>---@mkdir -p $@
……
此时我们编译一下后查看build文件夹:
build/
└── unix_dbg
├── bin
├── lib
└── obj
├── ipc
├── main
└── tools 7 directories, 0 files
因为我们是开启了调试信息,所以创建了unix_dbg文件夹,而且该文件夹下创建了bin、lib、obj文件夹及其模块文件夹,但我们没有发现有文件存放在里面。
到眼下为止,这一节只讲述怎样创建统一的目标文件存放文件夹。可是要想将编译生成的目标文件自己主动生成到这些文件夹还没有完毕。
事实上我们只须要给目标加上路径就可以,但还是有一些具体的地方须要处理,具体的我们会在下一节中讲到,这一节暂不给出最后的Makefile。
从头開始写项目Makefile(七):统一目标输出文件夹的更多相关文章
- 从头開始写项目Makefile(十):make内嵌函数及make命令显示
[版权声明:转载请保留出处:blog.csdn.net/gentleliu.Mail:shallnew at 163 dot com] 这一节我们讲一下make的函数,在之前的章节已经讲到了几 ...
- 从头開始写项目Makefile(五):嵌套运行
[版权声明:转载请保留出处:blog.csdn.net/gentleliu.Mail:shallnew at 163 dot com] 在大一些的项目里面,全部源码不会仅仅放在同一个文件夹,一般各个功 ...
- 从零開始写游戏引擎(一) - project创建以及文件夹设置还有版本号控制
一句话提要 好的開始等于成功了一半. 创建文件夹结构 project文件夹下最好分为以下几个文件夹 Docs - 开发文档,设计文档 Assets - 角色,动作,模型和音效等 Source - 代码 ...
- 从0開始写MyScrollView
从0開始写MyScrollView 上篇文章对ScrollView的详细实现进行了分析.本文依据上篇分析的结果.自己动手写一个ScrollView. step1 尾随手指滑动,非常easy.重写2个函 ...
- [php learn] php 从头開始学习1
前言:大概在2006年的时候,学习过一段时间的php.而且当时做了一个下载的站点,后来因为读研究生阶段用的是java.j2ee相关,所以php就搁浅掉了,php这些年也发生了非常大的变化,最大一个变化 ...
- 项目工程的包package与文件夹的关系
项目工程的包package与文件夹的关系: 1. 包名与文件夹是分层关系,包名只是一个字符串而已,包名.对应的是层级的文件夹. 如,com.Immoc.Access包,只是一个字符串.但他对应的win ...
- SQL从头開始
SQL 分为两个部分:数据操作语言 (DML) 和 数据定义语言 (DDL) 查询和更新指令构成了 SQL 的 DML 部分: SELECT - 从数据库表中获取数据 UPDATE - 更新数据库表中 ...
- [Golang] 从零開始写Socket Server(3): 对长、短连接的处理策略(模拟心跳)
通过前两章,我们成功是写出了一套凑合能用的Server和Client,并在二者之间实现了通过协议交流.这么一来,一个简易的socket通讯框架已经初具雏形了,那么我们接下来做的.就是想办法让这个框架更 ...
- 从头開始学 RecyclerView(六) LayoutManager
前言 在前面的文章中.每一个演示样例,都使用了LayoutManager,毕竟它是RecyclerView必不可少的一部分. LayoutManager,顾名思义,就是『布局管理器』. 使用例如以下代 ...
随机推荐
- 【Chromium中文文档】跨进程通信 (IPC)
跨进程通信 (IPC) 转载请注明出处:https://ahangchen.gitbooks.io/chromium_doc_zh/content/zh//General_Architecture/I ...
- WebRTC 音视频开发
WebRTC 音视频开发 webrtc Android IOS WebRTC 音视频开发总结(七八)-- 为什么WebRTC端到端监控很关键? 摘要: 本文主要介绍WebRTC端到端监控(我们翻译 ...
- Apache commons (Java常用工具包)简介
Apache Commons是一个非常有用的工具包,解决各种实际的通用问题,下面是一个简述表,详细信息访问http://jakarta.apache.org/commons/index.html Be ...
- jQuery.fn和jQuery.prototype jquery.extend() jquery.fn.extend()区别介绍
这里的 jQuery , jQuery.fn , jQuery,fn,init ,jQuery,prototype 都代表什么. 来看下jQuery的源码是怎么样定义的: (function( win ...
- Redis用户添加、分页、登录、注册、加关注案例
连接redis代码redis.php <?php //实例化 $redis = new Redis(); //连接服务器 $redis->connect("localhost&q ...
- C语言入门(4)——常量、变量与赋值
对于基本数据类型量,按其取值是否可改变又分为常量和变量两种.在程序执行过程中,其值不发生改变的量称为常量,其值可变的量称为变量.它们可与数据类型结合起来分类. 常量 常量有字符常量(Character ...
- golang仿AS3写的ByteArray
用golang写了个仿AS3写的ByteArray,稍微有点差别,demo能成功运行,还未进行其他测试 主要参考的是golang自带库里的Buffer,结合了binary 来看看demo: packa ...
- 雕爷牛腩这样判断零售未来-搜狐IT
雕爷牛腩这样判断零售未来-搜狐IT 雕爷牛腩这样判断零售未来
- mysql 5.6密码强度插件使用
在mysql 5.6对密码的强度进行了加强,推出了validate_password 插件.支持密码的强度要求. 此插件要求版本:5.6.6 以上版本安装方式: 1.安装插件:(默认安装了插件后,强度 ...
- JavaScript之arguements对象学习
简介:在JavaScript中,有一个特殊的对象-Arguements对象,它是当前函数的一个内置属性,它类似与Array对象(数组形式),但不是Array的一个实例.下面通过代码来论证: <s ...