autoconf是一个用于 生成可以自动配置软件园代码包以适应各种类UNIX系统的shell脚本工具。由autoconf生成的配置脚本在运行时与autoconf是无关的,就是说配置脚本的用户并不需要拥有autoconf~
由autoconf生成的这些脚本通常被命名为configure,他们检查当前系统是否满足软件正常运行所需要的特征,并根据检查的到的信息生成makefile,使用者所需要的做的只有在软件发布的源程序目录中运行
./configure;剩下的工作不需要用户手工干预,because配置脚本可以自动的确定系统的类型。还可以对软件包可能需要的各种特征进行独立的测试.
autoconf需要宏处理工具GNU m4,版本必须》1.1。
1.let's build one
autoconf生成的配置脚本通常被称为configure,运行的时候,configure创建的文件有
- 一个或者多个makefile,并在每个子目录里面也有一个
- 还可能是.h文件
- config.status的脚本
- config.cache的脚本
- config.log的文件,包含了由编译程序输出的信息,以便出错调试
使用这些的前提是编写一个configure.in的文件,并作为autoconf的输入文件运行autoconf。当然还可能要便其他的文件,如果后面用到了再说把;
除了特殊情况之外,在configure.in中可以任意次序的调用autoconf定义的测试宏,但是在被个configure.in文件中必须在开始的时候调用AC_INIT宏,并且在结尾包含一个AC_OUTPUT调用,只有这两个宏是必需的。还要注意有些宏要求其他的宏在其前面被调用,否则生成配置脚本configure时会发出警告。
通常在列表后面的测试往往依赖于前面的测试,例如,库函数可能受到typedefs和库的影响。其顺序应该是:
- AC_INIT(file)
- 程序选择测试
- 检查库文件
- 检查头文件
- 检查typedefs
- 检查结构体
- 检查编译器特征
- 检测库函数
- 检测系统服务
- AC_OUTPUT(file..)
比如下面的这个例子:
此外还有很多注意信息 .
2.使用autoscan build configure.in文件
在大多数情况下是不用手工输入复杂的宏定义,要不麻烦死了,这里推荐工具autoscan,这个工具是个perl的脚本程序,它从源程序中抽取与函数调用相关的头文件信息,并且将其输出到configure.scan文件中,如果在命令行中给出目录参数就能指定autoscan检查源文件的目录路径。而 configure.scan则可以作为软件包 configure.in的初始版本。
之后就可以把 configure.scan 直接改名为configure.in,但是需要做些手工检查并安排某些宏的位置。另外,如果希望软件包使用一个配置头文件,则必须调用名为AC_CONFIG_HEADER的宏,还可能用到#if等指令。
3. 使用autoscan build configure
有了configu re.in文件后,就可以开始生成自动配置脚本configure了。要生陈configure,只需不带参数的运行autoconf命令。
下面我举个例子吧:
这是一个工程文件拉,里面的程序简单说就是animal是个父类,fish是它的子类,看过孙鑫的教程的都应该记得这个程序。首先我要先写个makefile出来;
使用命令:
gcc -MM Mainc.cpp animal.cpp fish.cpp ;得到各种关系,这个命令在上上篇文章里面有叙述~
然后我得到了各种依赖关系如图
,然后我写makefile,如图:
这里因为C++,所以我使用了g++,这个比较于gcc,更适合与C++。结果当然满足要求拉~
,然后还是对这个工程,我来生成前面讲的东西:
使用
$ autoscan;生成了configure.scan
$ cp configure.scan configure.in;生成了configure.in
$ autoconf;生成configure
然后目录为:
这时我打命令
$ ./configure;就完成了跨UNIX平台的脚本编写使用~
最后有一个错误,关于makefile.in的,下次再说