测试的结果
一旦configure确定了某个特征是否存在,它将如何记录这一信息?这里有四种记录方式: 定义一个C预处理器符号、在输出文件中设置一个变鼠、为将来运行configure而把结果储存到一个缓存文件中, 以及打印一条消息以便让用户知道测试的结果。
定义C预处理器符号
对一个特征的检测的常见回应是定义一个表示测试结果的C预处理器符号。这是通过调用AC—DEFINE 或者AC—DEFINE—UNQUOTED来完成的。
在缺省状态下,AC—OUTPUT把由这些宏定义的符号放置到输出变鼠DEFS中,该变鼠为每个 定义了的符号添加一个选
项'-D飞ymbol=value'。与Autoconf第1版不同,在运行时 不定义DEFS变鼠。为了检查Autoconf宏是否已经定义了某个C预处理器符号,就检查适当的缓存变鼠的值, 例子如下:
AC—CHECK—FUNC(vprintf, AC—DEFINE(HAVE—VPRINTF))if test "$ac—cv—func—vprintf" != yes; then AC—CHECK—FUNC(—doprnt, AC—DEFINE(HAVE—DOPRNT))fi如果已经调用了AC—CONFIG—HEADER,那么就不是创建DEFS,而是由AC—OUTPUT 创建一个头文件,这是通过在一个暂时文件中把正确的值替换到#define语旬中来实现的。 关于这种输出的详情,请参见 配置头文件 。
宏 : AC_DEFINE variable [, value [, description]])
定义C预处理器变鼠variable。如果给出了value,就把variable设置成那个值(不加任何改变), 否则的话就设置为1。value不应该含有新行,同时如果你没有使用AC—CONFIG—HEADER,它就不应该含有 任何'#'字符,这是因为make将删除它们。为了使
用shell变鼠(你需要使用该变鼠定义一个包含了 m4引用字符'['或者']'的值),就使用AC—DEFINE—UNQUOTED。只有在 你使 用AC—CONFIG—HEADER的时候,description才有用。在这种情况下,description被 作为注释放置到生成的'config.h.in'的宏定义之前 不必在'acconfig.h'中提及该宏。下面的例子把 C预处理器变鼠EQUATION的值定义成常鼠字符串'"$a > $b"':
AC—DEFINE(EQUATION, "$a > $b")宏 : AC_DEFINE_UNQUOTED variable [, value [, description]])
类似于AC—DEFINE,但还要对variable和value进行三种shell替换(每种替换只进行一次): 变鼠扩展('$'),命令替
换('''),以及反斜线传义符('\')。值中的单引号和双引号 没有特殊的意义。在variable或者value是一个shell变鼠的时候用本宏代替AC—DEFINE。例如:
AC—DEFINE—UNQUOTED(config—machfile, "${machfile}") AC—DEFINE—UNQUOTED(GETGROUPS—T, $ac—cv—type—getgroups) AC—DEFINE—UNQUOTED(${ac—tr—hdr})由于Bourne shell在语法上的特异性,不要用分号来分隔对AC—DEFINE或者AC—DEFINE—UNQUOTED的调用和 其它的宏调用或者shell代码 这将在最终的configure脚本中导致语法错误。你既可以使用空格,也可以使用 换行。就是这样:
AC—CHECK—HEADER(elf.h, AC—DEFINE(SVR4) LIBS="$LIBS -lelf")或者:
AC—CHECK—HEADER(elf.h, AC—DEFINE(SVR4) LIBS="$LIBS -lelf")而不是:
AC—CHECK—HEADER(elf.h, AC—DEFINE(SVR4); LIBS="$LIBS -lelf")设置输出变鼠
记录测试结果的一种方式是设置输出变鼠,该变鼠是shell变鼠,它的值将被替换到configure输出的文件中。 下面的两个宏创建新的输出变鼠。关于总是可用的输出变鼠的列表,参见 预定义输出变鼠 。
宏 : AC_SUBST variable)
从一个shell变鼠创建一个输出变鼠。让AC—OUTPUT把变鼠variable替换到输出文件中(通常是一个或多个 'Makefile')。这意味着AC—OUTPUT将把输入文件中的'@variable@'实例替换成 调用AC—OUTPUT时shell变鼠variable的值。variable的值不能包含新行。宏 : AC_SUBST_FILE variable)
另一种从shell变鼠创建输出变鼠的方式。让AC—OUTPUT把由shell变鼠variable给出的文件名的文件的内容 (不进行替换)插入到输出文件中。这意味着AC—OUTPUT将在输出文件中(比如'Makefile.in')把输入文件中 的'@variable@'实例替换为调用AC—OUTPUT时shell变鼠variable的值指明的文件 的内容。如果没有文件可以插入,就把变鼠设置成'/dev/null'。
本宏用于把包含特殊依赖性或者为特殊主机或目标机准备的其它make指令的'Makefile'片断插入 'Makefile'。例如,'configure.in'可以包含:
AC—SUBST—FILE(host—frag)dnl host—frag=$srcdir/conf/sun4.mh那么'Makefile.in'就应该包含:
@host—frag@缓存结果
为了避免在各种configure脚本中重复地对相同的特征进行检查(或者重复地运行同一个脚本), configure把它的检查的许多结果储存在缓存文件。如果在configure脚本运行时,它找到了 缓存文件,它就从中读取从前运行的结果并且不再重新运行这些检查。因
此,configure将比每次都运行所有的检查 要快得多。
宏: AC_CACHE_VAL cache—id, commands—to—set—it)
确认由cache—id指定的检查的结果是可用的。如果检查的结果在读入的缓存文件中,并且configure 没有用'--quiet'或
者'--silent'调用,就打印一条消息以说明该结果已经被缓存了 否则,就运行 shell命令commands—to—set—it。这些命令不应具有副作用,但设置变鼠cache—id除外。它们尤其不应该调用 AC—DEFINE 紧随与对AC—CACHE—VAL的调用之后的代码应该根据缓存的值调用AC—DEFINE 作这件事。此外,它们不应该打印任何消息,比如说使用AC—MSG—CHECKING 应该在调
用AC—CACHE—VAL 之前打印,以便不论测试的结果是从缓存中检索而得到的,还是通过运行shell命令而确定的,都会打印消息。如果是运行 shell命令以确定值,该值将在configure创建它的输出文件之前被储存到缓存文件中。关于如何选择 cache—id变鼠的名称,参见 缓存变鼠名 。
宏: AC_CACHE_CHECK message, cache—id, commands)
这是一个更详尽地处理了打印消息的AC—CACHE—VAL版本。本宏为这些宏的最常见的应用提供了便捷的缩写。 它为message调
用AC—MSG—CHECKING,而后以cache—id和commands为参数 调用AC—CACHE—VAL,最后以cache—id为参数调用AC—MSG—RESULT。
宏: AC_CACHE_LOAD
从已经存在的缓存文件中装入值,如果找不到缓存文件,就创建一个新的缓存文件。本宏由AC—INIT自动调用。
宏: AC_CACHE_SAVE
把所有缓存的值刷新到缓存文件中。本宏由AC—OUTPUT自动调用,但在configure.in的关键点调用 AC—CACHE—SAVE是十分有用的。假如配置脚本中途失败(abort)了,这些关键点仍然可以缓存一部分结果。
缓存变鼠名
缓存变鼠的名字应该符合如下格式:
package-prefix—cv—value-type—飞pecific-value[—additional-option飞]
例如,'ac—cv—header—stat—broken'或者'ac—cv—prog—gcc—traditional'。 变鼠名的各个部分为:
package—prefix
你的包或者组织的缩写 除了为了方便而使用小写字母以外,与你使用的作为本地Autoconf宏的开头的前缀一样。 对于由发布的Autoconf宏使用的缓存值,它是'ac'。
—cv— 表明本shell变鼠是一个缓存值。value—type
关于缓存值类别的惯例,以生成一个合理的命名系统。在Autoconf中使用的值在 宏名 中列出。
specific—value
指明本测试应用于缓存值类的那个成员。 例如,那个函数('alloca')、程序('gcc')或者输出变鼠('INSTALL')。
additional—options
给出应用本测试的特定成员的任何特殊行为。例如,'broken'或者'set'。 如果没有用,名字的这个部分可能被忽略掉。
赋予缓存变鼠的值不能含有新行。通常,它们的是将是布尔('yes'或'no')或者文件名或者函数名 所以,这并不是一个重要的限制。
缓存文件
缓存文件是一个缓存了在一个系统上进行配置测试的结果,以便在配置脚本和配置的运行之间共享的shell脚本。 它对于其他系统来说是没有用的。如果它的内容因为某些原因而变得无效了,用户可以删除或者编辑它。
在缺省情况下,configure把'./config.cache'作为缓存文件,如果它还不存在,就创建它。 configure接受选
项'--cache-file=file'以使用不同的缓存文件 这就是configure在调用子目录中的configure脚本时所作的工作。 关于使用宏AC—CONFIG—SUBDIRS在子目录中进行配置的信息,参见 在子目录中配置其它包 。
给出'--cache-file=/dev/null'会关闭缓存,这是为调试configure提供的。 只有在调用'config.status'时给出选
项'--recheck',这将导致它重新运行configure, 它才会注意到缓存文件。如果你预计需要一个长的调试时期,你还可以通过在'configure.in'的开头重新定义 缓存宏而关闭对configure脚本的装入和储存:
define([AC—CACHE—LOAD], )dnl define([AC—CACHE—SAVE], )dnl AC—INIT(whatever)... rest of configure.in ...试图为特定的系统类型发布缓存文件是错误的。这里存在太多的导致错误的空间,并带来太多的用于维护它们的管理开销。 对于任何不能被自动猜测出来的特征,应使用规范系统类型和连接文件的方法(参见 手工配置 )。
在特定系统中,每当有入运行configure脚本时,缓存文件将逐渐积累起来 缓存文件在一开始并不存在。 运行configure会把新的缓存结果与现存的缓存文件结合起来。为了让它透明地工作,只要每次都使用相同的C编译器, 站点初始化(site initialization)脚本可以指定一个站点范围(site—wide)的缓存文件以代替缺省的缓存文件。 (参见 设定本地缺省值 )。
如果你的配置脚本,或者configure.in中的宏调用,偶尔导致配置过程的失败,在几个关键点进行缓存可能是有用的。 在有希望修正导致上次运行的错误的时候,这样做将减少重新运行configure脚本的时间。
... AC—INIT, etc. ...dnl checks for programs AC—PROG—CC AC—PROG—GCC—TRADITIONAL... more program checks ... AC—CACHE—SAVEdnl checks for libraries AC—CHECK—LIB(nsl, gethostbyname) AC—CHECK—LIB(socket, connect)... more lib checks ... AC—CACHE—SAVEdnl Might abort... AM—PATH—GTK(1.0.2, , exit 1) AM—PATH—GTKMM(0.9.S, , exit 1)打印消息
configure脚本需要为运行它们的用户提供几种信息。下列的宏为每种信息以适当的方式打印消息。 所有宏的参数都应该由shell双引号括起来,以便shell可以对它们进行变鼠替换和反引号替换。你可以把消息用 m4引用字符括起来以打印包含括号的消息:AC—MSG—RESULT([never mind, I found the BASIC compiler])这些宏都是对shell命令echo的苤装。configure应该很少需要直接运行echo来为 用户打印消息。使用这些宏使得修改每种消息如何打印及何时打印变得容易了 这些修改只需要对宏的定义进行就行了, 而所有的调用都将自动地改变。
宏: AC_MSG_CHECKING feature—description)
告知用户configure正在检查特定的特征。本宏打印一条以'checking '开头,以'...' 结尾,而且不带新行的消息。它必须跟随一条对AC—MSG—RESULT的调用以打印检查的结果和新行。 feature—description应该是类似于 'whether the Fortran compiler accepts C++ comments'或者'for c89'的东西。
如果运行configure给出了选项'--quiet'或者选项'--silent',本宏什么也不打印。 宏: AC_MSG_RESULT result—description)
告知用户测试的结果。result—description几乎总是检查的缓存变鼠的值,典型的值是'yes'、 'no'或者文件名。本宏应该
在AC—MSG—CHECKING之后调用,并且result—description 应该完成由AC—MSG—CHECKING所打印的消息。
如果运行configure给出了选项'--quiet'或者选项'--silent',本宏什么也不打印。 宏: AC_MSG_ERROR error—description)
告知用户一条使configure不能完成的错误。本宏在标准错误输出中打印一条错误消息并且以非零状态退出
configure。error—description应该是类似于'invalid value $HOME for \$HOME'的东西。宏: AC_MSG_WARN problem—description)
告知configure的使用者可能出现的问题。本宏在标准错误输出中打印消息 configure缝续向后运行, 所以调
用AC—MSG—WARN的宏应该为它们所警告的情况提供一个缺省的(备份)行为。 problem—description应该是类似于'ln -s seems to make hard links'的东西。
下列两个宏是AC—MSG—CHECKING和AC—MSG—RESULT的过时的替代版本。 宏: AC_CHECKING feature—description)
除了在feature—description之后打印新行,本宏与AC—MSG—CHECKING相同。 它主要用于打印对一组特征测试的整体目的的描述,
例如:
AC—CHECKING(if stack overflow is detectable)宏: AC_VERBOSE result—description)
除了应该在AC—CHECKING,而不是在AC—MSG—CHECKING之后调用,本宏与AC—MSG—RESULT相同 它在打印消息前首先打印一个tab。它已经过时了。