为了避免在各种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_specific-value[additional-options]
例如,`accv_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_SAVE
dnl checks for libraries
AC_CHECK_LIB(nsl, gethostbyname)
AC_CHECK_LIB(socket, connect)
… more lib checks …
AC_CACHE_SAVE
dnl Might abort…
AM_PATH_GTK(1.0.2, , exit 1)
AM_PATH_GTKMM(0.9.5, , exit 1)