2009-10-27 67 views
2

AC_CACHE_CHECK应该如何重置?AC_CACHE_CHECK应该如何重置?

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

与此问题是autoconf的缓存。我想强制执行检查(或绕过缓存检查)。如果我不强制执行,autoconf是否找到头文件,它将取得在第一次检查中发现的内容,呃。

谢谢, Chenz

+0

没有答案适合您? – 2011-10-10 21:59:20

回答

2

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

$as_unset ac_cv_header_syslog_h 

虽然这应该在现今最合理的系统中工作。

一个更好更直接的解决方案可能是为第一轮检查正确设置CPPFLAGS。正如你注意到的,你所尝试的并不是真正的支持。

+0

感谢您的评论。我会建议使用autoconf样式的'AS_UNSET([var_name])'功能。我在'AC_CHECK_HEADERS'的顶部编写了我自己的函数,问题是我事先不知道要取消设置的变量名(但是我知道头文件)。我想我需要重建这个名字。你能推荐什么? – 2010-08-12 14:36:20

+0

@PeterEisentraut我不知道AC_CACHE_CHECK的缓存结果的用法是什么 – Bionix1441 2017-04-03 13:22:14

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