2

AC_CACHE_CHECK はどのようにリセットする必要がありますか?

autoconf でヘッダーをチェックしています。デフォルトのインクルード パスにない可能性のある std フォルダー内のヘッダー ファイルを見つけるのを少し難しくするためのロジックを追加しました。私がこれを行う方法は、最初に AC_CHECK_HEADER が組み込まれたヘッダー ファイルを見つけようとすることです。ヘッダーが見つからない場合は、CPPFLAGS を変更して再試行します。

これに関する問題は、autoconf のキャッシングです。チェックを強制する (またはキャッシュ チェックをバイパスする) 必要があります。強制しない場合、autoconf がヘッダーを見つけるかどうかに関係なく、最初のチェックで見つかったものを取得します。

ありがとう、チェンツ

4

2 に答える 2

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 に答える
2

などのキャッシュ変数を設定解除しますac_cv_header_syslog_h。関心のあるキャッシュ変数の正確なスペルを確認できconfig.logます。残念ながら、シェル変数の設定を解除することは、移植可能に行うことができません。Autoconf が使用する内部的な回避策は usingであり、サポートされている場合$as_unsetは展開されます。unsetしたがって、次のように書くことができます。

$as_unset ac_cv_header_syslog_h

ただし、これは最近のほとんどの合理的なシステムで機能するはずです。

より適切で簡単な解決策はCPPFLAGS、最初のチェック ラウンドで正しく設定することです。お気づきのように、あなたがしようとしていることは実際にはサポートされていません。

于 2010-01-10T22:21:22.313 に答える