Automake实例应用探讨_第1页
Automake实例应用探讨_第2页
Automake实例应用探讨_第3页
Automake实例应用探讨_第4页
Automake实例应用探讨_第5页
已阅读5页,还剩61页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

I目录1 Aotumake 概论 .12 使用 Automake 前的准备工作 .23 Automake 使用指南 .23.1 autotools 的工作原理 .23.2 编写 Makefile.am.33.2.1 Makefile.am 规则 .33.2.2 库的生成 .53.2.3 可执行文件的生成 .63.3 编写 configure.in 文件 .63.3.1 在 configure.in 中定义外部变量 .63.3.2 给 configure 配置自定义参数 .74 Automake 的应用 使用 Automake 生成 Makefile.84.1 Makefile 的用处 .84.2 使用 Automake 生成 Makefile 的优势 .84.3 Automake 应用实例 .94.3.3 执行 aclocal 和 Autoconf .104.3.4 编辑 Makefile.am 文件 .104.3.5 执行 Automake .104.3.6 执行 ./configure .104.4 使用已定义好的宏生成 Makefile .124.4.1 编辑 configure.in 文件 .144.4.2 编辑 Makefile.am 文件 .155 结束语 .171 Aotumake概论在 Unix 上写程式的人大概都碰过 Makefile,尤其是用 C 来开发程式的人。用 make 来开发和编译程式的确很方便,可是要写出一个 Makefile 就不简单了。偏偏介绍 Makefile 的文件不多,GNU Make 那份印出来要几百页的文件,光看完 Overview 就快阵亡了,难怪许多人闻 Unix 色变。本文将介绍如何利用 GNU Autoconf 及 Automake 这两套软件来协助我们自动产生 Makefile 档,并且让开发出来的软件可以像 Apache,MySQL 和常见的 GNU 软件一样,只要会 ./configure,make,make install 就可以把程式安装到系统中。如果您有心开发 OpenSource 的软件,或只是想在 Unix 系统下写写程式。希望这份介绍文件能帮助您轻松地进入 Unix Programming 的殿堂。Makefile 基本上就是目标(target),关连(dependencies) 和动作三者所组成的一连串规则。而 make 就会根据 Makefile 的规则来决定如何编译 (compile) 和连结 (link) 程式。实际上 make 可做的不只是编译和连结程式,例如 FreeBSD 的 port collection 中,Makefile 还可以做到自动下载原始程式套件,解压缩 (extract),修补(patch),设定,然后编译,安装至系统中。Makefile 基本构造虽然简单,但是妥善运用这些规则就也可以变出许多不同的花招。却也因此,许多刚开始学习写 Makefile 时会感到没有规范可循,每个人写出来的 Makefile 长得都不太一样,不知道从何下手,而且常常会受限於自己的开发环境,只要环境变数不同或路径改一下,可能 Makefile 就得跟着修改。虽然有 GNU Makefile Conventions (GNUMakefile 惯例)订出一些使用 GNU 程式设计时撰写 Makefile 的一些标准和规范,但是内容很长而且很复杂,并且经常做些调整,为了减轻程式设计师维护 Makefile 的负担,因此有Automake。程式设计师只需写一些预先定义好的巨集 (macro),交给 Automake 处理後会产生一个可供 Autoconf 使用的 Makefile.in 档。再配合利用 Autoconf 产生的自动设定档 configure 即可产生一份符合 GNU Makefile 惯例的 Makeifle 了。2 使用 Automake前的准备工作在开始试着用 Automake 之前,请先确认你的系统已经安装以下的软件:1. GNU Automake2. GNU Autoconf3. GNU m44. perl5. GNU Libtool (如果你需要产生 shared library)我会建议你最好也使用 GNU C/C+ 编译器、GNU Make 以及其它 GNU 的工具程式来做为开发的环境,这些工具都是属于 Open Source Software 不仅免费而且功能强大。如果你是使用 Red Hat Linux 可以找到所有上述软件的 rpm 档,FreeBSD 也有现成的 package 可以直接安装,或着你也可以自行下载这些软件的原始档回来 DIY。以下的范例是在 Red Hat Linux 5.2 + CLE2 的环境下所完成的。3.Automake使用指南Automake 主要通过编辑 Makefile.am 来控制它的行为,下面就常用的三个Makefile.am 配置做出说明。3.1 autotools的工作原理autotools 最终是为了生成 Makefile,为此,需要使用到 autotools 系列工具的如下几个命令:autoscan aclocalautoheaderautoconfAutomake另外,还需要有两类输入文件:configure.in 和 Makefile.am。其中,configure.in 是用来生成 configure 脚本的,configure 脚本的作用主要有两个:检测系统的环境,生成 Makefile。而 Makefile.am 则是生成 Makefile 的参数,它们之间是一一对应的。一般来说,在一个工程中每个目录下都会有一个 Makefile 来管理当前目录下的文件。所以,基本上每个目录中都需要编写一个 Makefile.am,来描述当前目录下生成的 Makefile 的行为。有了生成工具和输入文件,下面来看一下生成 Makefile 的流程,如下图所示:需要说明的是 autoscan 工具的使用,autoscan 检测当前目录下的所有文件,生成一个 configure.scan,这个文件可以作为 configure.in 文件的雏形,在它的基础上稍做修改就可以作为 configure.in 文件来使用。所以,autoscan工具只需要在工程创建时运行一次即可。下面就来具体介绍两个输入文件的编写规则:3.2 编写 Makefile.am3.2.1 Makefile.am规则Makefile.am 写起来相对简单,有共有 5 类规则,如下表表 3.2.1 Makefile.am 中的规则文件类型 书写格式可执行文件 bin_PROGRAMS = foofoo_SOURCES = xxx.c xxxx.cfoo_LDADD = foo_LDFLAGS = foo_DEPENDENCIES = 静态库 lib_LIBRARIES = foo.afoo_a_SOURCES = xxx.c xxxx.cfoo_a_LDADD = foo_a_LIBADD = foo_a_LDFLAGS = 动态库 lib_LTLIBRARIES = foo.lafoo_la_SOURCES = xxx.c xxxx.cfoo_la_LDADD = foo_la_LIBADD = foo_la_LDFLAGS =头文件 include_HEADERS = foo.hnoinst_HEADERS = foo2.h数据文件 data_DATA = data1 data2其中,生成动态库的同时还会自动生成一个静态库,所以在一般情况下都不直接使用静态库规则。Makefile.am 中还有一些可以直接使用的全局变量,表示所有目标所共享的一些属性,见下表:表 3.2.2 Makefile.am 中的变量变量 含义INCLUDES 编译时所需头文件LDADD 链接时所需链接的库文件LDFLAGS 链接时的选项AM_CXXFLAGS 编译.cpp 文件时的选项AM_CFLAGS 编译.c 文件时的选项EXTRA_DIST 除源代码和一些默认的文件以外,其它需要打如发布包.tar.gz 中的文件SUBDIRS 在处理本目录之前要递归处理的子目录top_srcdir 工程源码的最顶层目录top_builddir 工程目标文件的最顶层目录有了以上的规则和变量,我们可以完成最基本的 Makefile.am 编写,但在某些情况下,我们需要定义一些变量来控制工程中某些目标的生成:比如库的版本号是不断变化的,需要定义一个变量来指代。Makefile.am 可以使用宏替换来实现这种功能,可以通过以下方式来引用一个宏:宏名这个宏的的定义是在 configure.in 中的,现在 Makefile.am 中所需要了解的规则和语法已经介绍完了,下面介绍一下如何使用这些规则来具体生成一个库和可执行程序。3.2.2 库的生成要生成一个库,需要在 Makefile.am 中加入一套动态库规则(见表 3.2.1),如现在要用 hello1.cpp 和 hello2.cpp 两个源文件生成动态库 libhello.so,库的版本为 1.0.10,库需要额外连接一个叫做 libworld.so 的库,我们可以这样写:lib_LTLIBRARIES = hello.lahello_la_SOURCES = hello1.cpp hello2.cpphello_la_LIBADD = -lworldhello_la_LDFLAGS = -version-info 1.0.10可以看到,在 LIBADD 规则中链接库文件的方法与使用 g+编译时的相同。但 LDFLAGS 规则中的属性就没有见过了。实际上,这个参数是传给 libtool 生成库时使用的,除了-version-info 这个参数之外,LDFLAGS 编译库时还会经常使用下面两个参数:-avoid-version 生成不带版本号的库-all-static 生成为静态库3.2.3 可执行文件的生成要生成一个可执行文件,需要加入一套可执行文件的规则(见表 3.2.1),与生成动态库的规则很类似。下面我们要使用源文件 main.cpp 生成可执行文件main,该可执行文件需要链接上面生成的库 libhello.so,我们可以这样写:bin_PROGRAMS = mainmain_ SOURCES = main.cppmain_ LDADD = -lhellomain_LDFLAGS = -I./include3.3 编写 configure.in文件与 Makefile.am 相比,configure.in 文件写起来更复杂,因为configure.in 文件中可以使用的资源要远多与 Makefile.am。但通常情况下,我们都可以借助 autoscan 工具帮助我们生成一个 configure.in 的模版,在此基础上再完善就可以了。所以,实际上我们只需要在 configure.in 中修改以下两个参数就可以了:AC_INIT(package_name, package_version, owner_email)AC_CONFIG_FILES(makefile1_pathmakefile2_path)AC_INIT()选项中指明了工程的名字,当前工程的版本号,工程所有者的邮箱。AC_CONFIG_FILES()中指明了所有要生成的 Makefile 的相对路径,由于每个 Makefile 都需要一个 Makefile.am 作参数,所以该选项中 Makefile 的数量和路径应与当前工程中 Makefile.am 的状态一致。在经过上面的修改之后,一个 configure.in 文件就基本可以使用了,但通常情况下,我们需要对它进行更多的配置。3.3.1 在 configure.in中定义外部变量在 configure.in 中定义变量与写 shell 脚本时定义变量的语法相同,如我们要定义一个值为 nihao 的变量 hello,我们可以这样写:hello=nihao但使用这个变量的方法就有些不同了,比如我们要将 hello 这个变量赋给hi 这个变量,我们可以这样写:hi=”$hello”如果这个变量需要被外部引用的话(如在 3.2.1 节中提到的 Makefile.am 引用 configure.in 中定义的变量),需要一个额外的选项来完成,如我们要将hello 定义为外部变量,可以写成:AC_SUBST(hello)而 Makefile.am 中也就可以通过对它的引用来完成对某些可变因子的替换,在 Makefile.am 中的引用方法见 3.2.1 节。3.3.2 给 configure配置自定义参数对于一个已经生成好的 configure,执行./configure -help 命令可以看到该脚本所支持的所有参数,其中大部分是其自带的。同样,我们可以通过对configure.in 的配置来给它添加新的参数。可以配置的参数种类有很多种,常用的有以下 2 种格式:-enable-xxx 和 -disable-xxx-with-xxx 和 -with-out-xxx可以分别通过以下 2 个宏来定义这两个参数:AC_ENABLE (feature, action-if-given, action-if-not-given)AC_ARG_WITH (package, help-string, action-if-given, action-if-not-given)这两种格式基本上可以互换,下面就以 AC_ARG_WITH()为例,说明如何给configure 加上一个自定义参数。假设我们要增加一个选项表示是否需要编译一个名为 agent 的模块,可以这样写:BUILD_AGENT=noAC_ARG_WITH(agent,AS_HELP_STRING(-with-agent,build agent(default is no),BUILD_AGENT=yes,BUILD_AGENT=no)if test “x$BUILD_AGENT“ = “xyes“;then #判断是否加上了该参数#做出相应动作fi这样 ./configure 就新添了两个选项-with-agent 和-with-out-agent,通过这两个选项可以控制变量 BUILD_AGENT 的值,然后做出相应的动作。4 Automake的应用使用 Automake生成 Makefile4.1 Makefile的用处 Makefile 基本上就是目标(target), 关联(dependencies) 和动作三者所组成的一系列规则。而 make 就是根据 Makefile 的规则决定如何编译 (compile) 和连接 (link) 程序或者其它动作。当然,Makefile 可做的不只是编译和连接程序,例如 FreeBSD 的 port collection 中,Makefile 还可以做到自动下载远程程序,解压缩 (extract),打补丁 (patch),设定,然后编译,安装到系统中。4.2 使用 Automake生成 Makefile的优势 Makefile 基本结构虽然很简单,但是妥善运用这些规则就可以变换出许多不同的花样。却也因为这样,许多人刚开始学写 Makefile 时会觉得没有规范可以遵循,每个人写出来的 Makefile 都不大一样,不知道从哪里下手,而且常常会受到开发环境的限制,只要环境参数不同或者路径更改,可能 Makefile 就得跟着修改。虽然有 GNU Makefile Conventions (GNU Makefile 惯例)制订出一些在进行 GNU 程序设计时写 Makefile 的一些标准和规范,但是其内容很长而且很复杂,并且经常作一些调整,为了减轻程序开发人员维护 Makefile 的负担,就出现了 Automake。利用 Automake,编程者只需要写一些预先定义好的宏 (macro),提交给Automake 处理,就会产生一个可以供 Autoconf 使用的 Makefile.in 文件。再配合使用 Autoconf 产生的自动配置文件 configure 即可产生

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论