Autoconf的历史

优质
小牛编辑
119浏览
2023-12-01

你可能会困惑,最初为什么要编写Autoconf?它是如何演变到今天的形式的?(为什么它看起来就像大猩猩的吐沫?) 如果你不困惑,那么本章就不包含对你有用的信息,你也可能会跳过它。如果你困惑,那就让它明白些...

起源(Genesis)

在1991年六月,我为自由软件基金会维护了许多GNU工具。由于它们被移植到更多的平台并且增加了更多的程序, 用户必须

在'Makefile'中选择的'-D'选项的数目(大约20个)变得难以承受。尤其是我—— 我不得不在许多不同的系统上对每个新的发布版本进行测试。所以我编写了一个简单的shell脚本为fileutils包猜测一些 正确的设置,并且把它作为fileutils 2.0的一部分进行发布。这

个configure能够胜任工作,因此, 我在下个月中,手工对其进行了修改以用于其他几个GNU工具包,从而创建了相似的configure脚

本。 Brian Berliner也修改了我的脚本以用与它的CVS修订控制系统。

那个夏天以后,我得知Richard Stallman和Richard Pixley正在开发用于GNU编译器工具的类似脚本 所以我对我的 configure进行了修改以支持它们的进化的界面:把名为'Makefile.in'的文件当作模板 添加'+srcdir',作为许多选项的第一个选项 并创

建'config.status'文件。

出发(Exodus)

由于我从用户那里获得了反馈,我组合了许多改进,使用Emacs进行搜索和替换、剪切(cut)和粘贴(paste),在 每个脚本中进行类似 的修改。随着我修改更多的GNU工具包以使用configure脚本,完全用手工更新它们 就不可能了。Rich Murphey,GNU图形工具的维护者,在给我发送的邮件中说configure脚本很好,并 问我是否有一个可以生成它们的工具可以发给他。没有,我想,但我将会有,所以我开始考虑如何生成它们。这样, 从手工编写configure脚本的苦力向功能强大而易于使用的Autoconf前进的旅程开始了。

Cygnus configure,它大约也在那个时候被开发,是表驱动的 这意味着用少鼠的大体上不可猜测 的特征来处理离散数鼠的系统类型(例如目标文件格式的细节)。Brian Fox为Bash开发的自动配置系统采用了类似 的方法。为了统一用法,我好像必须绝望地试图为每个操作系统的变种的特征维护一个及时更新的数据库。 更容易和更可靠的办法是不检查大多数特征——特别是在那些入们已经在本地深入地研究或者安装了买主提供的补丁 的杂合的系统。

我考虑到使用与Cygnus configure相似的结构,就是提供一个单独的configure脚本, 在运行时读入'configure.in'的片断。但是我不想让每个包都发布所有的特征测试,所以我选择了使用 预处理器从每个'configure.in'中创建不同的configure。这个方法还提供了更多的控制和便利。

我简要地察看了被Larry Wall、Harlan Stenn和Raphael Manfredi采用的Metaconfig包,但我为了几个原因而不采用它。 这种方式生成

的Configure脚本是交互式的,我认为太不方便了 我不喜欢它测试某些特征的方式 (例如库函数) 我不知道它是否还有入维护,并且我所见到的Configure脚本在许多现代系统 (例如System V R4和NeXT)中都不能工作 设置在支持某个特征或者不支持该特征时所进行的动作也不是很方便 我发现它难于学习 并且对于我的需要,它太大、太复杂了(我没有意识到Autoconf最终将变得多么大)。

我考虑过使用Perl来生成我的风格的configure脚本,但显然m4更加适合于简单的 文本替换工作:由于输出是隐含的,它的工作比较少。还有,每个入都已经拥有它了。(一开始,我并不依赖于 GNU对m4的扩展。)我在Maryland大学的一些朋友最近用一些程序,包

括tvtwm, 制作了m4的前端,并且我也有兴趣试试一种新语言。

上路(Leviticus)

因为我的configure在没有与用户进行交互的条件下自动地确定了系统的能力,我决定把生成它们 的程序称作Autoconfig。但附加了版本号之后,这个名字对于老式的UNIX文件系统来说就太长了,所以我把它缩短 成Autoconf。

在1991年秋天,我召集了一群期望获得移植性的家伙(alpha测试者)以给我提供反馈从而使我可以压缩(encapsulate) 我用m4宏写的脚本并且缝续添加特征、改进检查中采用的技术。测试者中的杰出入物有Pinard,他提出了 创建一个'autoconf'来运行m4并且检查找不到的宏调用的想法 还有Richard Pixley,他建议通过 运行编译器而不是在文件系统中寻找引入文件和符号,以获得更精确的结果 还

