来自irssi的真实示例:
https://github.com/irssi/irssi/blob/master/configure.ac#L824
众所周知,自动工具会从configure
文件生成configure.ac
脚本。反过来,configure.ac
文件具有多个AC_ARG_WITH
和AC_ARG_ENABLE
宏,其后缀定义--enable-foo
或--with-foo
选项,这些选项可以传递给{{1} }脚本。
在上面的示例中,通过configure
选项控制libutf8proc的支持,如果将ac_cv_lib_utf8proc_utf8proc_version
传递给当前环境,则在配置阶段将忽略libutf8proc。
问题是这些变量是做什么用的?为什么不使用标准的配置宏?最后一个是在文档中某处列出了这些变量的列表,还是在项目中单独定义了所有变量>
答案 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])