使用AutoMake轻松生成Makefile

来源:互联网 发布:精灵传说mac版 编辑:程序博客网 时间:2024/05/28 15:29

使用AutoMake轻松生成Makefile


许明彥01-7-25 下午 02:32:55


摘要:在 Unix 上写过程序的人一般都遇到过 Makefile,尤其是用 C 来开发程序的人。用 make来开发和编译程序的确很方便,可是要写出一个MakeFile就不那么简单了。偏偏介紹 Makefile 的文件不多,GNU Make那份印出来要几百页的文件,光看完 Overview 自己就快要先Over了,难怪许多人闻 Unix色变。本文将介绍如何利用 GNUAutoconf 及 Automake 这两套软件来帮助『自动』产生 Makefile 文件,并且让开发出来的的软件可以象 Apache,MySQL 和常見的 GNU 软件一样,只要会 ``./configure'', ``make'', ``make install''就可以把程序安裝到系统中。如果您有心开发 Open Source 的软件,或只是想在 Unix系統下写写程序。希望这份介绍文件能帮助您轻松的进入 Unix Programming 的殿堂。 1. 简介 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 即可产生一份符合符合 GNUMakefile 惯例的 Makeifle 了。 2. 上路之前 在开始使用 Automake 之前,首先确认你的系统安装有如下软件:   1. GNU Automake 2. GNU Autoconf 3. GNU m4 4. perl 5. GNU Libtool (如果你需要产生 shared library) 建议最好也使用 GNU C/C++ 编译器 、GNU Make 以及其它 GNU 的工具程序来作为开发的环境,这些工具都是属于 OpenSource Software 不但免费而且功能强大。如果你是使用 Red Hat Linux 可以找到所有上述软件的 rpm文件,FreeBSD 也有现成的 package 可以直接安装,或也可以自行下载这些软件的源代码回来安装。下面的示例是在Red HatLinux 5.2 + CLE2 的环境下所完成的。 3. 一个简单的例子 Automake 所产生的 Makefile 除了可以做到程式的编译和连接,也已经把如何产生程序文件 (如 manual page, info文件及 dvi 文件) 的动作,还有把源码文件包装起来以供发布都考虑进去了,所以程序源代码所存放的目录结构最好符合GNU的标准惯例,接下来就用一个hello.c 來做为例子。 在工作目录下建立一个新的子目录"devel"',再在 devel 下建立一个"hello"' 的子目录,这个目录将作为存放 hello这个程序及其相关文件的地方: % mkdir devel % cd devel % mkdir hello % cd hello 用编辑器写一个hello.c文件, #include int main(int argc, char** argv) { printf(``Hello, GNU!/n''); return 0; } 接下来就要用 Autoconf 及 Automake 來产生 Makefile 文件了, 1. 用 autoscan 产生一个 configure.in 的原型,执行autoscan 后会产生一个configure.scan 的文件,可以用它作为 configure.in文件的蓝本。   % autoscan % ls configure.scan hello.c 2. 编辑 configure.scan文件,如下所示,並且改名为configure.in dnl Process this file with autoconf to produce a configure script. AC_INIT(hello.c) AM_INIT_AUTOMAKE(hello, 1.0) dnl Checks for programs. AC_PROG_CC dnl Checks for libraries. dnl Checks for header files. dnl Checks for typedefs, structures, and compiler characteristics. dnl Checks for library functions. AC_OUTPUT(Makefile) 3. 执行 aclocal 和 autoconf ,分別会产生 aclocal.m4 及 configure 两个文件 % aclocal % autoconf % ls aclocal.m4 configure configure.in hello.c 4. 编辑 Makefile.am 文件,內容如下 AUTOMAKE_OPTIONS= foreign bin_PROGRAMS= hello hello_SOURCES= hello.c 5. 执行 automake --add-missing ,Automake 会根据Makefile.am 文件产生一些文件,包含最重要的 Makefile.in % automake --add-missing automake: configure.in: installing`./install-sh' automake: configure.in: installing `./mkinstalldirs'automake: configure.in: installing `./missing' 6. 最后执行 ./configure , % ./configure creating cache ./config.cache checking for a BSDcompatible install... /usr/bin/install -c checking whether buildenvironment is sane... yes checking whether make sets ${MAKE}... yeschecking for working aclocal... found checking for working autoconf...found checking for working automake... found checking for workingautoheader... found checking for working makeinfo... found checking forgcc... gcc checking whether the C compiler (gcc ) works... yes checkingwhether the C compiler (gcc ) is a cross-compiler... no checkingwhether we are using GNU C... yes checking whether gcc accepts -g...yes updating cache ./config.cache creating ./config.status creatingMakefile 現在你的目录下已经产生了一个 Makefile 檔,下個 ``make'' 指令就可以開始編譯 hello.c 成執行檔,執行 ./hello 和 GNU 打聲招呼吧! % make gcc -DPACKAGE=/"hello/" -DVERSION=/"1.0/" -I. -I. -g -O2 -c hello.c gcc -g -O2 -o hello hello.o % ./hello Hello! GNU! 你還可以試試 ``make clean'',''make install'',''make dist'' 看看會有什麼結果。你也可以把產生出來的 Makefile 秀給你的老闆,讓他從此對你刮目相看 :-) 4. 追根问底 上述产生Makefile 的过程和以往自行编写的方式非常不一樣,舍弃传统自定义make 的规则,使用 Automake只需用到一些已经定义好的宏就可以了。我们把宏及目标 (target)写在Makefile.am 文件内,Automake 读入Makefile.am 文件后会把这一串已经定义好的宏展开并产生相对应的 Makefile.in 文件,然后再由 configure这个shell script 根据 Makefile.in 产生合适的Makefile。