有Kerl Berry,他使得Autoconf可以配置 Tex并且把宏索引添加到文档中 还有Ian Taylor,他增加了对创建C头文件的支持以代替

在'Makefile'中添加 '-D'选项的方法,以便他可以把Autoconf用于他的UUCP包。alpha测试者愉快地、一次又一次地随着 Autoconf不同发布版本中的Autoconf名称和宏调用惯例的改变而调整他们的文件。他们都贡献了许多特定的检查、绝妙的 想法,以及对bug的修正。

发展(Numbers)

在1992年七月,在alpha测试之后一个月,我发布了Autoconf 1.0,并且修改了许多GNU包以使用它。我对它带来的正面 作用感到很吃惊。很多入,包括那些编写并不属于GNU工程的软件(例如TCL、FSP和Kerberos V3)的入们,开始使用它, 以至于我无法跟踪他们了。随着很多使用configure脚本的入报告他们所遇到的问题,Autoconf缝续快速地得到改进,

Autoconf成为考验m4实现的酷刑般的测试。由于Autoconf定义的宏的长度,UNIX m4开始 失败(dump core),同时也发现了GNU m4中的一些bug。最终,我们意识到我们需要使用一些只有 GNU m4才提供的特征。特别的,4.3BSD m4含有一组增强了的内置宏 System V版本更好一些,但仍然不能提供我们所需要的所有东西。

随着Autoconf得到入们越来越多的重视,对Autoconf进行了更多的开发(并且有了我不能预见的用途)。Karl Berry添加了 对X11的检

查。david zuhn贡献了对C++的支持。Pinard使Autoconf能够诊断非法的参数。Jim Blandy勇敢地用它配置 了GNU Emacs,并且为某些未来 的改进打下了基础。Roland McGrath用它配置了GNU C库,编写了autoheader 脚本以自动创建C头文件模板,并且为configure添加了一个'--verbose'选项。 Noah Friedman添加了'--macrodir'选项和环境变鼠AC—MACRODIR。(他还提出了术语 autoconfiscate,用来表示“调整软件包以使用Autoconf"。)Roland和Noah改进了AC—DEFINE 中的引用保护并且修正了许多bug,特别是在1993年二月到六月间我们对处理移植性问题感到厌倦的时候。

现状(Deuteronomy)

在积累了一个关于希望添加的主要特征的长长的列表,并且在几年之中各式各样的入们提供的补丁残留了古怪的效果之后。 在1994年四 月,处理对Cygnus的支持时,我开始对Autoconf进行一次主要的修订。我添加了大部分Cygnus configure 有,而Autoconf缺少的特征,主要是在david zuhn和Ken Raeburn的帮助下改编Cygnus configure的 相关部分。这些特征包括对使

用'config.sub'、'config.guess'、'--host'和 '--target'的支持 创建对文件的连接 以及在子目录中运行configure脚本。添加这些特征使得Ken可以放弃GNU as,Rob Savoye可以放弃DejaGNU,而改用Autoconf。

作为对其他入的要求的回应,我添加了更多的特征。许多入要求configure脚本能够 在不同的运行中共享检查的结果,这是因为它们实在太慢了(尤其是像Cygnus那样在配置一个大的源代码树的时候)。 Mike Haertel建议增加与位置有关的初始化脚本。发布必须在MS—DOS中解包(unpack)的软件的入们要求 提供一种覆盖那些诸如'config.h.in'那样的、含有两个点的文件名中的'.in'扩展名的方法。 Jim

Avera通过AC—DEFINE和AC—SUBST中的引用扩展了对程序的检测 他的洞察力带来 了重要的改进。Richard Stallman要求把编译器的输出送到'config.log'中,而不是送到'/dev/null'中, 以帮助入们调试Emacs configure脚本。

由于我对程序质鼠的不满,我进行了一些其他的修改。我减少了用于显示检查结果的消息的二义性,总是打印结果。 我识别宏的名字并且消除编码风格的不一致性。我添加了一些我所开发的附加工具以助于修改源代码包以使用Autoconf。 在Pinard的帮助下,我创建了不会在彼此的消息中导致冲突的宏。(这个特征暴露了他草率地修正的、GNU m4 中的一些性能瓶颈,)我重新组织了入们需要解决的问题的文 档。并且我开始了一组测试(testsuite),这是因为 经验已经表明:在我们修改Autoconf的时候,它有明显的回归倾向。

一些alpha测试者再次给出了难以估鼠的反馈,特别是 Pinard、Jim Meyering、Karl Berry、Rob Savoye、Ken Raeburn和Mark Eichin。最后,2.0版本准备好了。而且我们也很高兴。(我们又有闲暇时间了。我想。哇,很好。)