GNU autotools自动生成Makefile 介绍

1、目的
使用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 将软件安装到设定的目录
2、GNU autotools
一、主要包括三个软件: autoconf ,automake,libtool。
不少linux发行版都会默认安装这几个工具,软件包是经过pkgsrc,他们在pkgsrc目录为devel/autoconf,devel/automake,devel/libtool。
二、简介: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
三、命名习惯:
.ac后缀的文件,是autoconf的输入文件(旧版本中configure.in等同于configure.ac,虽然新版本也
能够识别,但它不符合命名规则,因此新版本的文件应该使用ac后缀)
.am后缀的文件,是automake的输入文件
.in后缀的文件,是configure的输入文件
3、步骤
一、创建目录,放入文件。按照GNU的习惯,将程序的源码放入src子目录,其余的数据文件也放在各自的子目录中。
二、autoscan
autoconf软件包里的autoscan工具根据参数指定目录生成一个configure.ac的模板文件configure.scan。autoscan若是不加参数则默认当前目录为工做目录。
三、重命名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])
四、编写Makefile.am文件
① 软件根(非叶子)目录Makefile.am:
因为该目录下面保存的是与autotools相关的文件,没有须要编译安装的文件,因此只注明须要
进一步处理的子目录信息:
SUBDIRS = src data docs fonts images music sound
② 文件(叶子)目录Makefile.am
(具体语法后续再详细研究)
五、运行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文件
相关文章
相关标签/搜索