来自irssi的真实例子:
https://github.com/irssi/irssi/blob/master/configure.ac#L824
众所周知,autotools会从configure
文件生成configure.ac
脚本。反过来,configure.ac
文件有AC_ARG_WITH
和AC_ARG_ENABLE
宏的数量,后面定义可以传递给--enable-foo
脚本的--with-foo
或configure
选项。
在上面的示例中,libutf8proc支持通过ac_cv_lib_utf8proc_utf8proc_version
选项进行控制,如果将export ac_cv_lib_utf8proc_utf8proc_version=no
传递给当前的env,libutf8proc将在配置阶段被忽略。
问题是这些变量是什么?为什么不使用标准配置宏?最后一个,是否记录了这些变量的列表,或者它们都在项目中单独定义>
问题是这些变量是什么?
在一般意义上,这些变量用于记忆(缓存)通过configure
执行的检查的结果,因此它不需要多次执行它们。你可能还记得在configure
输出中看到它的效果:每当configure
依赖于缓存结果而不是实际执行测试时,它会在结果中通过将结果注释为“(缓存)”来报告它。也可以将结果缓存到文件中,以便在configure
运行中重复使用。
在任何情况下,这些变量由各种标准Autoconf宏设置和使用,例如AC_CHECK_LIBS
等。 Autoconf保留shell变量,其名称以ac_
或AC_
开头供自己使用。您不应该在导出任何此类变量的环境中运行configure
脚本。
Autoconf手册包含有关缓存的more information。
为什么不使用标准配置宏?
您提供的特定示例是使用标准宏。有问题的变量是反映项目的configure.ac
其他地方出现的测试结果的变量:
AC_CHECK_LIB([utf8proc], [utf8proc_version])
如果要检索Autoconf测试的缓存结果,则读取相应缓存变量的值是执行此操作的标准方法。变量遵循标准命名方案,以使其相对容易。然而,这是一件不寻常的事情。
最后一个,是否记录了这些变量的列表,或者它们都在项目中单独定义>
Autoconf手册记录了Autoconf本身提供和使用的那些,甚至还有an index devoted to them。个别项目也可以创建自己的项目,但当然这些将不会在Autoconf手册中讨论。
irssi维护者决定,也许是错误的,libutf8proc不需要配置开关(因为它是程序运行的可选项,我猜)
autoconf将从此行合成cv变量名称
https://github.com/irssi/irssi/blob/c1b604ee6a810d8ac5959b4681c0f6da0f14fde3/configure.ac#L332
AC_CHECK_LIB([utf8proc],[utf8proc_version])