什么是自动工具中的缓存变量?

时间:2019-02-17 19:36:10

标签: autotools autoconf automake build-system

来自irssi的真实示例:

https://github.com/irssi/irssi/blob/master/configure.ac#L824

众所周知,自动工具会从configure文件生成configure.ac脚本。反过来,configure.ac文件具有多个AC_ARG_WITHAC_ARG_ENABLE宏,其后缀定义--enable-foo--with-foo选项,这些选项可以传递给{{1} }脚本。

在上面的示例中,通过configure选项控制libutf8proc的支持,如果将ac_cv_lib_utf8proc_utf8proc_version传递给当前环境,则在配置阶段将忽略libutf8proc。

问题是这些变量是做什么用的?为什么不使用标准的配置宏?最后一个是在文档中某处列出了这些变量的列表,还是在项目中单独定义了所有变量>

2 个答案:

答案 0 :(得分:1)

  

问题是这些变量是做什么用的?

通常来说,这些变量用于记住(缓存)通过configure执行的检查结果,因此不需要重复执行一次以上操作。您可能还记得在configure输出中看到的效果:每当configure依赖于缓存的结果而不是实际执行测试时,它都会在输出中报告该结果,方法是将结果注释为“((缓存)”) 。还可以将结果缓存到文件中,以在configure次运行中重复使用。

无论如何,这些变量由各种标准的Autoconf宏(例如AC_CHECK_LIBS等)设置和使用。 Autoconf保留名称以ac_AC_开头的shell变量供自己使用。您不应在导出任何此类变量的环境中运行configure脚本。

Autoconf手册包含more information关于缓存的信息。

  

为什么不使用标准的配置宏?

您呈现的特定示例 使用标准宏。有问题的变量是反映该测试结果的变量,该变量出现在项目的configure.ac的其他地方:

AC_CHECK_LIB([utf8proc], [utf8proc_version])

如果要检索Autoconf测试的缓存结果,则读取相应缓存变量的值是这样做的标准方法。变量遵循标准的命名方案,以使其相对容易。但是,那是一件不常见的事情。

  

最后一个是在文档中某个地方列出了这些变量的列表,还是在项目中单独定义了这些变量>

Autoconf手册记录了Autoconf本身提供和使用的文档,甚至有an index devoted to them。单个项目也可以创建自己的项目,但是这些当然不会在Autoconf手册中讨论。

答案 1 :(得分:0)

irssi维护者错误地认为libutf8proc不需要配置开关(我想是因为它对程序的功能是可选的)

autoconf将在此行中合成cv变量名称

https://github.com/irssi/irssi/blob/c1b604ee6a810d8ac5959b4681c0f6da0f14fde3/configure.ac#L332

AC_CHECK_LIB([utf8proc],[utf8proc_version])