原文地址:Advanced GTK Techniques。
在这个教程中,你将学习如何创建一个空的
Autotools编译系统。这是《如何开始一个真正的 GTK 项目》的第一章节。
首先,我们创建一个名为 app-skeleton1 的目录。在这个目录中再创建名为 Makefile.am 的空文件(可以在终端中使用 touch Makefile.am 命令),这是一个 Automake 文件,我们将在稍后在这里输入如何将代码转换成程序的指令。现在,我们需要使用 Autoconf 配置我们的项目。
在当前用目录下新建一个 configure.ac 文件,它是 Autoconf 的配置文件,定义了在编译工程时需要使用哪些工具。我们也需要在这里定义系统环境需求,这样 Autotools 可以检测系统是否满足要求。在 configure.ac 中,我们输入:
AC_INIT([App Skeleton], [1], [philip.chimento@gmail.com])
AM_INIT_AUTOMAKE([-Wall foreign])
AC_CONFIG_FILES([Makefile])
AC_OUTPUT
这个文件中包含了可以被 Autoconf 扩展成脚本的各种宏。以 AC_ 开头的是 Autoconf 自己的宏,以 AM_ 开头的则属于 Automake。宏的参数列表被包含在一对圆括号中,每个参数还被包含在一对方括号内。方括号在这里表示“引用”,在 Autoconf 的手册中有关于它的详尽介绍,我们只需要记住一点:每个参数都要用方括号括起来。接下来我们一个一个介绍这些宏。
-
AC_INIT
这是
Autoconf的初始化宏,定义工程的名称和版本号。第三个参数为可选参数,是反馈 bug 的邮箱地址,你可以把它换成你自己的邮箱,不过这个示例程序的 bug 还是发到我的邮箱比较好。 -
AM_INIT_AUTOMAKE
这个宏告诉
Autoconf我们将使用Automake工具(是的,我们是可以只用部分Autotools工具的)。这个宏也负责对Automake进行初始化配置。-Wall和foreign是Automake的选项,它们并不是分开的两个参数,所有的选项应当用空格分隔,然后包含到一个方括号中。-Wall表示Automake工具将要求编译器输出编译过程中遇到的所有警告,这与很多 C 编译器的-Wall参数相似。foreign表示Automake不遵循 GNU 标准构建工程,所以它会忽略诸如缺少README文件之类的问题。如果你要构建一个正式的应用,以可能需要移除这个选项,然后添加一些便于用户了解应用的文件。译者注:移除
foreign表示我们须按照 GNU 标准生成一些文件,主要包括项目根目录下的NEWS、AUTHOR、README和ChangeLog,可以用touch NEWS AUTHOR README ChangeLog命令来完成。 -
AC_CONFIG_FILES
在这个宏中我们列出执行配置工程(
configure)操作后需要输出的文件。假如我们在列表中添加了名为plerp的文件,那么Autoconf就会去查找名为plerp.in的文件,然后将它转换成plerp。这项工作实质上是将plerp.in中所有@VARIABLE@位置替换成变量VARIABLE的内容。到目前为止,我们还未亲自设定任何变量,不过已经有了一些由Autoconf和Automake内部定义的变量。我们在这个宏中告诉
Autoconf需要将Makefile.in转换成Makefile,那么Makefile.in又在哪里呢?答案是当我们运行Automake时,它将把Automake.am转换成Automake.in。我们将在下一步完成这个工作。 -
AC_OUTPUT
这个宏用于使
Autoconf生成上述所有文件。
我们现在需要“引导(bootstrap)”程序(即将项目从混沌状态初始化至编译系统可工作的状态)。Autoreconf 程序会帮我们完成这项工作,它会运行包括 Autoconf、Automake 在内的诸多程序,为项目配置好编译环境。在终端中输入:
autoreconf -i
configure.ac:2: installing `./install.sh'
configure.ac:2: installing `./missing'
终端中会打印出被创建的文件的信息(这项安装工作是由 -i 选项完成的,如果这些文件已经被创建,那么我们只需输入 autoreconf 即可)。不过,当我们浏览目录时会发现,新增的文件不仅仅是终端提到的几个,Makefile.in、aclocal.m4、configure 以及一个 autom4te.cache 都会在执行命令时被创建。
关于引导
其实,如果有人想从这里开始自行编译你的程序,他/她已经用不到
Autoconf或者Automake了 ——shell和Make足矣。一个可供分发的源码包通常都配备了编译过程所需的各种文件,你不需要再被Autotools搞得痛不欲生。但如果项目源代码是从仓库中获取的,它就有可能还未被引导,这是因为维护者通常假定我们这些屌炸天的开发者们为了应对五花八门的开发环境已经在自己的电脑上安装了众多的编译工具。如果你下载的源代码符合这种情况,可以尝试用autoreconf -i自行引导。有时候项目会提供一个名为autogen.sh或bootstrap的文件帮助我们完成这项工作 —— 尤其是引导过程中需要完成一些额外工作时。如果存在这些文件,直接运行它就好了。
现在编译系统已经初始化完毕,我们可以开始常规的编译过程:
./configure
checking for a BSD-compatible install... /usr/bin/install -c
checking whether build environment is sane... yes
checking for a thread-safe mkdir -p... /bin/mkdir -p
checking for gawk... gawk
checking whether make sets $(MAKE)... yes
configure: creating ./config.status
config.status: creating Makefile
make
make: Nothing to be done for `all'.
当然 make 目前无事可做。我们没有代码文件,Makefile.am 也是空的。不过,如果你查看生成的 Makefile 文件,它却并非一无所有:我的系统报告它有 14 KB。虽然我们的项目还未正式开始,我们已经有了一个灵活的编译系统。
为了展示系统的灵活性,我们输入 make dist,当前目录就会出现一个名为 app-skeleton-1.tar.gz 的文件。这是个源代码的 tarball 归档文件,可用于分发。即使用户的设备中没有 Autotools 也可以下载这个包进行编译,因为他们需要的是 configure 和 Makefile 文件,这些已经预先打包了。
我们还可以做些别的事情,比如清理项目的目录。如果想查阅全部 make target 指令的话,可以去看看 Make manual。