提到automake,autoconf我就头大,但还是需要还是要理解这些东东的,否则永远也不能理解GNU developer world。
GNU build系统是一组工具的集合,用于简化开发人员的build工作,将开发人员的精力集中在代码实现上,而不是花费在烦人的build script上(比如makefile,install script。。。),这一组工具主要是autoconf和automake,使用他们除了简化build script外,还额外得到了更好的跨平台特性,因为GNU build系统会生成一个cofngure脚本,这个脚本会根据平台特性生成相应的makefile,而且这个makefile可以很好的兼容各种 make版本。
例子,例子。。。。,建立三个文件:
`hello.c'
#include <stdio.h>
main()
{
printf("Hello, world!\n");
}
`Makefile.am'
bin_PROGRAMS = hello
hello_SOURCES = hello.c
`configure.in'
AC_INIT(hello.c)
AM_INIT_AUTOMAKE(hello,0.1)
AC_PROG_CC
AC_PROG_INSTALL
AC_OUTPUT(Makefile)
然后,演出开始,依次执行
$ aclocal
$ autoconf
$ touch NEWS README AUTHORS ChangeLog
$ automake -a
$ ./configure
$ make
$ make distcheck
如 果这些工具都已经安装的话,一阵滚屏之后,hello程序生成了,甚至连第一个发布的版本hello-0.1.tar.gz也准备好了。如果我们修改了 hello.c,要再发一个版本,也很简单,先用make distcheck检测一遍,保证没有问题。然后修改configure.in中的版本号,修改说明文档NEWS,ChangeLog,再调用make dist,新的gz生成了,一切搞定(命令行有时真是爽啊)。
爽过之后,来理性的分析一下过程,大致的过程是这样的
*.m4, configure.in ------------->{aclocal}-----> aclocal.m4
aclocal.m4, configure.in -----> {autoconf} --------> configure
Makefile.am --------> {automake} -----------> Makefile.in
Makefile.in
----------> {configure} ------------> Makfile
m4 是macro的缩写(因为m后面有4个字符),这里定义的是autoconf需要看到的宏,aclocal可以自动生成这些宏,并写入到 aclocal.m4中,后面的三个步骤比较明显。其中漏掉的那个touch命令,是用来建立GNU规范所需要的几个文档文件,否则automake会失 败。
这样生成的makefile在调用编译器时会加上很多-D参数(来自于configure),过多的参数可能会导致make失败,可 以统一将这些参数放在一个头文件中(config.h),为了使用和产生config.h,需要改动几个地方,首先需要改动configure.in,在 AC_INIT下面加上AM_CONFIG_HEADER(config.h),然后所有的源文件前要加上:
#ifdef HAVE_CONFIG_H
#include <config.h>
#endif
并在执行autoconf之后,执行autoheader,这一步相当于:
configure.in -----> {autoheader} --------> config.h.in
这样就可以了,后面的configure将生成两个文件
config.h.in,Makefile.in ------> {configure} -------> config.h,Makfile
如果觉得这样的hello,world太麻烦(我也是这么想的)
,可以下载autotoolset这个工具来做自动化生成,(这个工具是rpm格式,在debian/ubuntu下需要用alien -i安装),安装完后,执行acmkdir dirname就可以按照向导生成一个目录框架了。