Next: , Up: Dependencies Between Macros


9.4.1 マクロの必要条件

書いているマクロが,以前に他のマクロが計算した値を使用する必要があるかも しれません.例えば,AC_DECL_YYTEXTは,flexlex の 出力を調査するので,シェル変数 LEXを設定するために, AC_PROG_LEXが最初に呼び出されていることに依存します.

マクロのユーザにそれら間の依存性を追跡させるより,自動的にするために AC_REQUIREを使用することが可能です.AC_REQUIREは,必要な 場合のみマクロが呼び出され,そして一度だけ呼び出されることを保証します.

— Macro: AC_REQUIRE (macro-name)

M4マクロmacro-nameがまだ呼び出されていない場合,それを(引数無しで) 呼び出します.角カッコでmacro-nameを囲んでいることを確認してくださ い.macro-nameは,AC_DEFUNを使用して定義されている,または 呼び出されていることを示すAC_PROVIDEの呼び出しを含んでいる必要が あります.

AC_REQUIREAC_DEFUNマクロの内部で使用する必要があります. それはトップレベルから呼び出してはいけません.

AC_REQUIREはよく誤解されます.一つのマクロが他のものに依存してい る場合,後者は前者の本体の前に展開されるように,それはマクロ間の 依存性を実装しています.特に,‘AC_REQUIRE(FOO)’は,FOO の本 体では置換されません.例えば,マクロを以下のように定義したとします.

     AC_DEFUN([TRAVOLTA],
     [test "$body_temperature_in_celsius" -gt "38" &&
       dance_floor=occupied])
     AC_DEFUN([NEWTON_JOHN],
     [test "$hair_style" = "curly" &&
       dance_floor=occupied])
     
     AC_DEFUN([RESERVE_DANCE_FLOOR],
     [if date | grep '^Sat.*pm' >/dev/null 2>&1; then
       AC_REQUIRE([TRAVOLTA])
       AC_REQUIRE([NEWTON_JOHN])
     fi])

これをconfigure.acで使用します.

     AC_INIT
     RESERVE_DANCE_FLOOR
     if test "$dance_floor" = occupied; then
       AC_MSG_ERROR([cannot pick up here, let's move])
     fi

それは以下のように展開されるので,土曜日の夜以外に仲間に会う機会が残って いません.

     test "$body_temperature_in_Celsius" -gt "38" &&
       dance_floor=occupied
     test "$hair_style" = "curly" &&
       dance_floor=occupied
     fi
     if date | grep '^Sat.*pm' >/dev/null 2>&1; then
     
     
     fi

この動作は意図的に選択されました.(i) それは要求されるマクロのメッセージ が,要求しているマクロのメッセージとして解釈されることを妨げます.(ii) それは,シェルの条件文が使用されるときひどく驚くことを妨げます.以下のよ うになります.

     if ...; then
       AC_REQUIRE([SOME_CHECK])
     fi
     ...
     SOME_CHECK

マクロの最初に全てのAC_REQUIREを書き込むことを推奨します.空の行 が残ることを避けるため,dnlを使用することが可能です.