一、使用说明
使用automake工具编写符合*软件惯例的Makefile,这样就可以象常见的GNU程序一样,只要使用“./configure”,“make”,“make install”就可以把程序安装到Linux系统中去了。不过,在此之前,需要先确认所在编译机器是否已经安装了autotools系列工具。可以通过which命令查看:
aclocal
autoscan
autoconf
autoheader
automake
libtoolize
如果机器上尚未安装这些工具,需要手动安装。
接下来,以实际应用介绍如何使用autoconf、automake等编译出所需要的可执行程序。
首先,例子的目录结构如下:
Client (程序目录)
base(子目录)
proto(子目录)
client(子目录)
server(子目录)
各层子目录下分别存放需要的代码文件。
需要在各层子目录下建立Makefile.am文件,列出需要编译的文件。以base子目录为例:
之后,在主目录下执行autoscan命令,执行完之后会生成一个configure.scan的文件。将configure.scan重命名为configure.ac,然后编辑此文件:
保存之后,执行aclocal和autoconf,会产生aclocal.m4和configure两个文件。
在主目录下新建Makefile.am文件,定义相关的编译规则:
执行libtoolize -f 和 automake -a, automake根据Makefile.am产生Makefile.in。
之后,执行./configure生成Makefile文件。
最后,执行make即可进行程序编译,生成最终需要的可执行程序。
二、深入理解
1. autoscan: 用来扫描源代码目录生成configure.scan文件,autoscan可以以目录名作为参数,扫描指定目录下的源文件。configure.scan包含了系统配置的基本选项,文件中都是一些宏定义,需要将此文件重命名为:configure.ac (configure.in).
2. aclocal: 一个perl脚本程序,aclocal根据configure.ac的内容自动生成aclocal.m4文件。
3. autoconf: 用来生成configure文件。configure能设置源程序来适应各种不同操作系统平台,且根据不同系统产生合适的Makefile,从而使源代码可在不同操作系统上编译。
configure.ac中是一些宏,这些宏经过autoconf处理后会变成检查系统特性、环境变量、软件必须的参数的shell脚本。宏的顺序并没有规定,但是必须在所有宏的最前面和最后面分别加上AC_INIT宏和AC_OUTPUT宏。
AC_INIT(FILE) 这个宏用来检查源代码所在的路径.
AM_INIT_AUTOMAKE(PACKAGE, VERSION) 这个宏是必须的 ,它描述了我们将要生成的软件包的 字及其版本号:PACKAGE是软件包的名字,VERSION是 版本号.当你使用make dist命令时,它会给你生成一个类似helloworld-1.0.tar.gz的 软件发行包,其中就有对应的 软件包的 名字和版本号.
AC_PROG_CC 这个宏将检查系统所用的 C编译器.
AC_OUTPUT(FILE) 这个宏是 我们要输出的 Makefile的名字。我们在使用automake时,实际上还需要用到其他的 一些宏,但我们可以用aclocal 来帮我们自动产生.执行aclocal后我们会得到aclocal.m4文件。产生了configure.in和aclocal.m4 两个宏文件后,我们就可以使用autoconf来产生configure文件了.
4. Makefile.am是用来生成Makefile.in的 ,需要你手工书写。Makefile.am中定义了一些内容:
AUTOMAKE_OPTIONS 这个是 automake的 选项.在 执行automake时,它会检查目录下是否存 标准GNU软件包中应具备的各种文件,例如AUTHORS.ChangeLog.NEWS等文件。我们将其设置成foreign时,automake会改用一般软件包的 标准来检查.
bin_PROGRAMS 这个是 指定我们所要产生的 可执行文件的 文件名.如果你要产生多个可执行文件,那么在各个名字间用空格隔开.
helloworld_SOURCES 这个是 指定产生"helloworld"时所需要的 源代码.如果它用到了多个源文件,那么请使用空格符号将它们隔开.比如需要helloworld.h,helloworld.c那么请写成:
helloworld_SOURCES= helloworld.h helloworld.c.
如果你在 bin_PROGRAMS定义了多个可执行文件,则对应每个可执行文件都要定义相对的filename_SOURCES.
5. 我们使用automake --add-missing来产生Makefile.in.项--add-missing的 定义是 "add missing standard files to package",它会让automake加入一个标准的 软件包所必须的 一些文件.我们用automake产生出来的 Makefile.in文件是 符合GNU Makefile惯例的 ,接下来我们只要执行configure这个shell 脚本就可以产生合适的 Makefile 文件了。
在符合GNU Makefiel惯例的 Makefile中,包含了一些基本的 预先定义的 操作:
make 根据Makefile编译源代码,连接,生成目标文件,可执行文件.
make clean 清除上次的 make命令所产生的 object文件(后缀为".o"的 文件)及可执行文件.
make install 将编译成功的 可执行文件安装到系统目录中,一般为/usr/local/bin目录.
make dist 产生发布软件包文件(即distribution package).这个命令将会将可执行文件及相关文件打包成一个tar.gz压缩的 文件用来作为发布软件的 软件包.它会在 当前目录下生成一个名字类似"PACKAGE-VERSION.tar.gz"的 文件.PACKAGE和VERSION,是 我们在 configure.in中定义的 AM_INIT_AUTOMAKE(PACKAGE, VERSION)。
make distcheck生成发布软件包并对其进行测试检查,以确定发布包的正确性.