mooon编译系统介绍(可复用Makefile)
mooon编译系统介绍(可复用Makefile).pdf(ChinaUnix下载)
CSDN下载:http://download.csdn.net/detail/aquester/5626929
mooon编译系统介绍(可复用Makefile)
目录
1. 简要
不需要花时间去学习automake和Makefile,任何C/C++项目,都可以非常容易的复用mooon(http://code.google.com/p/mooon)的编译系统。
它基于标准的automake,但在automake的基础上增加了一个bootstrap.sh脚本文件。bootstrap.sh做了些自动化工作,从而简化了automake的使用,其中一个重要作用是基于模板Makefile.am.in生成Makefile.am。不再需要手工一个个地去填写源代码文件。
※建议:mooon编译系统虽易于使用,但仍建议对Makefile和automake做些了解。
2. 文件组成
原始文件 |
bootstrap.sh新生成文件 |
||
主目录下 |
子目录下 |
主目录下 |
子目录下 |
bootstrap.sh 以下三个是需要修改的文件: configure.ac.in Make.rules.in Makefile.am 以下文件可不做任何修改,直接拿过去即可: AUTHORS ChangeLog COPYING INSTALL ttmain.sh NEWS README |
Makefile.am.in或 Makefile.am 这两个文件也是需要修改的 |
configure.ac Make.rules |
Makefile.am |
※上表格中后缀为.in的文件为模板文件,是bootstrap.sh需要的,而不是标准automake规定的。经过bootstrap.sh后,会发生Makefile.am同目录下有Makefile.in文件,它是automake命令根据Makefile.am生成的Makefile模板文件。
2.1. 各文件的渊源关系图
以下几个图(均取自互联网,版权归原作者所有,在此借用表示感谢)都是同一个意思,同时放上来,有助于更详细的了解它们间的渊源关系:
渊源关系图1
渊源关系图2
渊源关系图3
渊源关系图4
configure.in和configure.ac两者只需要一个,configure.ac是新的命名方式。基于bootstrap.sh的automake,省去了configure.scan,原因是直接使用了现存的configure.ac.in。
在configure.ac.in中,有一行是“AC_PREREQ(AUTOCONF_VERSION)”,bootstrap.sh会将“AUTOCONF_VERSION”替换成实际的autoconf版本号,具体实现可参见bootstrap.sh中的replace_autoconf_version()函数实现。
3. 操作步骤:您需要做的
1) 配置好如下几个文件:
configure.ac.in
Make.rule.in
主目录下的Makefile.am
子目录下的Makefile.am.in或Makefile.am
2) 执行bootstrap.sh脚本文件,以生成以下文件:
configure.ac
Make.rule
子目录下的Makefile.am
※这一步是非标准automake要求的,而是mooon编译系统独特增加的一步,经历这一步之后,就和标准的automake完全相同了,只要没有源代码文件的增、减和改名,执行一次后,就不用再次执行。
从下面开始的步骤,和标准的automake完全相同:
3) 执行configure脚本文件,以生成Makefile文件
4) 执行make命令,开始编译
5) 编译成功后,可以再执行make install命令进行安装
4. 修改configure.ac.in文件
只有一处是必须修改的,如下:
AC_CONFIG_FILES([
Makefile
x/Makefile
])
其中,上述第二行的Makefile是必须的,而第二行之后的内容根据实际处理,上述表示需要在子目录x下生成一个Makefile文件。假设有多个子目录(分别为:abc,bbb和xyz),则如下:
AC_CONFIG_FILES([
Makefile
abc/Makefile
bbb/Makefile
xyz/Makefile
])
※注:子目录可是多级目录,如mooon-common_component主目录下的configure.ac.in:
AC_CONFIG_FILES([
Makefile
conf/Makefile
loader/Makefile
server/Makefile
http_parser/Makefile
dispatcher/Makefile
observer/Makefile
agent/Makefile
agent/tester/Makefile
agent/center/Makefile
])
上述的tester和center就是多级子目录了。
对于configure.ac.in文件,除了上述修改外,还可以修改如下两行(但不是必须的):
AC_INIT(jian, 0.1.0, eyjian@qq.com)
AM_INIT_AUTOMAKE(common_library, 0.1.0)
其中common_library为库的名称,或者产品名称等,0.1.0则是版本号。jian可以改成公司名或个人名等。
5. 修改Make.rule.in文件
Make.rule.in用于定义公共的编译选项和链接用参数,如果没有这方面的需求,则可对Make.rule.in不做任何修改。
但推荐良好的做法:
1) 将用到的第三方库的include定义在Make.rule.in,以方便在子目录的Makefile.am.in中直接引用;
2) 将用到的第三方库的lib定义在Make.rule.in,以方便在子目录的Makefile.am.in中直接引用;
3) 其它的通用编译选项和链接用参数等。
6. 修改主目录Makefile.am文件
请注意,主目录下只有Makefile.am,而不会有Makefile.am.in。它的内容非常简单,模板中仅包括如下两行内容:
EXTRA_DIST =
SUBDIRS = x
EXTRA_DIST和SUBDIRS都是标准automake的关键词。一般只需要关注SUBDIRS,它后面跟着书写各子目录名(需要生成Makefile文件的子目录名),可以包含多个子目录和多级子目录,如下面是mooon-common_component的主目录Makefile.am的内容:
EXTRA_DIST =
SUBDIRS = conf loader server http_parser observer dispatcher agent agent/tester agent/center
※注:等号左右两边的空格不是必须的,可有可无。
7. 修改子目录Makefile.am.in文件
Makefile.am.in主要是配置需要生成的静态库文件、共享库(也叫动态库)文件和可执行程序文件。它们三个的配置是可以并存,同时出现的,只要名称不同,各都可出现多次。
请特别注意,bootstrap.sh只会处理Makefile.am.in,通过它生成Makefile.am。如果不想bootstrap.sh做任何处理,只需要去掉Makefile.am.in文件,直接使用Makefile.am即可。
7.1. 静态库
静态库必须包括的内容如下:
libdir=$(prefix)/lib
lib_LIBRARIES = libx.a
libx_a_SOURCES =
其中libx.a是静态库的文件名,需要根据实际修改,请注意它的书写方式。libdir用于指定make install后静态库安装的路径。lib_LIBRARIES用于需要生成的静态库名称。
7.2. 共享库
共享库必须包括的内容如下:
moduledir=$(prefix)/lib
module_PROGRAMS = libx.so
libx_so_SOURCES =
对于共享库,AM_LDFLAGS和AM_CXXFLAGS中包含-fPIC是必须的,而且AM_LDFLAGS中必须包含-shared以表示生成共享库。
其中libx.so是共享库的文件名,请注意它的书写方式。moduledir用于指定make install后共享库的安装路径;module_PROGRAMS用于需要生成的共享库名称。
7.3. 可执行程序
可执行程序必须包括的内容如下:
bindir=$(prefix)/lib
bin_PROGRAMS = x
x_SOURCES =
其中x是可执行程序的文件名,请注意它的书写方式。bindir用于指定make install后可执行程序的安装路径;bin_PROGRAMS用于需要生成的可执行程序名称。
7.4. _SOURCES
“_SOURCES”用于指定需要编译哪些源代码文件(必须包括实现文件,也可选包含头文件)。
在模板中,我们可以看到含“_SOURCES”一行都是空的的,等号后没有内容。注意等号后虽然是空的,但等号仍是必须的。
bootstrap.sh存在的一个最重要的原因是在执行bootstrap.sh时,自动填充“_SOURCES”的值。
bootstrap.sh中的gen_makefile_am()函数完成填充“_SOURCES”的值。
共有四种方式来确定“_SOURCES”的值内容:
1) 手工填写,如:libx_a_SOURCES = x.cpp x.h;
2) 保留为空,让bootstrap.sh自动填写:
如果“_SOURCES”为空,则bootstrap.sh会使用“find . -maxdepth 2 | awk '/.cpp$|.cc$|.h$|.hpp$/{printf("%s ", $0)}'”命令输出的结果作为它的值。
bootstrap.sh会自动切换到与Makefile.am.in相同的子目录下执行find命令。
3) 使用脚本文件的输出结果作为“_SOURCES”的值:libx_a_SOURCES = x.sh。这里,“x.sh”是一个可执行脚本文件,bootstrap.sh使用它的输出替换掉x.sh。注意x.sh也是在与Makefile.am.in相同的子目录下被执行。
4) 使用一段脚本代码作为“_SOURCES”的值:libx_a_SOURCES = ls *.cpp。这里“ls *.cpp”是一段可执行的脚本代码,而不是脚本文件,bootstrap.sh使用它的输出作为“_SOURCES”的值。注意也是在与Makefile.am.in相同的子目录下被执行
附1:编译系统文件包
x.zip(下载网址:https://mooon.googlecode.com/svn/trunk/x.zip)
解压后结构如下图所示:
附2:常见Makefile.am变量
这里讲的是可能需要修改的变量:
变量名 |
变量说明 |
INCLUDES |
用于指定编译时搜索的头文件所在路径,多行时使用“+=”连接起来 |
LDADD |
用于指定链接参数,多行时使用“+=”连接起 |
AM_LDFLAGS |
用于指定链接参数,多行时使用“+=”连接起 |
AM_CXXFLAGS |
用于指定C++代码的编译参数,多行时使用“+=”连接起 |
如果在一个Makefile.am或Makefile.am.in中有多个生成目标(静态库、共享库和可执行程序),编译和链接参数不同时,可以采用:
目标名称_LDADD
目标名称_LDFLAGS
来指定,如生成x需要使用到libx.a,而不需要libz.a:
x_LDADD = libx.a
z_LDADD = libz.a
但请注意,将它们放置于相应的“_SOURCES”之前。
n Makefile.am
附3:其它渊源关系图
特别声明:以下图片均来自互联网,版本归原作者所有,在此借用表示感谢。
渊源关系图1
渊源关系图2
渊源关系图3
渊源关系图4
mooon编译系统介绍(可复用Makefile)的更多相关文章
- .c文件如何编译为ko的MAKEFILE文件编写
首先需要知道: obj-m = *.o obj-y = *.o 上面两者的区别在于,前者才会生成ko文件,后者只是代码编译进内核,并不生成ko文件. 生成KO文件,分两种情况:单个.c文件和多个.c文 ...
- 编译libdvm.so: makefile,mm
操作系统:Ubuntu14.4 android版本:4.4 设备:nexus 5 android系统的编译使用make来操作,那make呢是执行对应的makefile即android的编译系统看mak ...
- 编译kernel:内核makefile的作用
< 嵌入式linux应用完全开发手册 > 韦东山 内核Makefile的使命: 编译哪些内核文件? 读取各级子目录makefile, .config, auto.conf, Kbuild, ...
- 编译环境搭建:Makefile
前言 长久以来,笔者一直想用一种管理工具,将所编写的测试程序.算法代码以及工程代码统一管理起来.因为有些是用Java写的有些是用C++写的.虽有想法,但却无行动.这又让我想起了昨天晚上看到一部电影里所 ...
- detours编译与windows下makefile学习
1.编译 windows环境命令行编译很少用,detours需要使用命令行编译,刚好试试,过程如下: 1.为了能够在所有目录中使用nmake命令,需要设置环境变量Path D:\Program Fil ...
- (二)我的Makefile学习冲动&&编译过程概述
前言 一 年轻的冲动 二 学习曲线 1 Makefile基本语法 2 bash基础 3 world 三 编译过程概述 1 主机预装工具 2 编译host工具 3 编译交叉工具链 4 编译内核模块 5 ...
- 三、编译第一步 make xxx_defconfig——Makefile.build 脚本
3.1 上章分析回顾 3.1 上章分析出的参数 3.1.1 变量 MAKECMDGOALS = xxx_defconfig KBUILD_EXTMOD = version_h := include/g ...
- uboot主Makefile分析(t配置和编译过程详解)
1.编译uboot前需要三次make make distcleanmake x210_sd_configmake -j4 make distclean为清楚dist文件. make x210_sd_c ...
- 在makefile通过宏定义来控制源程序的编译
在Makefile中我们可以通过宏定义来控制源程序的编译.只要在Makefile中的CFLAGS中通过选项-D来指定你于定义的宏即可. 如:CFLAGS += -D _XXX在编译的时候加上此选项就可 ...
随机推荐
- ACM比赛(第三次D)
Time Limit:1000MS Memory Limit:131072KB 64bit IO Format:%lld & %llu Description 有三户人家共拥有 ...
- centos安装python gcc sqlite
终端中输入命令:yum install gcc -y yum install python -y yum install sqlite -y
- 小记:css特殊性
今天早上遇到了个小bug,刚好用从css权威指南学到的知识解决了 html结构 <ul class="portlet-nav"> <li><a id= ...
- UTL_RAW
The UTL_RAW package provides SQL functions for manipulating RAW data types. 该包的功能其实可以用来加密: SELECT ...
- [Boost]boost的时间和日期处理-(2)时间的操作
<开篇> 本篇紧接着boost上篇叙述Boost::DateTime的时间处理.在C++中,常见的时间有time_t, FILETIME和tm,而boost中用ptime. 构造ptime ...
- swift 自定义TabBarItem
1.效果图 2.NewsViewController.swift // // NewsViewController.swift // NavigationDemo // // Created ...
- Websense一面、二面及Offer
1. 写脚本打印当前目录(子目录)下文件内容中包含abc字符串文件 2. 用C写一个管道通信的程序:父进程向子进程写一个”hello word”字符串,子进程输出. 3. 解释I-node. 4 ...
- PHP - 验证用户名
/** * * 函数名:_check_username($user_str,$min_num,$max_num); * 作用:检测用户名是否符合格式 * 参数: * 1:用户名 * 2:不得小于多少位 ...
- Ch05 视图模型
5.1 什么是视图模型 5.1.1 在线商店示例 5.1.2 建立视图模型 5.1.3 交付表现模型 5.1.4 ViewData.Model 5.2 表现用户输入 5.2.1 设计(输 ...
- asp.net2.0安全性(1)--用户角色篇(代码实现2)--转载来自车老师
加载所有用户 MembershipUserCollection user = Membership.GetAllUsers(); listUser.DataSource = user; listUse ...