我以前写过一个 10 分钟入门 Autotools 的文章,但是弄丢了,而且困于俗务,又好久没有敲打键盘,因此自己也都不会用 Autotools 了,便计划重新系统地学习一遍。这部教程打算作为学习的产物,以飨大众。计划完整涵盖 autotools 的常见用例,包括 m4, autoconf, automake, intltool, libtool 及多语言混合编程、单元测试,共 7 篇。
这个系列的撰写对我个人而言意义会更大,因为我会尝试在撰写中使用较多自由软件技术,点亮更多技能点。
在该系列中,我会力求阐明 GNU 构建系统的来龙去脉。我的机器使用 Debian Jessie 系统,autotools 各组件版本如下:
此外,该系列也会尽量从现代视角出发,争取不牵扯到无聊的历史细节中去,使知识可以立即转化为技能。
这部教程假定读者对 Linux 桌面编程有初步的认知,即会使用 C 语言、了解 C 语言程序和库的编译流程、会编写简单的 Makefile、知道程序国际化和本地化的流程和基本工具。
另外,这套教程建议读者先通读一遍,此后再按需查阅,因为其中的例子是随着行文逐渐发展的,如果不通读一遍可能不知道我在写什么。
如今,我们已经渐渐遗忘了历史上兵荒马乱的 UNIX 战国时代。在那个时代,各 UNIX 实现有不少出入,要编写可移植程序实属困难,故许多程序存在一个 configure 脚本生成进行一些预先配置。
而现在,我们几乎只需考虑 *BSD(含 Mac OS X)、Linux® 和 Microsoft® Windows®,而前两者又差别不大,因此现在 configure 脚本存在的意义已经不像以前那么大了。
熟悉 *NIX 系统的诸位,不可能对以下流程感到陌生:
./configure --prefix=/usr make sudo make install
那么,我们如何在自己的程序中用到这个呢?又如何对其进行定制,使之符合我们自己的心意呢?GNU 构建系统——Autotools 就是自动化该流程的一整套工具。
Autotools 包括以下工具:
另外,还有 autoscan 之类的小工具,因为用处不大,所以本教程不予使用。
我们将通过例子,一个一个考察这些工具。下面是一幅 Autotools 关系图:
(该图形由 GraphViz 绘制)
这个要列出来,真的还挺多的。
如果你是 GNOME 开发者,你应该知道,GNOME 的所有程序都是 Autotools 构建的,所有库都对 Autotools 有完善的支持,用起来非常方便。