Next: , Previous: Setting Output Variables, Up: Results


7.3 結果のキャッシュ

様々なconfigureスクリプトで,同じ特徴を繰り返し調査する(あるい は何度も一つのスクリプトを実行する)ことを避けるため,configure は,多くの調査結果をキャッシュファイル(cache file)に保存します (see Cache Files).キャッシュ可能な状態でconfigure スクリ プトを実行していてキャッシュファイルが見つかった場合,前回の実行結果を キャッシュから読み込み,これらの調査の再実行を避けます.結果として, configureは,毎回全ての調査を実行するより早くなります.

— Macro: AC_CACHE_VAL (cache-id, commands-to-set-it)

cache-idで識別した調査結果が,利用可能だということを保証します.調 査結果が読み込まれたキャッシュファイルにあり,configureに, ‘--quiet’や‘--silent’オプションが与えられていない場合,結果が キャッシュされていることを示すメッセージを出力します.それ以外では,シェ ルコマンドcommands-to-set-itを実行します.シェルコマンドを値を決定 するために実行する場合,configureが出力ファイルを作成する直前 に,値をキャッシュファイルに保存します.cache-id変数の名前を選択す る方法は,See Cache Variable Names.

commands-to-set-itは,設定された変数cache-id以外に副作 用がないはずです.以下を参照してください.

— Macro: AC_CACHE_CHECK (message, cache-id, commands-to-set-it)

メッセージ出力に注意が必要なAC_CACHE_VALのラッパーです.このマク ロは,これらのマクロを使用する最も一般的な方法に対して,便利な略記法を提 供します.それは,messageに対してAC_MSG_CHECKINGを呼び出し, その後で,cache-idcommands引数を伴うAC_CACHE_VALと, cache-idを伴うAC_MSG_RESULTを呼び出します.

commands-to-set-itは,設定された変数cache-id以外に副作 用がないはずです.以下を参照してください.

commands-to-set-itAC_DEFINEの呼び出しを試みるため, AC_CACHE_VALAC_CACHE_CHECKを使用しているバグの多いマクロ を発見することはよくあります.その代わりに,AC_CACHE_VALを呼び出 している以下のようなコードでは,キャッシュ変数の値を調べることで, AC_DEFINEを呼び出すべきです.例えば,以下のマクロは駄目です.

     AC_DEFUN([AC_SHELL_TRUE],
     [AC_CACHE_CHECK([whether true(1) works], [ac_cv_shell_true_works],
                     [ac_cv_shell_true_works=no
                      true && ac_cv_shell_true_works=yes
                      if test $ac_cv_shell_true_works = yes; then
                        AC_DEFINE([TRUE_WORKS], 1
                                  [Define if `true(1)' works properly.])
                      fi])
     ])

これは,キャッシュが利用可能な場合,失敗します.このマクロの二回目の実行 で,TRUE_WORKS定義されていないでしょう.適切な実装は以下 のようになります.

     AC_DEFUN([AC_SHELL_TRUE],
     [AC_CACHE_CHECK([whether true(1) works], [ac_cv_shell_true_works],
                     [ac_cv_shell_true_works=no
                      true && ac_cv_shell_true_works=yes])
      if test $ac_cv_shell_true_works = yes; then
        AC_DEFINE([TRUE_WORKS], 1
                  [Define if `true(1)' works properly.])
      fi
     ])

また,commands-to-set-itでは,例えばAC_MSG_CHECKINGを用いて メッセージを出力すべきではありません.調査の結果がキャッシュから取り出さ れるか,シェルコマンドの実行で決定されるかに依存せずメッセージが出力され るので,AC_CACHE_VALの呼び出しの前にしてください.