5.3 自动生成Makefile
5.3.1 自动生成Makefile的意义和相关工具
在实际的项目中,由于make规则的复杂性和不确定性,自己编写Makefile是一件费时费力的事情。Makefile本身具有一定的相似性,因此利用GNU autoconf及automake这两套工具可以协助我们自动产生Makefile文件,并且让开发出来的软件可以像大多数源代码包那样,只需运行命令"./configure"、"make"、"make install"就可以把程序安装到系统中,对于各种源代码包的分发和兼容性具有很好的效果。
1.autoconf工具介绍
autoconf是一个用于产生可以自动配置源代码包,生成Shell脚本的工具,它可以适应各种类UNIX系统的需要。autoconf产生的配置脚本在运行时独立于autoconf,也就是说使用这些脚本的用户不需要安装autoconf。
autoconf生成的配置脚本通常名称是configure,得到这个文件,通常需要以下的依赖文件:
configure.in文件:生成configure的必需文件,需要手动编写。
aclocal.m4和acsite.m4文件:在编写了除autoconf提供的测试外的其他测试补充的时候,才会用到这两个文件,也需要手动编写。
acconfig.h文件:如果使用了含有#define指令的头文件,则需要自行编写该文件,一般都需要使用,这个时候会生成另外一个config.h.in文件,这个文件需要和软件包一同发布。
总之,在autoconf运行完毕后,得到两个需要和软件包同时发布的文件: configure和config.h.in,当然config.h.in可以不存在。
2.automake工具介绍
automake是一个从文件Makefile.am自动生成Makefile.in的工具。每个Makefile.am基本上是一系列make的宏定义(make规则也会偶尔出现)。生成的Makefile.in也服从GNU Makefile标准。
典型的automake输入文件是一系列简单的宏定义。处理所有相关的文件并创建Makefile.in文件。在一个项目的每个目录中通常仅包含一个Makefile.am。
目前automake支持三种目录层次:平坦模式(flat)、混合模式(shallow)和深层模式(deep)。
(1)平坦模式指的是所有文件都位于同一个目录中。就是所有源文件、头文件及其他库文件都位于当前目录中,且没有子目录。
(2)混合模式指的是主要的源代码都存储在顶层目录,其他各个部分则存储在子目录中。也就是主要源文件在当前目录中,而其他一些实现各部分功能的源文件位于各自不同的目录。
(3)深层模式指的是所有源代码都被存储在子目录中;顶层目录主要包含配置信息。也就是所有源文件及程序员自己写的头文件都位于当前目录的一个子目录中,而当前目录里没有任何源文件。
在这三种支持的目录层次中,平坦模式类型是最简单的,深层模式类型是最复杂的。但是这些模式使用autoconf和automake所遵循的基本原则和流程是一样的。
3.其他工具介绍
(1)autoheader:能够产生供configure脚本使用的C #define语句模板文件。
(2)autom4te:对文件执行 GNU M4。
(3)autoreconf:如果有多个autoconf产生的配置文件,autoreconf可以保存一些相似的工作,它通过重复运行autoconf(以及在合适的地方运行autoheader)以重新产生autoconf配置脚本和配置头模板,这些文件保存在以当前目录为根的目录树中。
(4)autoscan:该程序可以用来为软件包创建configure.in文件。autoscan在以命令行参数中指定的目录为根(如果未给定参数,则以当前目录为根)的目录树中检查源文件。为软件包创建一个configure.scan文件,该文件就是configure.in的前身。
(5)autoupdate:该程序的作用是转换configure.in,从而使用新的宏名。