开始使用Autoconf和Automake解决Unix的进化问题。
随着Unix向不同的方向发展,想要可移植代码的开发人员倾向于编写如下代码:
#if RUNNING_ON_BSD
Set things up in the BSD way
#if RUNNING_ON_SYSTEMV
Set things up in the SystemV way
#endif
由于Unix被分叉到不同的实现中(BSD,SystemV,许多供应商分支以及后来的Linux和其他类似Unix的系统),对于希望编写可移植代码以编写不依赖于特定操作系统品牌的代码的开发人员而言,变得非常重要。 ,但适用于操作系统公开的功能。这一点很重要,因为Unix版本会引入新功能,例如“发送”系统调用,后来其他操作系统会采用它。开发人员开始使用功能进行探测,而不是使用大量的代码来检查品牌和版本,因此代码变为:
#if HAVE_SEND
Use Send here
#else
Use something else
#endif
上世纪90年代有针对性的开发人员可以使用大多数自述文件来编译源代码,以编辑config.h文件并注释掉系统上可用的适当功能,或者将为经过测试的每种操作系统配置提供标准的config.h文件。
这个过程既麻烦又容易出错,这就是Autoconf的发展过程。您应该将Autoconf视为由具有特殊宏的Shell命令组成的语言,该语言能够用探测操作系统功能的工具代替config.h的人工编辑过程。
通常,您将在文件configure.ac中编写探测代码,然后运行autoconf命令,该命令会将此文件编译为您所看到的可执行configure命令。
因此,在运行时,./configure && make
您正在探索系统上可用的功能,然后使用检测到的配置来构建可执行文件。
当开放源代码项目开始使用源代码控制系统时,检入configure.ac文件是有意义的,但检入编译(configure)的结果却没有。autogen.sh只是一个小的脚本,它为您使用正确的命令参数调用autoconf编译器。
-
Automake也源自社区中的现有实践。GNU项目标准化了Makefile的常规目标集:
make all
将建立该项目
make clean
将从项目中删除所有编译的文件
make install
会安装软件
- 这样的事情,
make dist
并make distcheck
会为分发做准备,并验证结果是否是完整的源代码包
- 等等...
构建兼容的makefile变得很繁重,因为有很多重复的样板。因此,Automake是一个新的编译器,与autoconf集成,并将“源” Makefile(名为Makefile.am)处理为Makefile,然后可以将其馈送到Autoconf。
automake / autoconf工具链实际上使用了许多其他辅助工具,并且通过其他组件来扩展它们来完成其他特定任务。随着按顺序运行这些命令的复杂性增加,就需要立即运行的脚本,这就是autogen.sh的来历。
据我所知,Gnome是一个引入了此帮助脚本autogen.sh的项目。