申明 :阅读autotool手册同时根据自己认识进行总结,文章内容以手册为主,结合部分其他资料以及自己的总结。
第一章 总体概览
1.1概述
Autoconf是一个通过产生配置脚本来使源码包能够适配不同类unix系统的工具。
Automake 是为了改善autoconf管理工程时,因为目录过多,依赖链管理过于复杂的问题。使代码管理更加简化。
Libtool 是为了解决库的问题,不同系统对库的使用上差别很大,使用libtool生成的库文件能适配不同平台。
1.2 结构分析
对使用autoconf生成配置脚本的流程进行说明下面被加载的程序以 *标注,配置文件使用[]标注。
1.3构成部件
autoconf
是一个产生可以自动配置源代码包,生成shell脚本的工具,以适应各种类UNIX系统的需要。autoconf 产生的配置脚本在运行时独立于autoconf ,因此使用这些脚本的用户不需要安装autoconf。
autoheader
能够产生供configure脚本使用的C #define语句模板文件。
autom4te
对文件执行 GNU M4。其本质是一个缓冲管理,为autotool提供快速查找所需结构的接口
autoreconf
如果有多个autoconf产生的配置文件,autoreconf可以保存一些工作,它通过重复运行autoconf(以及在合适的地方运行autoheader)以重新产生autoconf配置脚本和配置头模板,这些文件保存在以当前目录为根的目录树中。
autoscan
程序可以用来为软件包创建configure.ac文件。autoscan在以命令行参数中指定的目录为根(如果未给定参数,则以当前目录为根)的目录树中检查源文件。它为通常的轻便问题搜索源文件,并且为那个包创建一个configure.scan文件,这个文件就是configure.ac的前身。
autoupdate
程序将一个调用autoconf 宏的旧名称的configure.ac, Makefile.in 文件中的宏更新为新的名称。
Ifnames
当为一个软件包写configure.ac 时,ifnames可以提供一些帮助。它打印包中那些在C预处理器中已经使用了的表示符。如果一个包已经设置成具有某些可移植属性,这个程序能够帮助指出它的配置应该如何检查。它可以用来填补由autoscan产生的configure.ac中的隔阂。
Automake
使用Makefile.am生成Makefile.in,通过支持更高级的配置文件来简化原来的autoconf
Aclocal
原本autoconf并未考虑到后续支持像automake这样的扩展,因此使用
Aclocal
使autoconf支持automake对其的扩展
Libtoolize
为工程使用libtool做准备
The Libtool C API—ltdl
在不同平台上提供一个一直运行的共享对象管理,是为libtool功能能够正常运行提供支持
第二章 Autoconf
2.1 configure.ac
2.1.1简述
编写Configure.ac 时可以利用autoscan扫描工程目录生成的模板进行改写。Configure.ac 是使用autotool的重要文件。此外可以使用ifname配合autoscan编写configure.ac.
2.2.2 configure.ac的内容
AC_INIT (package, version, [bug-report], [tarname], [url])
主要配置包的名字,版本号,bug提交地址,tarname, 以及一个网页链接。
AC_PREREQ (version)
用来设置支持该包需要的autotool最低版本
AC_COPYRIGHT (copyright-notice)
添加FSF copyright
AC_REVISION
设置copyright版本
AC_CONFIG_SRCDIR (unique-file-in-source-dir)
检查一个文件是否存在来确定当前目录是否正确
AC_CONFIG_AUX_DIR (dir)
设置autotool工具的目录
AC_REQUIRE_AUX_FILE (file)
用于注册辅助文件,针对第三方工具
AC_CONFIG_MACRO_DIR (dir)
指明获取本地autoconf 宏的目录
AC_OUTPUT
创建configure.status并加载他。在configure.ac的末尾调用它
AC_PROG_MAKE_SET
为MAKE赋值,预定义的MAKE是空值。
AC_CONFIG_FILES
可以用来替代AC_OUTPUT,使用可参考下面的官方实例
Typical calls to AC_CONFIG_FILES look like this:
AC_CONFIG_FILES([Makefile src/Makefile man/Makefile X/Imakefile])
AC_CONFIG_FILES([autoconf], [chmod +x autoconf])
You can override an input file name by appending to file a colon-separated list of input files. Examples:
AC_CONFIG_FILES([Makefile:boiler/top.mk:boiler/bot.mk]
[lib/Makefile:boiler/lib.mk])
此外为了表现AC_CONFIG_FILES和AC_OUTPUT可以对照下面的例子
AC_OUTPUT([Makefile])
等价于
AC_CONFIG_FILES([Makefile])
AC_OUTPUT
2.2.configure的执行
2.2.1概述
2.2.2 Makefile.in
2.2.2.1基本目录变量
srcdir
源文件顶层目录,这是能在configure加载时通过--srcdir参数设置的,默认工作目录为顶层构建目录。
ac_top_srcdir
源文件顶层目录, 默认工作目录为当前构建目录
ac_top_build_prefix
构建顶层目录, 默认工作目录为当前构建目录
ac_srcdir
当前源文件目录, 默认工作目录为当前构建目录
tmp
临时文件存放处
上面的信息区分可以对照下面取自官网的示例进行理解:
2.2.2.1预输出变量
CFLAGS
指定头文件(.h文件)的路径,如:CFLAGS=-I/usr/include -I/path/include。同样地,安装一个包时会在安装路径下建立一个include目录,当安装过程中出现问题时,试着把以前安装的包的include目录加入到该变量中来。默认被 AC_PROG_CC设置
CXXFLAGS
与CFLAG作用类似,针对C++
LDFLAGS
gcc 等编译器会用到的一些优化参数,也可以在里面指定库文件的位置。用法:LDFLAGS=-L/usr/lib -L/path/to/your/lib。每安装一个包都几乎一定的会在安装目录里建立一个lib目录。如果明明安装了某个包,而安装另一个包时,它愣是说找不到,可以抒那个包的lib路径加入的LDFALGS中试一下。
LIBS
告诉链接器要链接哪些库文件,如LIBS = -lpthread -liconv
DEFS
C编译器中-D选项传递的数据 . 如果 AC_CONFIG_HEADERS
被设置, configure 将把‘@DEFS@’ 替换为 -DHAVE_CONFIG_H
等价于 .
builder的绝对路径
top_builddir
当前代码树顶层的相对路径
abs_top_builddir
当前代码树顶层的绝对路径
srcdir
Makfile对应的源码的路径
abs_srcdir
srcdir的绝对路径
top_srcdir
源码顶层的绝对路径
abs_top_srcdir
源码顶层的相对路径
2.2.2.1 安装路径变量
bindir可执行文件安装路径
datadir
只读数据保存路径
datarootdir
只读数据保存的根文件夹
docdir
文档保存路径
divdir
DIV 格式文档保存路径
exec_prefix
构架依赖文件保存路径,默认和prefix相同。
htmldir
hcml文档保存路径
includedir
C头文件保存路径
infodir
info格式文档保存路径
libdir
库文件安装路径
libexecdir
其他程序运行时加载的可执行程序路径
localedir
locale-dependent but architecture-independent 数据的路径
localstatedir
可更改的本机数据保存路径
mandir
man手册安装路径
oldincludedir
非C头文件保存路径
pdfdir
PDF文档保存路径
prefix
所有文件的安装目录,如果exec_prefix被定义,则仅为构架无关文件的保存路径
psdir
PostScript文档的保存路径
sbindir
管理员使用的可执行文件安装路径
sharedstatedir
可更改,用于共享的构架无关数据安装路径
sysconfdir
只读本机数据安装路径
2.3 autoconf的使用技巧
2.3.1 自动重构
$(srcdir)/configure: configure.ac aclocal.m4
cd '$(srcdir)' && autoconf
# autoheader might not change config.h.in, so touch a stamp file.
$(srcdir)/config.h.in: stamp-h.in
$(srcdir)/stamp-h.in: configure.ac aclocal.m4
cd '$(srcdir)' && autoheader
echo timestamp > '$(srcdir)/stamp-h.in'
config.h: stamp-h
stamp-h: config.h.in config.status
./config.status
Makefile: Makefile.in config.status
./config.status
config.status: configure
./config.status --recheck
学习编写中。。。。