前言
本文根据《Autotools - A Practioner's Guide to GNU Autoconf, Automake, and Libtool》第一章翻译整理,省略了部分语句。
正文
正如序言里所讲,GNU Autotools的目的是使得最终用户的生活变得简单,而不是维护者的。虽然如此,从长远来看,作为一个工程管理者,使用Autotools会使你的工作变得简单,尽管可能不是你所怀疑的理由。Autotools框架尽可能简单,给出它所提供的功能。Autotools的真正目的是双重的:它为你的用户服务,并且使你的工程令人难以置信地可移植---甚至在你从没测试过,安装过或构建过你的代码的系统上。
在这本书中,我会经常使用词语Autotools的,虽然你在GNU归档中找不到使用这个词的软件包。我用这个词表示下列三个GNU包,它们被社区认为是GNU编译系统中的一部分
> Autoconf: 用于为工程产生配置脚本;
>Automake: 用于简化创建一致性和功能性Makefile的过程;
>Libtools: 用于为共享库的可移植创建提供一个抽象;
其它构建工具,例如开源源码包CMake和SCons,尝试提供与Autotools相同功能的但是以一个更加用户友善的方式。但是,这些工具试图躲在图形用户界面和脚本构建者之后的功能,实际上最终使它们的功能变得较弱。
谁应该使用Autotools如果你正在写目标机是Unix或Linux的开源软件,你应该绝对正使用GNU Autotools。即使是你在为Unix或Linux写专有软件,你将会极大地受益于它们。Autotools会提供你一个构建环境,允许你的工程成功地在你将来的版本或分支构建,使用几乎没有改变的构建脚本。这是有用的,甚至你只是打算针对单一的Linux发行版,因为,说实话,你真的无法提前知道你的公司将来是否会希望你的软件运行在其它平台上。
语言的选择在决定是否使用Autotools,你编程语言的选择是另一个重要的因素。记住Autotools由GNU设计用于管理GNU工程。在GNU社区,有两个因素决定一种计算机编程语言的重要性:
>有没有GNU包用这个语言编写
>GNU编译工具集是否支持这个语言
基于这两个标准,Autotools为下列语言提供原生支持(由原生支持,我的意思是Autotools会在这些语言中编译,链接,和运行源码级特性检查):
>C
>C++
>Objective C
>Fortran
>Fortran 77
>Erlang
因此,如果你想构建一个Java包,你可以配置Automake来这么做(如我们在第8和第9章所见),但你不能要求Autoconf来编译,链接,或运行基于Java的检查,因为Autoconf根本就不原生地支持Java。然而,你可以找到Autoconf宏(在后续章节中,我将更为详细地涉及)来提升Autoconf的能力,以管理用Java写的工程的配置过程。
开源软件开发者正积极地在gcj编译器和工具集方面进行工作,因此一些原生Java支持可能最终会被添加到Autoconf。但是截至到编写这本书时,gcj仍然有些不成熟,目前很少有GNU包用Java编写,因此问题对于GNU社区来讲仍然不是至关重要。
生成你的软件包编译系统GNU Autotools框架包括三个主要的包:Autoconf,Automake,和Libtool。这些包中的工具可以产生依赖于实用软件的代码和来自gettext,m4,sed,make,和perl等其它包的功能。
对于Autotools,区分维护者的系统和最终用户的系统是重要的。Autotools的设计目的指明,一个Autotools产生的编译系统,应该紧紧依赖现成的并预先安装在最终用户机器上的工具。例如,维护者使用的机器创建一个分支需要Perl解释器,但是一个最终用户运行的机器从发行分支包构建产品并不需要Perl。
一个必然的结果是,最终用户的机器不需要安装Autotools,一个最终用户的系统只需要一个合理的符合POSIX标准版本的make和Bourne shell的一些变种,以执行产生的配置脚本。当然,任何包也会需要编译器,链接器,和其它被项目维护者认为必要的工具来讲原代码文件转换成可执行二进制程序,帮助文件和其它运行时资源。
如果你曾经下载,构建和安装来自tarball(一种以.tar.gz, .tgz, .tar.bz2或其它扩展的压缩归档文件)的软件,毫无疑问你知道整体的过程。它通常看上去像这样:
$ gzip -cd hackers-delight-1.0.tar.gz | tar xvf -...$ cd hackers-delight-1.0$ ./configure see the source for copying conditions. There is NOwarranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.$注意:如果你已在系统上安装了Autotools软件包的Linux发布版本,可执行文件可能会在/usr/bin中发现,而不是/usr/local/bin。如果你选择下载,构建和安装来自GNU网站的这些软件包的最新版本,你必须为它们做相同的事,因为automake和libtool软件包安装宏到Autoconf的宏目录中。如果你还没有安装Autotools,你可以使用下列命令安装来自GNU发布版软件源档案的它们。(如有必要,确保修改版本号)
$ mkdir autotools && cd autotools$ wget -q ftp://ftp.gnu.org/gnu/autoconf/autoconf-2.65.tar.gz$ gzip -cd autoconf* | tar xf -$ cd autoconf*$ ./configure && make all check...$ suPassword: ******# make install...# exit$ cd ..$$ wget -q ftp://ftp.gnu.org/gnu/automake/automake-1.11.tar.gz$ gzip -cd automake* | tar xf -$ cd automake*$ ./configure && make all check...$ suPassword: ******# make install# exit$ cd ..$$ wget -q ftp://ftp.gnu.org/gnu/libtool/libtool-2.2.6b.tar.gz$ gzip -cd libtool* | tar xf -$ cd libtool*$ ./configure && make all check...$ suPassword: ******# make install...# exit$ cd ..$ 现在你可以成功地执行来自前一样例的版本检查命令。总结在这章中,我们已阐述了Autotools的高层概要,来给你一个每个事物是如何联系在一起的感觉。我也已给你展示了当你构建由Autotools编译系统创建的发布版本的软件时,可遵循的方法。最后,我已讲明如何安装Autotools,如何知道你已安装的版本。
在第二章中,我们会短暂地远离Autotools,开始为一个称为Jupiter的玩具工程创建一个手工编码的编译系统。你会学习一个合理的编译系统的需求,并且你会熟悉Autotools原始设计之后的解释。有了这个背景知识,你会开始明白Autotools所做事情的缘由。我真的无法足够去强调:第2章是本书最重要的章节之一。