【问题标题】:Where are the cached variables stored after running configure?运行configure后缓存的变量存放在哪里?
【发布时间】:2018-11-13 11:17:52
【问题描述】:

运行配置脚本后,我得到一系列输出,上面写着“缓存”。例如:

checking for gcc... gcc
checking for gcc... (cached) gcc
...
checking dependency style of gcc... gcc3
checking dependency style of gcc... (cached) gcc3

为什么这里输出 gcc 两次:一个是“gcc”,另一个是“(cached) gcc”?脚本似乎正在执行两项检查。我以为脚本只会检查缓存中的变量以加快执行速度。

另外,这些缓存文件存储在哪里?根据 autoconf 文档,它说:

configure默认不使用缓存文件,避免意外使用过期缓存文件导致的问题。

因此,默认情况下,配置脚本似乎会缓存某些“检查”。我尝试运行“--config-cache”,并创建了文件“config.cache”。

我也在我的配置脚本中运行了这个:

# optimization flags
if test "x$ac_cv_prog_gcc" = xyes; then
   AC_MSG_CHECKING([AC_CV_PROG_GCC])
   AC_MSG_RESULT("$ac_cv_prog_gcc")
fi

虽然在 config.cache 中找不到变量“ac_cv_prog_gcc”,所以我假设这些缓存的变量存储在其他地方。这些文件在哪里?

【问题讨论】:

    标签: autotools configure


    【解决方案1】:

    为什么这里输出 gcc 两次:一个是“gcc”,另一个是 “(缓存)gcc”?脚本似乎正在执行两次检查。

    脚本遇到两个相同检查的请求。记住第一次的结果而不是第二次执行实际检查是足够聪明的。因为它这样做了,所以它第二次报告结果是从其结果缓存中提取的,而不是从计算的 de novo 中提取的。即使它没有记录缓存文件,它也会在脚本运行期间在内存中缓存结果。

    一般来说,它不能完全禁止重复检查,因为通常有与检查相关联的代码来处理结果,而对于每个冗余检查来说,这不一定是相同的代码。

    我 以为脚本只会检查缓存中的变量以加快速度 执行。

    是的,这正是它正在做的事情。它正在报告它已经这样做了,以及结果。如果它使用在先前运行期间缓存的值或手动输入到缓存中的值,它会通知您,并且它可以在缓存在检查之间被操作时提醒您。如果configure 失败,它还可以帮助您更好地跟踪失败发生的位置。

    另外,这些缓存文件存储在哪里?根据自动配置 文档,它说:

    configure默认不使用缓存文件,避免意外使用过期缓存文件导致的问题。

    所以似乎某些“检查”确实被配置脚本缓存了 默认。

    默认情况下,永久不会缓存任何检查。但是,所有缓存的每个结果都至少在configure 运行期间被缓存,并且如果您启用缓存文件,那么它将用于持久缓存存储。

    我试过运行“--config-cache”,文件 “config.cache”被创建。

    我也在我的配置脚本中运行了这个:

    # optimization flags
    if test "x$ac_cv_prog_gcc" = xyes; then
       AC_MSG_CHECKING([AC_CV_PROG_GCC])
       AC_MSG_RESULT("$ac_cv_prog_gcc")
    fi
    

    在 config.cache 中找不到变量“ac_cv_prog_gcc” 不过,所以我假设这些缓存的变量存储在其他地方。

    我不清楚你期望通过它完成什么。如果你想手动输入一个值到缓存中,那么你应该使用the AC_CACHE_VALUE or AC_CACHE_CHECK macro 来达到这个目的。您似乎没有这样做,您没有看到缓存的变量也就不足为奇了。

    此外,还不清楚您如何使用--config-cache 选项。该选项及其同级应用在每次运行的基础上来控制是否使用持久缓存(读取和写入)。任何名称的缓存文件的存在不足以让您的 configure 脚本在任何给定的运行中实际使用它。

    这些文件在哪里?

    你已经在看它了。如果您对configure 脚本使用--config-cache-C 选项,则缓存存储在config.cache 中。如果改为使用--cache-file=XXX 选项,则缓存存储在您命名的文件中。

    不过,总的来说,请注意(persistent) caching is probably not what you are looking for。如果您正在考虑将其用于特定需求,那么我建议您在单独的问题中直接询问该需求。

    【讨论】:

    • 这清楚了缓存的工作原理。我尝试多次使用“--config-cache”运行configure,它确实说“检查gcc ...(缓存)gcc”两次,这意味着它首先在缓存文件中查找。当我在没有任何选项的情况下进行配置时(即使之前执行 configure --config-cache 存在 config.cache),它会回到不检查缓存进行第一次检查,然后使用缓存进行任何后续检查。
    • 另外,我提到我在缓存文件中找不到变量 $ac_cv_prog_gcc。我进行了一些测试,无论有没有缓存文件,它总是产生“是”,并且需要宏 AC_CHECK_TOOL(CC, gcc) 和 AC_PROG_CC 才能将其设置为“是”。所以 ac_cv_prog_gcc 必须存储在您的答案中提到的内存中结果缓存。
    猜你喜欢
    • 2022-08-18
    • 2022-10-17
    • 1970-01-01
    • 2017-03-26
    • 2010-10-02
    • 2016-08-23
    • 1970-01-01
    • 2010-11-10
    • 1970-01-01
    相关资源
    最近更新 更多