GNU autotools自动生成Makefile 介绍
一、目的
使用autotools工具来帮助我们自动地生成符合自由软件惯例的makefile(这样就可以像常见的GNU程序一样,只要使用“./configure”, “make”, “make install” 就可以把程序安装到linux系统中去了)
GNU的软件风格的编译安装步骤:
# ./configure 侦测系统的环境,确定软件安装目录,生成Makefile
(用户执行configure时可以通过它的命令行参数指定自己所需的编译选项
例如:安装目录通过--prefix= PREFIX设置,缺省情况下PREFIX为/usr/local
默认安装时,执行文件安装到/usr/local/bin目录;
库安装到/usr/local/lib目录;
数据文件安装到/usr/local/share目录)
# make 调用系统中的编译器进行编译和连接
# make install 将软件安装到设定的目录
二、GNU autotools
1、主要包括三个软件: autoconf ,automake,libtool。
很多linux发行版都会默认安装这几个工具,软件包是通过pkgsrc,他们在pkgsrc目录为devel/autoconf,devel/automake,devel/libtool。
2、简介:configure.ac里面主要是m4宏,用于侦测系统;Makefile.am里面主要是编译相关的设置信息。使用autoconf工具将configure.ac转换为configure执行文件,使用automake将Makefile.am转换为Makefile.in。执行configure脚本时会读取Makefile.in里面的设置信息,并与侦测信息一起写到Makefile文件中。
(autoscan)->configure.ac->(autoconf)->configure
Makefile.am->(automake)->Makefile.in->(configure)->Makefile
3、命名习惯:
.ac后缀的文件,是autoconf的输入文件(旧版本中configure.in等同于configure.ac,虽然新版本也
可以识别,但它不符合命名规则,所以新版本的文件应该使用ac后缀)
.am后缀的文件,是automake的输入文件
.in后缀的文件,是configure的输入文件
三、步骤
1、建立目录,放入文件。按照GNU的习惯,将程序的源码放入src子目录,其他的数据文件也放在各自的子目录中。
2、autoscan
autoconf软件包里的autoscan工具根据参数指定目录生成一个configure.ac的模板文件configure.scan。autoscan如果不加参数则默认当前目录为工作目录。
3、重命名configure.scan->configure.ac(autoconf的输入文件),然后在此基础上进行修改
分析configure.scan文件:
① configure.ac文件是autoconf的输入文件,经过autoconf处理,展开里面的m4宏,输出的是
configure脚本,其主要作用是侦测系统。
② #开始的行为注释,其他都是m4宏命令,宏参数中会使用`[]`来表示其中的字符串是一个整体
③ AC_PREREQ([2.69]) 声明本文件要求的autoconf版本
④ AC_INIT(FULL-PACKAGE-NAME, VERSION, BUG-REPORT-ADDRESS)
定义软件的名称和版本等信息,第三项BUG-REPORT-ADDRESS是可选项,一般写成作者的邮
件地址,此处可修改为AC_INIT(helloworld, 1.0)
⑤ AC_CONFIG_SRCDIR 该宏通过侦测所指定的源码文件是否存在,来确定源码目录的有效性。
可以选择源码目录中的任何一个文件作为代表。
⑥ AC_CONFIG_HEADER 宏用于生成config.h文件,里面存放configure脚本侦测到的信息。如果
程序需要使用其中的定义,就在源码中加入#include <config.h>
⑦ 其他的一些宏是标准的侦测过程,可以保留不动。configure.ac文件要求AC_INIT必须放在开头位
置,AC_OUTPUT放在文件末,中介用来检测编译环境的各种宏没有特别的先后次序要求,由宏之
间相互关系决定Makefile文件的产生。
⑧ AC_INIT_AUTOMAKE 简单的Makefile.in可以手动编写,如果使用automake产生,需要在
configure.ac中加入该宏进行声明
⑨ AC_CONFIG_FILES 要输出Makefile文件,需要在configure.ac中使用该宏进行声明该宏并不只
是处理Makefile,而是将FILE.in文件转换为FILE文件
**注意:因为makefile可以遍历子目录,如果子目录中存在Makefile,也将同时处理。例如在src
目录下是源码, 其他目录下是数据文件的多个子目录的实例中,可以使用单独一个Makefile放
在根目录下面,也可以用多个Makefile。由于每个子目录的Makefile只处理本目录的文件,分工
明确,是模块化的方法,推荐使用。因此在configure.ac中增加下面的宏,表示软件根目录和子
目录中都需要生成Makefile文件:
AC_CONFIG_FILES([Makefile
src/Makefile
data/Makefile
docs/Makefile
fonts/Makefile
images/Makefile
music/Makefile
sound/Makefile])
4、编写Makefile.am文件
① 软件根(非叶子)目录Makefile.am:
由于该目录下面保存的是与autotools相关的文件,没有需要编译安装的文件,所以只注明需要
进一步处理的子目录信息:
SUBDIRS = src data docs fonts images music sound
② 文件(叶子)目录Makefile.am
(具体语法后续再详细研究)
5、运行autotools
准备好configure.ac和Makefile.am,就可以用autotools的命令来处理这些文件:
① aclocal命令:它根据configure.ac的定义,将需要使用的m4宏定义复制到aclocal.m4中。缺省
时,m4 宏是从 autoconf 的安装目录和系统的aclocal目录搜索。如果需要使用其他路径下的宏,可
以通过命令行的-I选项指定。
② autoheader命令,生成config.h.in文件,这里面的C语言宏定义也是通过解析configure.ac产生。
③ automake命令,处理Makefile.am,生成Makefile.in
**注意:
a. GNU对自己发布的软件有严格的规范,比如必须附带许可证声明文件COPYING等等,否则
automake执行时会报错。
b. automake提供了三种软件等级:foreign,gnu和gnits,让用户选择。默认为gnu,foreign指
它只检测必须的文件和有一些必须的脚本文件可以从automake软件包里复制过来。
c. --add-missing选项:将缺失的标准文件添加到包中
④ autoconf命令,生成configure文件