3.1.1. 标准‘configure.ac’布局
‘configure.ac’调用Autoconf宏的次序是无关紧要的,除了少数例外。每个 ‘configure.ac’必须在检查之前包含对AC_INIT的一次调用,并在最后包含对AC_OUTPUT的一次调用(参考4.5节【输出】,17页)。另外,某些宏依赖于其它宏首先被调用,因为它们通过检查某些变量先前被设置的值来确定如何做。这些宏在单独的描述中被标识出来(参考第5章【现存测试】,36页),如果不按顺序调用它们构建configure时,它们会给出警告。
为了鼓励一致性,这里是一个调用Autoconf宏的建议次序。通常而言,靠近这个列表底部的是那些依赖于在列表中出现在它们之前的项。例如,库函数可以被类型及库影响。
Autoconfrequirements
AC_INIT(package, version,bug-report-address)
information on the package
checksfor programs
checksfor libraries
checksfor header files
checksfor types
checksfor structures
checksfor compiler characteristics
checksfor library functions
checks for system services
AC_CONFIG_FILES([file...])
AC_OUTPUT
3.2. 使用autoscan来构建‘configure.ac’
程序autoscan可以帮助你为一个软件包构建或维护一个 ‘configure.ac’文件。autoscan检查以一个命令行参数给出的目录为根目录的目录树中的源文件;或当前目录,如果没指定的话。它在源文件中查找常见的移植问题,并创建一个‘configure.scan’文件,对于该软件包,它是一个初级的‘configure.ac’,检查可能存在的‘configure.ac’的完整性。
当使用autoscan来创建一个‘configure.ac’时,在把它重命名为‘configure.ac’之前,你应该手动检查‘configure.scan’;它可能需要某些调整。偶尔,autoscan会输出一个相对于其它宏次序上出错的宏,因此autoconf产生一个警告;你需要手动调整这样的宏。同样,如果你希望该软件包使用一个配置头文件,你必须增加一个对AC_CONFIG_HEADERS的调用(参考4.9节【配置头文件】,30页。你可能还要在你的程序中改变或增加某些#if指示(directive),以使得它可以与Autoconf一起工作(关于一个可以在这方面有所帮助的程序的信息,参考3.3节【ifnames调用】,10页)。
当使用autoscan来维护一个‘configure.ac’时,只需要考虑添加它的建议。文件‘autoscan.log’包含了为什么要求一个宏的详细信息。
当Autoscan在一个软件包中找到特定的符号时,它使用几个数据文件(与Autoconf一起安装)来确定输出哪个宏。这些数据文件都具有相同的格式:每一行包含一个符号,一个或多个空格,及如果遇到这个符号输出的Autoconf宏。以‘#’开始的行是注释。
Autoscan接受以下选项:
--help
-h 打印该命令行选项的汇总信息并退出。
--version
-V 打印autoscan的版本号并退出。
--verbose
-v 检查的文件名,及在其中找到的可能感兴趣的符号名。这个输出可以很长。
--debug
-d 不要移走临时文件。
--include=dir
-I dir 把dir附加到包含路径后。多个调用会累积。
--prepend-include=dir
-B dir 把dir附加到包含路径前。多个调用会累积。
3.3. 使用 ifnames列出条件
Ifnames可以帮助你为一个软件包编写‘configure.ac’。它打印出该软件包在C预处理器条件中已经使用的标识符。如果一个软件包已经被设置为具有某些可移植性,那么ifnames可以帮你找出什么配置是需要检查的。它可以帮助填充由autoscan产生的‘configure.ac’中的空缺(参考3.2节【autoscan调用】,9页)。
Ifnames扫描所有在命令行中列出的C源文件(或如果没有指定,扫描标准输入),并在标准输出上输出,在这些文件的#if,#elif,#ifdef,或#ifndef指示中出现的标识符,经过排序的列表。每一行打印一个标识符,后跟一个空格分隔的,出现该标识符的文件列表。
Ifnames接受以下选项:
--help
-h 打印该命令行选项的汇总信息并退出。
--version
-V 打印ifnames的版本号并退出。
3.4. 使用autoconf构建configure
为了从‘configure.ac’构建configure,不带参数运行autoconf程序。Autoconf连同使用Autoconf的M4宏处理器一起,处理‘configure.ac’。如果你向autoconf给出一个参数,它从这个文件读入,而不是‘configure.ac’,并把配置脚本写到标准输出,而不是configure。如果你向autoconf给出参数‘-’,它从标准输入而不是‘configure.ac’读入,并把配置脚本写入标准输出。
Autoconf宏被定义在多个文件里。其中一些文件与Autoconf一起发布;autoconf首先读入它们。然后在包含Autoconf发布的宏文件的目录下,查找可选文件‘acsite.m4’,并在当前目录下查找可选文件‘aclocal.m4’。这些文件可以包括你自己站点(site)或软件包的Autoconf宏定义(细节参考第10章【编写Autoconf宏】,159页)。如果一个宏定义在autoconf 读入的多个文件里,后面读入的定义覆盖前面读入的。
Autoconf接受以下选项:
--help
-h 打印该命令行选项的汇总信息并退出。
--version
-V 打印autoconf的版本号并退出。
--verbose
-v 报告进度。
--debug
-d 不要移走临时文件。
--force
-f 重新构建‘configure’,即便它比其输入文件还有新。
--include=dir
-I dir 把dir附加到包含路径后。多个调用会累积。
--prepend-include=dir
-Bdir 把dir附加到包含路径前。多个调用会累积。
--output=file
-ofile 把输出(脚本或示踪)保存入file。文件‘-’代表标准输出。
--warnings=category
-Wcategory
报告与category相关的警告(它们可以是以逗号分隔的一个列表)。关于category完整列表,参考10.3节【报告消息】,162页,宏AC_DIAGNOSE。特殊的值包括:
‘all’ 报告所有的警告
‘none’ 不报告
‘error’ 把警告作为错误处理
‘no-category’ 禁止category类别中的警告
关于‘syntax’的警告默认是激活的,并且环境变量WARNINGS——一个逗号分隔的category列表,也是起作用的。传递‘-W category’的实际行为就像你传递了‘--warnings syntax,$WARNINGS,category’。禁止这个默认行为及WARNINGS,然后启用关于陈旧结构的警告,使用‘-W none, obsolete’。
因为autoconf在后台使用autom4te,它对错误显示一个回溯追踪,但对于警告没有;如果你希望这样,只需传递‘-W error’。参考8.2.1节【autom4te调用】,118页,中的某些例子。
--trace=macro[:format]
-tmacro[:format]
不构建configure脚本,但依照format列出对macro的调用。可以使用多个‘--trace’参数来列出多个宏。对于单个宏,多个‘--trace’参数不会累积;相反,你应该使用所需长度的format。
Format是一个正则字符串,如果需要,带有换行符,及几个特殊转义码。它默认为‘$f:$l:$n:$%’;关于format的细节,参考8.2.1节【autom4te调用】,118页。
--initialization
-I 在默认情况下,‘--trace’不追踪Autoconf宏的初始化(通常是AC_DEFUN的定义)。这导致显著的加速,但可以禁止这个选项。
通常需要检查一个‘configure.ac’文件的内容,但你自己解析它是及其容易出错的。建议你依靠‘--trace’来扫描‘configure.ac’。例如,要找出被替换的变量列表,使用:
$ autoconf -t AC_SUBST
configure.ac:2:AC_SUBST:ECHO_C
configure.ac:2:AC_SUBST:ECHO_N
configure.ac:2:AC_SUBST:ECHO_T
More traces deleted
下面的例子突出了‘$@’,‘$*’,及‘$%’之间的差别。
$ cat configure.ac
AC_DEFINE(This, is, [an
[example]])
$ autoconf -t ‘AC_DEFINE:@: $@
*: $*
%: $%’
@: [This],[is],[an
[example]]
*: This,is,an
[example]
%:This:is:an [example]
format给以你很多自由:
$autoconf -t ‘AC_SUBST:$$ac_subst{"$1"} = "$f:$l";’
$ac_subst{"ECHO_C"} ="configure.ac:2";
$ac_subst{"ECHO_N"} ="configure.ac:2";
$ac_subst{"ECHO_T"} ="configure.ac:2";
More traces deleted
可以使用长的分隔符来提高复杂结构的可读性,并简化其解析(例如当没有单个字符适用做一个分隔符):
$ autoconf -t ‘AM_MISSING_PROG:${|:::::|}*’
ACLOCAL|:::::|aclocal|:::::|$missing_dir
AUTOCONF|:::::|autoconf|:::::|$missing_dir
AUTOMAKE|:::::|automake|:::::|$missing_dir
More traces deleted
3.5. 使用autoreconf来更新configure脚本
安装GNU构建系统的不同组件可能是单调乏味的:为Gettext 运行autopoint,为在每个目录里的‘Makefile.in’等运行automake。这可能是需要的,或者因为某些工具,如automake在你的系统已经被更新了,或因为某些源代码,例如‘configure.ac’已经更新,或只是在一棵新代码树上安装GNU构建系统。
Autoreconf重复运行autoconf,autoheader,aclocal,automake,libtoolize,及autopoint(当合适时)在指定的目录及其子目录中更新GNU构建系统(参考4.12节【子目录】,35页)。
在默认的情况下,仅重新构建那些比它们的源代码旧的文件。环境变量AUTOM4TE,AUTOCONF,AUTOHEADER,AUTOMAKE,ACLOCAL,AUTOPOINT,LIBTOOLIZE,M4,及MAKE可能被用于改写这些工具的调用。
如果你安装某些工具的一个新版本,你可以通过‘--force’选项让autoreconf重新构建所有的文件。
至于当源文件改变时自动重构configure脚本的Make规则,参考4.8.5节【Automatic重新构建】,29页。该方法正确地处理了配置头文件模板(configuration header template)的时间戳,但不传递‘--autoconf-dir=dir’或‘--localdir=dir’。
Gettext支持命令autopoint向一个源代码包加入翻译的基础架构。如果使用autopoint,你的‘configure.ac’应该调用AM_GNU_GETTEXT及AM_GNU_GETTEXT_VERSION(gettext-version)。细节参考在《GNU gettext utilities》中的“Invoking the autopointProgram”一节。
Autoreconf接受以下选项:
--help
-h 打印该命令行选项的汇总信息并退出。
--version
-V 打印autoreconf的版本号并退出。
--verbose
-V 打印autoreconf检查的目录名,及它运行的命令。如果给出了两次或以上,传递‘--verbose’到支持它的下属工具。
--debug
-d 不要移走临时文件。
--force
-f 重构,即使‘configure’脚本及配置头文件比它们的输入文件(‘configure.ac’及‘aclocal.m4’,如果有的话)还要新。
--install
-I 安装在软件包中缺失的辅助文件。在默认情况下,拷贝文件;这个行为可以被选项‘--symlink’改变。如果合适,这个选项触发对‘automake --add-missing’,‘libtoolize’,‘autopoint’等的调用。
--no-recursive
不要重构在配置子目录中的文件(参考4.12节【子目录】,35页,宏 AC_CONFIG_SUBDIRS).
--symlink
-s 当与‘--install’一起使用时,安装缺失辅助文件的符号链接,而不是拷贝它们。
--make
-m 当命令被配置时,通过运行‘./config.status --recheck&& ./config.status’来更新配置,然后运行‘make’。
--include=dir
-Idir 把dir附加到包含路径之后。多次调用可以累积。在内部传递给aclocal,autoconf及autoheader。
--prepend-include=dir
-Bdir 把dir附加到包含路径之前。多次调用可以累积。在内部传递给aclocal,autoconf及autoheader。
--warnings=category
-Wcategory
报告关于category的警告(它可以是一个逗号分隔的列表)。
‘cross’ 关于交叉编译的问题。
‘obsolete’ 报告陈旧结构的使用。
‘portability’ 可能的问题
‘syntax’ 有二义性的语法结构。
‘all’ 报告所有的警告
‘none’ 不报告
‘error’ 把警告处理为错误
‘no-category’
禁止落在category内的警告
默认情况下关于‘syntax’的语法是激活的,并且环境变量WARNINGS——一个逗号分隔的categorie列表,也是生效的。传递‘-W category’实际上的行为就如同你传递了‘--warnings syntax, $WARNINGS, category’。要禁止缺省值及WARNINGS,然后激活关于陈旧结构的警告,使用‘-W none,obsolete’。
如果你希望autoreconf向aclocal传递没有在这里列出的标记,在你的‘Makefile.am’中设置ACLOCAL_AMFLAGS。因为Autoconf实现的局限,当前这些标记必须被设置在 ‘Makefile.am’中的一行上,不带任何‘\n’。