使用autotools搭建自动编译工程
简介
autotools是autoscan,autoheader,autoconf,automake,aclocal工具的集合
首先使用aclocal生成一个“aclocal.m4”文件,该文件主要处理本地的宏定义;
改写“configure.scan”文件,并将其重命名为“configure.in”,并使用autoconf文件生成configure文件。接着在每个目录下创建一个Makefile.am文件,用来描述当前目录以及子目录的文件结构关系
第一步
.autoscan
会在当前目录及其子目录树中检查源文件,以寻找一般的移植性问题并创建一个文件“configure.scan”,该文件就是接下来autoconf要用到的“configure.in”原型。如下所示:
# -*- Autoconf -*-
# AC_PREREQ宏声明本文件要求的autoconf版本
AC_PREREQ(2.61)
#用来定义软件的名称和版本等信息,BUG-REPORT-ADDRESS一般为作者的e-maiL
#指定项目的一个源文件
#AC_INIT(FULL-PACKAGE-NAME, VERSION, BUG-REPORT-ADDRESS)
AC_INIT(src/MiniDesktop.py)
#AM_INIT_AUTOMAKE(PACKAGE,VERSION)是另加的,是automake所必备的宏,PACKAGE是所要产生软件的名称,VERSION是版本编号
#指定项目名称和版本号(这些参数成为config.h中定义的PACKAGE和VERSION值)
AM_INIT_AUTOMAKE(minidesktop,1.1)
#AM_MAINTAINER_MODE关闭缺省时仅供程序维护者使用的makefile目标,并修改以使configure能理解--enable-maintainer-mode选项。--enable-maintainer-mode将maintaineronly目标重新打开
AM_MAINTAINER_MODE
#dnl也为注释
dnl AC_PATH_PROG(GCONFTOOL, gconftool-2)
dnl AM_GCONF_SOURCE_2
dnl AC_PROG_INTTOOL([0.21])
dnl check for python
#检查python解析器
#AM_PATH_PYTHON ([VERSION], [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND])
AM_PATH_PYTHON ([2.5])
#PKG_CHECK_MODULES(NAME, lib >= version ..., action-if, action-not)
#查找库有没有安装及版本
PKG_CHECK_MODULES(PYGTK, pygtk-2.0)
#AC_SUBST输出一个变量到由configure生成的config.status文件中(整个工程可见)
AC_SUBST(PYGTK_CFLAGS)
AC_SUBST(PYGTK_LIBS)
#AC_CONFIG_FILES([Makefile
# src/Makefile])
#表明输出的Makefile文件的路径
AC_OUTPUT([ Makefile
src/Makefile
#...
])
第2步(aclocal)
aclocal生成一个“aclocal.m4”文件,该文件主要处理本地的宏定义
第3步(autoconf)
autoconf命令生成configure脚本文件
第4步(autoheader)
autoheader命令,它负责生成config.h.in文件。该工具通常会从“acconfig.h”文件中复制用户附加的符号定义,因此此处没有附加符号定义,所以不需要创建“acconfig.h”文件
第5步(automake)
automake要用的脚本配置文件是Makefile.am,用户需要自己在每个目录创建。之后,automake工具把Makefile.am转换成Makefile.in。
Makefile.am原型:
AUTOMAKE_OPTIONS=foreign
bin_PROGRAMS= hello
hello_SOURCES= hello.c
解释
· AUTOMAKE_OPTIONS:为设置automake的选项。GNU对自己发布的软件有严格的规范,比如必须附带许可证声明文件COPYING等,否则automake执行时会报错。automake提供了三种软件等级:foreign、gnu和gnits,让用户选择采用,默认等级为gnu。在本例使用foreign等级,它只检测必须的文件。
· bin_PROGRAMS定义要产生的执行文件名。如果要产生多个执行文件,每个文件名用空格隔开。
· hello_SOURCES定义“hello”这个执行程序所需要的源代码文件。把所用到的所有文件都列出来,并用空格隔开。例如:若目标体“hello”需要“hello.c”、“sunq.c”、“hello.h”三个依赖文件,则定义hello_SOURCES=hello.c sunq.c hello.h。要注意的是,如果要定义多个执行文件,则对每个执行程序都要定义相应的file_SOURCES。
最后执行./configure脚本,自动生成Makefile文件