2

应该如何重置 AC_CACHE_CHECK?

在 autoconf 中,我正在检查标题。我添加了一些逻辑来尝试在可能不在默认包含路径中的 std 文件夹中查找头文件。我这样做的方法是首先尝试使用内置的 AC_CHECK_HEADER 查找头文件。如果找不到标头,我修改 CPPFLAGS 并重试。

问题在于 autoconf 的缓存。我想强制检查(或绕过缓存检查。)如果我不强制检查,无论 autoconf 是否找到标头,它都会拉取它在第一次检查中找到的内容,呃。

谢谢,陈兹

4

2 回答 2

2

取消设置缓存变量,例如ac_cv_header_syslog_h. 您可以检查config.log您感兴趣的缓存变量的确切拼写。不幸的是,取消设置 shell 变量不能移植。Autoconf 使用的内部解决方法是 using ,如果支持$as_unset,它会扩展到。unset所以你可以写:

$as_unset ac_cv_header_syslog_h

不过,这应该适用于当今最合理的系统。

更好和更直接的解决方案可能是CPPFLAGS为第一轮检查正确设置。正如您所注意到的,您正在尝试的内容并没有得到真正的支持。

于 2010-01-10T22:21:22.313 回答
2

我已经实现了一个小宏,它可以完成这项工作(至少对我来说)。通过细微的更改,它可用于使其他缓存变量无效:

# SYNOPSIS
#
# AX_RESET_HEADERS_CACHE(headers ...)
#
# DESCRIPTION
#
# This macro invalidates the headers cache variables created by previous AC_CHECK_HEADER/AC_CHECK_HEADERS checks.
#
AC_DEFUN([AX_RESET_HEADERS_CACHE], [
    AS_FOR([AX_var], [ax_var], [$1], [
        dnl You can replace "ac_cv_header_" with any prefix from http://www.gnu.org/software/autoconf/manual/html_node/Cache-Variable-Index.html
        AS_VAR_PUSHDEF([ax_Var], [ac_cv_header_${ax_var}])
        AS_UNSET([ax_Var])
        AS_VAR_POPDEF([ax_Var])
    ])
]) # AX_RESET_HEADERS_CACHE

和用法(在这个循环中 $1 = 一些库(例如“netpbm”),$2 = 标头(例如“pbm.h ppm.h”),$3 = 位置(例如“/usr/include /usr/local/include”) ):

for ac_test_location in $3 
do
    dnl Save the current state
    ax_probe_library_save_CPPFLAGS=${CPPFLAGS}

    CPPFLAGS="$CPPFLAGS -I${ac_test_location}"

    AC_MSG_CHECKING([$1 for $2 in ${ac_test_location}])
    AS_ECHO()
    _AS_ECHO_LOG([CPPFLAGS="${CPPFLAGS}"])

    AC_CHECK_HEADERS([$2], [ac_lib_$1=yes], [ac_lib_$1=no])

    dnl We have found the location, leave the loop:
    if test "${ac_lib_$1}" = "yes"
    then
        break;
    fi

    dnl Restore the state to original in case of unsuccessful attempt
    CPPFLAGS=${ax_probe_library_save_CPPFLAGS}
    AX_RESET_HEADERS_CACHE([$2])
done
于 2010-08-16T09:06:47.843 回答