利用 autoconf 及 automake产生Makefile 的流程

上图表示在上一范例中要使用的文件档案及产生出来的文件,有星号 (*) 者代表可执行文件。在此示例中可由 Autoconf 及 Automake工具所产生的额外文件有configure.scan、aclocal.m4、configure、Makefile.in,需要自行加入设置的有configure.in及 Makefile.am。 4.1 编辑 configure.in 文件 Autoconf 是用来产生 'configure'文件的工具。'configure' 是一个 shellscript,它可以自动设定原始程序以符合各种不同平台上Unix 系统的特性,并且根据系统参数及环境产生合适的Makefile文件或C的头文件(header file),让原始程式可以很方便地在不同的平台上进行编译。Autoconf会读取 configure.in文件然后产生'configure' 这个 shell script。 configure.in 文件内容是一系列GNU m4 的宏,这些宏经autoconf处理后会变成检查系统特性的shell scripts。configure.in 内宏的顺序并没有特别的规定,但是每一个configure.in 文件必須在所有宏前加入 AC_INIT宏,然后在所有宏的最后加上 AC_OUTPUT宏。可先用 autoscan 扫描原始文件以产生一个 configure.scan 文件,再对configure.scan 做些修改成 configure.in 文件。在范例中所用到的宏如下: dnl 这个宏后面的字不会被处理,可以视为注释 AC_INIT(FILE) 该宏用来检查源代码所在路径,autoscan 会自动产生,一般无须修改它。 AM_INIT_AUTOMAKE(PACKAGE,VERSION) 这个是使用 Automake 所必备的宏,PACKAGE 是所要产生软件套件的名称,VERSION 是版本编号。 AC_PROG_CC 检查系统可用的C编译器,若源代码是用C写的就需要这个宏。 AC_OUTPUT(FILE) 设置 configure 所要产生的文件,若是Makefile ,configure 便会把它检查出来的结果带入 Makefile.in 文件后产生合适的 Makefile。 实际上,这里使用 Automake 时,还需要一些其他的宏,这些额外的宏我们用 aclocal来帮助产生。執行aclocal会产生aclocal.m4 文件,如果无特别的用途,可以不需要修改它,用 aclocal 所产生的宏会告诉Automake如何动作。 有了 configure.in 及 aclocal.m4两个文件以后,便可以执行 autoconf来产生 configure 文件了。 4.2 编辑Makefile.am 文件 接下来要编辑Makefile.am 文件,Automake 会根据 configure.in 中的宏把Makefile.am 转成 Makefile.in 文件。 Makefile.am 文件定义所要产生的目标: AUTOMAKE_OPTIONS 设置 automake 的选项。Automake 主要是帮助开发 GNU 软件的人员来维护软件,所以在执行 automake时,会检查目录下是否存在标准 GNU 软件中应具备的文件,例如 'NEWS'、'AUTHOR'、'ChangeLog' 等文件。设置foreign 时,automake 会改用一般软件的标准来检查。 bin_PROGRAMS 定义要产生的执行文件名。如果要产生多个执行文件,每个文件名用空白符隔开。 hello_SOURCES 定义 'hello' 这个执行程序所需要的原始文件。如果'hello'这个程序是由多个原始文件所产生,必須把它所用到的所有原始文件都列出来,以空白符隔开。假设 'hello' 还需要'hello.c'、'main.c'、'hello.h' 三个文件的话,则定义 hello_SOURCES= hello.c main.c hello.h 如果定义多个执行文件,则对每个执行程序都要定义相对的filename_SOURCES。 编辑好 Makefile.am 文件,就可以用 automake --add-missing来产生 Makefile.in。加上--add-missing 选项来告诉 automake顺便假如包装一个软件所必须的文件。Automake产生生出來的 Makefile.in文件是完全符合 GNU Makefile 的惯例,只要执行 configure这个shell script 便可以产生合适的 Makefile文件了。 4.3 使用 Makefile 利用 configure 所产生的 Makefile文件有几个预先设定的目标可供使用,这里只用几个简述如下: make all 产生设定的目标,既次范例中的执行文件。只敲入make 也可以,此时会开始编译源代码,然后连接并产生执行文件。 make clean 清除之前所编译的执行文件及目标文件(object file, *.o)。 make distclean 除了清除执行文件和目的文件以外,也把 configure 所产生的 Makefile 清除掉。 make install 將程序安装到系统中,若源码编译成功,且执行结果正确,便可以把程序安装到系统预先设定的执行文件存放路径中,若用 bin_PROGRAMS 宏的话,程序会被安装到 /usr/local/bin下。 make dist 將程序和相关的文档包装为一个压缩文档以供发布 (distribution)。执行完在目录下会产生一个以PACKAGE-VERSION.tar.gz 为名称的文件。PACKAGE 和 VERSION 这两个参数是根据configure.in 文件中 AM_INIT_AUTOMAKE(PACKAGE, VERSION) 的定义。在此范例中会产生'hello-1.0.tar.gz' 的文件。 make distcheck 和 make dist 类似,但是加入检查包装以后的压缩文件是否正常,这个目标除了把程序和相关文档包装成 tar.gz文件外,还会自动把这个压缩文件解开,执行 configure,并执行 make all ,确认编译无错误以后,户显示这个 tar.gz文件已经准备好可以发布了。这个检查非常有用,检查过关的套件,基本上可以给任何具备 GNU 开发环境的人去重新编译成功。就hello-1.tar.gz 这个范例而言,除了在Red Hat Linux 上,在 FreeBSD 2.2.x 也可以正确编译。 要注意的是,利用 Autoconf 及 Automake 所产生出來的软件套件是可以在没有安装 Autoconf 及 Automake的环境使用的,因为 configure 是一个 shell script,它己被设计为可以在一般 Unix 的 sh 这个 shell下执行。但是如果要修改 configure.in 及 Makefile.am 文件再产生新的 configure 及 Makefile.in文件时就一定要有 Autoconf 及 Automake 了。 5. 相关资料 Autoconf 和 Automake 功能十分强大,可以从它们附带的 info 稳当4中找到详细的使用方法说明。你也可以从许多现有的GNU软件或 Open Source 软件中找到相关的 configure.in 或 Makefile.am 文件,他们是学习 Autoconf 及Automake 更多技巧的最佳范例。这个简介只用到了 Autoconf 及 Automake 的皮毛罢了,如果你有心加入 Open Source软件开发的行列,希望这篇文章可以帮助你对产生 Makefile 有个简单的了解。其它有关开发 GNU 程式或 C 程序设计及 Makefile的详细运用及技巧,建议从 GNU Coding Standards (GNU 编码规定) 读起,里面包含了 GNU Makefile惯例,及开发 GNU 软件的标准程序和惯例。这些 GNU 软件的在线说明文件可以在 http://www.gnu.org/ 上找到。 6. 结束语 利用 Autoconf 及 Automake,产生一个 Makefile 似乎不再象以前那么困难了,而使用 Autoconf也使得我们在不同平台上或各家 Unix 之间发布及便宜程序变的简单,这对于在Unix 系统上程序开发员来说减轻了许多负担。妥善运用这些 GNU的工具软件,可以帮助我们更容易的去开发程序,而且更容易维护源代码。
(网页编辑:风之翼) 相关文章
  • 如何集成Linux/Apache/PHP4/FastCGI/Oracle/MySQL环境
  • 如何编写Linux下的客户机/服务器软件
  • 让数据库安居到Linux上
  • Oracle Database 9i 在Linux 下的安装
  • MySQL在Red Hat 7.0上的BDB表配置