从头開始写项目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,顾名思义,就是『布局管理器』. 使用例如以下代 ...
随机推荐
- jquery学习(3)--高级选择器
自己手写的学习笔记.常规选择器: /****************学习--高级选择器(1)****************/---高级选择器:ie7+ 层次选择器: 后代选择器 ul li ...
- 《离散数学之把妹要诀》的js实现
网上看到一篇有意思的文章<离散数学之把妹要诀> 就用JS写了上面所讲的配对方式: 首先设定变量 // 男生理想列表 var menPreference = { A: [1, 2, 3, 4 ...
- charset
<meta charset="UTF-8" /> 这是html5的写法. <meta http-equiv=“content-type” content=“tex ...
- 给js文件传递参数
一.利用全局变量 这是最简单的一种方式,比如Google Adsense: <script type="text/javascript"> google_ad_clie ...
- Oracle EBS-SQL (SYS-20):职责使用菜单2.sql
select frt.responsibility_name, fr.menu_id, fm.menu_name, fr.request_group_i ...
- c# 获取移动硬盘信息、监听移动设备的弹出与插入事件
原文 http://www.cnblogs.com/coolkiss/p/3328825.html 备忘一下改功能,主要通过WMI来实现,对于监听外接设备的弹出和插入事件一开始使用IntPtr Wnd ...
- 奇怪的问题:android:focusable和android:clickable造成ListView的点击不了
今天花了我很长时间,才解决一个很奇怪的问题,就是在ListView的点击反应不了的问题…… 在ListView中,如果其中一个元素设置为android:focusable="true&quo ...
- Spring mvc 简单异常配置jsp页面
原文出处:http://howtodoinjava.com/spring/spring-mvc/spring-mvc-simplemappingexceptionresolver-example/ 这 ...
- hibernate中文查询时无查询结果
原因很简单,问题在于我连接mysql用的url时,没有指定字符集,导致查询不到任何数据 问题出在 hibernate.xml配置文件中: 将 <property name="jdbcU ...
- oracle 快照(snapshot) 管理
----手工创建oracle 快照 BEGIN DBMS_WORKLOAD_REPOSITORY.CREATE_SNAPSHOT (); END; / ---删除快照 详细快照信息能够查看视图 ...