有很多使用autotools的程序,每个有复杂的输入集合。输入文件发生改变时,用适当的顺序运行适当的程序是重要的。不幸的是同时记住依赖关系和顺序是困难的。
例如,无论你任何时候编辑configure.in,你必须重新运行aclocal,即使是你加一个引用到一个新宏。你也必须通过运行autoconf重建configure;config.h通过运行autoheader重建,即使你加一个新的AC_DEFINE;或者automake增加一个新的AC_SUBSTs到makefile.in的变量。如果你编辑一个makefile.am文件,你必须重新运行automake。在这两种情况下,你必须重新运行config.status,如果configure被改变,需要重新检查,然后运行config.status重新创建makefile。
用创建系统开发你的项目的时候,依赖关系很快变得令人烦恼。当然,automake知道怎样自动地处理这些。一般,automake产生一个makefile.in文件,这个文件定义了各部分的依赖关系,并以适当的顺序自动运行各种必要的工具。这一切都假设所用到的工具的版本都是正确的。
autotool程序有一个脚本准备做这些,你生成一个makefle之前或你从代码库获取新的代码时,它将用正确的顺序自动地运行各种工具。对于怎样做这个,至少有两种方法-autogen.sh和bootstrap:
autogen.sh
从开始,这就是一个不好的名字对于bootstrap脚本,因为GNU已经有一个自动的文本生成工具叫AutoGen.bootstrap运行过后,通常安装包会有脚本自动运行生成configure脚本,以autogen.sh作为参数传递给configure。除非你不知道你想要什么选项,直到configure脚本生成为止,你不能运行configure --help。如果你发现自己编译的项目用这种方式建立,我建议你输入:
$ /bin/sh ./autogen.sh --help
忽略假的warning提示,那只是告诉你conigure将被执行。
bootstrap
越来越多地,许多项目通过调用它们的bootstrap脚本启动。启动脚本简单地运行各种各样的必须的命令,使源代码处于可安装的状态,最终用户能简单地运行:
$ configure
$ make
$ make install
不幸的是很多人没有在他们的发布包里放置bootstrap脚本。因此除了开发者机器的创建环境发生改变的时候,这个脚本不是必须的。这意味着autogen.sh的使用者可能从来没有看到其他方法的优点。
Autoconf带有一个和bootstrap脚本具有同样功能的程序叫做autoreconf。因为autoreconf很少被使用,从来也不有名,仅仅在autoconf2.13版本里和automake一起使用。甚至autoconf2.13版本的autoreconf也不处理动态库和automake相关的选项。
直到autoreconf出现之前,我们推荐bootstrap方法。在写这本书的时候,我们所使用的bootstrap是一个还没有被标准化的版本:
#! /bin/sh
aclocal \
&& automake --gnu --add-missing \
&& autoconf
在这里我们不使用autoreconf,因为它不能处理我们想要的`--add-missing'选项。一个典型的bootstrap可能也运行libtoolize或者autoheader。
所有工具的版本的正确性对于开发者来说是很重要的,这样能够避免由于版本疏忽导致的许多问题。在工作中版本不一致是很值得注意的问题。因此automake默认地提供了一个机制避免这些问题,当开发者知道他们的环境是正确设置的时候,用户可以激活它们。
为了能够使用这个方法,你首先必须添加AM_MAINTAINER_MODE到`configure.in'.这将添加`--enable-maintainer-mode'选项到configure;当指定这个选项的时候将导致“维护者规则”被激活。
注意,维护者方式是一个有争议的属性。有些人喜欢使用它是因为在某些情况下它导致较少的错误报告。例如,cvs不保存文件的相对时间戳。如果你的项目同时有configure.in和configure两个文件,而且没有使用维护者模式,那么有时make将需要重新生成configure,即使这不是必须的。这会给开发者带来更多的麻烦--在一个大的项目里,有很多开发者不想接触configure.in,甚至很多人不想安装GNU Autotools.
还有一些人认为最终用户应该使用和开发者一样的创建系统,维护者模式是不推荐的,而且维护者模式是不安全的--你很容易地忘记自己使用的是什么,忘记重建,忽略正确的测试,一个改变或者重建系统。在非维护者模式下,使用一个不存在的维护者工具时automake的missing脚本将会发出一个警告给用户。
你采用的方法取决于项目的参与者的情况。