一 一般过程
Automake 之前系统必须安装的软件:
GNU Automake
GNU autoconf
GNU m4
Perl
GNU libtool
一般linux发行版本都包括以上这些工具
使用autotools主要就是利用各个工具的脚本文件以生成最后的makefile。
1.编写产生源代码
2.用autoscan产生configure.scan文件,编辑该文件产生新文件configure.in文件
3.执行aclocal,产生aclocal.m4
4.执行autoconf,产生configure
5.创建Makefile.am文件,并编辑成一定的样子
6.执行automake --add-missing, Automake会根据Makefile.am产生一些文件,其中包括最重要的Makefile.in
7.最后执行./configure,产生Makefile文档
8.执行make,生成可执行文件
9.执行make install,将可执行文件复制到系统路径下。
二helloword示例
1.在选定的目录下编写hello.c程序
int main(int argc, char** argv)
{
printf("Hello World!\n");
return 0;
}
2. 生成configure
autoscan它会在给定目录及其子目录树中检查源文件,若没有给出目录,就在当前目录及其子目录树中进行检查。它会搜索源文件以寻找一般的移植性问题并创建一个文件“configure.scan”,该文件就是接下来autoconf要用到的“configure.in”原型( 我们使用autoscan命令来帮助我们根据目录下的源代码生成一个configure.scan文件,可用此文件来当作configure.in的模板),将configure.scan改名为configure.in,并且编辑它,按下面的内容修改,去掉无关的语句:
# Process this file with autoconf to produce a configure script.
AC_PREREQ(2.59)
AC_INIT(hello.c,1.0)
AM_INIT_AUTOMAKE(hello, 1.0)
AC_CONFIG_SRCDIR([hello.c])
AC_CONFIG_HEADER([config.h])
# Checks for programs.
AC_PROG_CC
# Checks for libraries.
# Checks for header files.
# Checks for typedefs, structures, and compiler characteristics.
# Checks for library functions.
AC_OUTPUT(Makefile)
#AC_CONFIG_FILES([makefile])
以“#”号开始的行是注释。
- AC_PREREQ宏声明本文件要求的autoconf版本,如本例使用的版本2.59。
- AC_INIT宏用来定义软件的名称和版本等信息,在本例中省略了BUG-REPORT-ADDRESS,一般为作者的E-mail。
- AM_INIT_AUTOMAKE是笔者另加的,它是automake所必备的宏,使automake自动生成makefile.in,也同前面一样,PACKAGE是所要产生软件套件的名称,VERSION是版本编号。
- AC_CONFIG_SRCDIR宏用来检查所指定的源码文件是否存在,以及确定源码目录的有效性。在此处源码文件为当前目录下的hello.c。
- AC_CONFIG_HEADER宏用于生成config.h文件,以便autoheader使用。
- AC_CONFIG_FILES宏用于生成相应的makefile文件。
- 中间的注释之间可以分别添加用户测试程序、测试函数库、测试头文件等宏定义。
configure.in内容是一些宏定义,这些宏经autoconf处理后会变成检查系统特性、环境变量、软件必须的参数的shell脚本。
然后执行命令aclocal和autoconf,分别会产生aclocal.m4及configure两个文件:
aclocal根据configure.in文件的内容,自动生成aclocal.m4文件。aclocal是一个perl 脚本程序,它的定义是:“aclocal - create aclocal.m4 by scanning configure.ac”。 m4是一个宏处理器。将输入拷贝到输出,同时将宏展开。宏可以是内嵌的,也可以是用户定义的。除了可以展开宏,m4还有一些内建的函数,用来引用文件,执行命令,整数运算,文本操作,循环等。m4既可以作为编译器的前端,也可以单独作为一个宏处理器。
autoconf 是用来生成自动配置软件源代码脚本configure的工具。configure脚本能独立于autoconf运行,且在运行的过程中,不需要用户的干预。
要生成configure文件,你必须告诉autoconf如何找到你所用的宏。方式是使用aclocal程序来生成你的aclocal.m4
autoconf从configure.in这个列举编译软件时所需要各种参数的模板文件中创建configure。
autoconf需要GNU m4宏处理器来处理aclocal.m4,生成configure脚本。
[root@localhost automake]# aclocal
再接着运行autoconf,生成“configure”可执行文件。如下所示:
[root@localhost automake]# autoconf
[root@localhost automake]# ls
aclocal.m4 autom4te.cache autoscan.log configure configure.in hello.c
3. 接着使用autoheader命令,它负责生成config.h.in文件。该工具通常会从“acconfig.h”文件中复制用户附加的符号定义,因为这里没有附加符号定义,所以不需要创建“acconfig.h”文件。如下所示:
[root@localhost automake]# autoheader
4.automake
这一步是创建makefile很重要的一步,automake要用的脚本配置文件是makefile.am,用户需要自己创建相应的文件。之后,automake工具转换成makefile.in.
Makefile.am中定义的宏和目标,会指导automake生成指定的代码。例如,宏bin_PROGRAMS将导致编译和连接的目标被生成。
运行automake,automake会根据你写的Makefile.am来自动生成Makefile.in和一些其它文件。在该例中,笔者创建的文件为makefile.am,如下所示:
AUTOMAKE_OPTIONS=foreign
bin_PROGRAMS= hello
hello_SOURCES= hello.c
下面对该脚本文件的对应项进行解释。
其中的AUTOMAKE_OPTIONS为设置automake的选项。GNU对自己发布的软件有严格的规范,比如必须附带许可证声明文件COPYING等,否则automake执行时会报错。automake提供了3种软件等级:foreign、gnu和gnits,让用户选择采用,默认等级为gnu。在本示例中采用foreign等级,它只检测必须的文件。
bin_PROGRAMS定义要产生的执行文件名。如果要产生多个执行文件,每个文件名用空格隔开。
hello_SOURCES定义“hello”这个执行程序所需要的原始文件。如果“hello”这个程序是由多个原始文件所产生的,则必须把它所用到的所有原始文件都列出来,并用空格隔开。例如:若目标体“hello”需要“hello.c”、“david.c”、“hello.h”三个依赖文件,则定义hello_SOURCES=hello.c david.c hello.h。要注意的是,如果要定义多个执行文件,则对每个执行程序都要定义相应的file_SOURCES。
接下来可以使用automake命令来生成“configure.in”文件,在这里使用选项“-a”(或者“—adding-missing”)可以让automake自动添加一些必需的脚本文件。如下所示:
可以看到,在automake之后就可以生成configure.in文件。
5.执行./configure生成Makefile.在这一步中,通过运行自动配置设置文件configure,把makefile.in变成了最终的makefile。
可以看到,在运行configure时收集了系统的信息,用户可以在configure命令中对其进行方便的配置。在./configure的自定义参数有两种,一种是开关式(--enable-XXX或--disable-XXX),另一种是开放式,即后面要填入一串字符(--with-XXX=yyyy)参数。读者可以自行尝试其使用方法。另外,读者可以查看同一目录下的“config.log”文件,以方便调试之用。
---------------------------------------------------
6执行make生成可执行文件hello
7.Make install
--------------------------------------------------------------------------------------------------------------------------------------------------------------
使用autotools所生成的makefile
autotools生成的makefile除具有普通的编译功能外,还具有以下主要功能(感兴趣的读者可以查看这个简单的hello.c程序的makefile)。
1.make
键入make默认执行“make all”命令,即目标体为all,其执行情况如下所示:
此时在本目录下就生成了可执行文件“hello”,运行“./hello”能出现正常结果,如下所示:
[root@localhost automake]# ./hello
Hello!Autoconf!
2.make install
此时,会把该程序安装到系统目录中去,如下所示:
此时,若直接运行hello,也能出现正确结果,如下所示:
[root@localhost automake]# hello
Hello!Autoconf!
3.make clean
此时,make会清除之前所编译的可执行文件及目标文件(object file, *.o),如下所示:
[root@localhost automake]# make clean
test -z "hello" || rm -f hello
rm -f *.o
4.make dist
此时,make将程序和相关的文档打包为一个压缩文档以供发布,如下所示:
[root@localhost automake]# make dist
[root@localhost automake]# ls hello-1.0-tar.gz
hello-1.0-tar.gz
可见该命令生成了一个hello-1.0-tar.gz压缩文件。
由上面的讲述读者不难看出,autotools是软件维护与发布的必备工具,鉴于此,如今GUN的软件一般都是由automake来制作的。
补充:
利用configure所产生的Makefile,有几个缺省的参数可供使用,下面作简单介绍:
make all :产生我们设定的目标,只输入make也可以,此时会开始编译源代码,然后连接,产生可执行程序。
make clean : 清除之前所编译的可执行程序及目的文件(object file,*.o)
make distclean :除了清除可执行程序和目的文件外,也把configure所产生的Makefile清除掉
make install :将程序安装至系统中缺省的可执行程序存放路径。如果我们用bin_PROGRAMS宏的话,程序会被安装到/usr/local/bin目录
make dist :将程序和相关文件包装成一个压缩文件以供发布。执行之后,在目录下会产生一个PACKAGE-VERSION.tar.gz文件。PACKAGE和VERSION这两个变量是根据configure.in中AM_INIT_AUTOMAKE(PACKAGE,VERSION)的定义而得来得。
make distcheck: 生成发布软件包并对其进行测试检查,以确定发布包的正确性。这个操作将自动把压缩包文件解开,然后执行configure命令,并且执行make,来确认编译不出现错误,最后提示你软件包已经准备好,可以发布了。
参考文献-------
http://www.eefocus.com/article/10-04/94616_1s.html
http://bbs.chinaunix.net/thread-2069243-1-1.html