2009-10-27 54 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