如何重置AC_CACHE_CHECK?
在autoconf中我正在检查标题。我添加了一些逻辑,试图在std文件夹中找到可能不在默认包含路径中的头文件。我这样做的方法是首先尝试使用内置的AC_CHECK_HEADER查找头文件。如果找不到标题,我会修改CPPFLAGS并重试。
这个问题是autoconf的缓存。我想强制检查(或绕过缓存检查。)如果我不强制它,无论autoconf是否找到标题,它将拉出它在第一次检查中发现的东西,呃。
谢谢, Chenz
答案 0 :(得分:2)
取消设置缓存变量,例如ac_cv_header_syslog_h
。您可以检查config.log
您感兴趣的缓存变量的确切拼写。不幸的是,取消设置shell变量无法移植。 Autoconf使用的内部解决方法是使用$as_unset
,如果支持,则会扩展为unset
。所以你可以写:
$as_unset ac_cv_header_syslog_h
尽管如此,这应该适用于大多数合理的系统。
更好,更直接的解决方案可能是为第一轮检查正确设置CPPFLAGS
。正如你所注意到的那样,你所尝试的并不是真的受到支持。
答案 1 :(得分: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 /”包括“)):
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