mooon编译系统介绍(可复用Makefile).pdf(ChinaUnix下载)

CSDN下载:http://download.csdn.net/detail/aquester/5626929

mooon编译系统介绍(可复用Makefile)

目录

1. 简要 1

2. 文件组成 1

2.1. 各文件的渊源关系图 2

3. 操作步骤:您需要做的 5

4. 修改configure.ac.in文件 5

5. 修改Make.rule.in文件 6

6. 修改主目录Makefile.am文件 6

7. 修改子目录Makefile.am.in文件 7

7.1. 静态库 7

7.2. 共享库 7

7.3. 可执行程序 8

7.4. _SOURCES 8

附1:编译系统文件包 9

附2:常见Makefile.am变量 9

附3:其它渊源关系图 11

渊源关系图1 12

渊源关系图2 13

渊源关系图3 14

渊源关系图4 14

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”之前。

Makefile.am



附3:其它渊源关系图

特别声明:以下图片均来自互联网,版本归原作者所有,在此借用表示感谢。

渊源关系图1

渊源关系图2

渊源关系图3

渊源关系图4

mooon编译系统介绍(可复用Makefile)相关推荐

  1. 基于Docker的Caffe编译(CUDA11的makefile版)

    文章目录 基于Docker的Caffe编译(CUDA11的makefile版) cuda10版(CMake版) nvidia-cuda镜像 容器的使用 caffe的编译 1.安装python 2.安装 ...

  2. 海思osd+freetype+SDL+SDL_ttf编译成功后,Makefile的编写

    请先移步我的上一篇转载博文http://blog.csdn.net/qq_26671365/article/details/78974661,这里先感谢一下博文的原创者,使我受益匪浅. 这里假设你已经 ...

  3. linux新建好文件后怎么编译,使用autoconf生成Makefile并编译工程的步骤

    前言 在Linux下,编译和链接需要用Makefile,而写好一个Makefile可不容易,写出一个规范的Makefile更是麻烦.我们可以利用autoconf来生成一个Makefile,尤其在大型工 ...

  4. linux下c 编译脚本,Linux下编译C语言与makefile脚本语言

    GCC 1.Source CRT 软件:可以控制linux的终端. 2.FileZilla 软件: windows 远程传文件到linux. 使用sourceinsight 文本编辑器 一linux编 ...

  5. Android编译系统介绍

    1. 编译系统变化 Android 最初是用 Android.mk 来定义模块的, Android.mk 本质上就是 Makefile.随着 Android 工程越来越大,包含的模块越来越多,以 Ma ...

  6. Linux系列学习(二) - Vim编辑器的介绍及使用、文件编译的过程、Makefile工具、Gdb调试器

    目录 引言: 基本命令补充: cat命令: man命令: head命令: tail命令: find命令: grep命令: ​​​​​​​grep命令与管道"|" 的结合使用: ta ...

  7. 编译与调试以及makefile

    编译链接 总的来说,g++会直接执行编译链接操作,如果有了-c 则会不执行链接操作,只执行编译操作,而有了-o 才能控制可执行文件的名字 所以说,如果直接执行 g++ test.cpp 会产生一个默认 ...

  8. TDA4VM 8.4 RTOS SDK 中 SBL 的编译流程解析与makefile 分析笔记

    目录 0. TDA4VM 8.4 RTOS SDK 中 SBL 的编译流程解析 TI SDK 的可执行文件后缀名是 .xer5f 的原因 sbl_ospi_img 的 .xer5f 可执行文件的生成过 ...

  9. (2)构建Zeta Linux镜像及Zeta编译系统介绍

    目录 一.编译Zeta Linux SDK 二.zmake工具简介 三.zeta.in简介 一.编译Zeta Linux SDK 在安装好软件包的64位Ubuntu 16.04系统里下载好代码以后,执 ...

最新文章

  1. Assembly学习心得
  2. 使用静态URL片段 URL路由 精通ASP-NET-MVC-5-弗瑞曼
  3. 无贡献、无创新、无思路,ML领域准博士求助:论文到底要怎么创新?
  4. CDOJ 251 导弹拦截 最长递增子序列
  5. tf里面InteractivateSession()与Session()的区别
  6. c语言程序设计王新萍课后答案,C语言程序设计教程
  7. open ai gpt_让我们来谈谈将GPT-3 AI推文震撼到核心的那条推文
  8. C++顺序创建txt文件
  9. spring中context:property-placeholder标签详解
  10. matlab函数anova,MATLAB进行单因素方差分析-ANOVA
  11. H5 27-优先级之important
  12. python数据结构-数组/列表/栈/队列及实现
  13. 深度报文检测 linux,DPI-深度报文检测(进阶)
  14. [DappReview]2020年第一季度Dapp市场报告
  15. 免费的modelsim安装教程(Intel modelsim altera 的初学者)
  16. 缠论中枢python源码_缠论画中枢主图指标 源码 通达信 贴图
  17. C语言基础丨(六)程序结构——顺序结构【1】
  18. 功耗:Leakage Power
  19. 淘宝新店刚开如何测款?
  20. 学一点Wi-Fi: CCMP

热门文章

  1. android https双向认证
  2. 一刷leetcode——树
  3. [原创]数论个人模板
  4. linux运维正则表达式技术分享
  5. sqlserver 2005的安装部署
  6. eclipse3的jsp支持简单配置
  7. arm平台函数传递参数,反汇编实例分析
  8. python 3.3.3 字面量,正则,反斜杠和原始字符串
  9. end_request: I/O error
  10. Tomcat6.0配置集合