書いているマクロが,以前に他のマクロが計算した値を使用する必要があるかも
しれません.例えば,AC_DECL_YYTEXT
は,flex
やlex
の
出力を調査するので,シェル変数 LEX
を設定するために,
AC_PROG_LEX
が最初に呼び出されていることに依存します.
マクロのユーザにそれら間の依存性を追跡させるより,自動的にするために
AC_REQUIRE
を使用することが可能です.AC_REQUIRE
は,必要な
場合のみマクロが呼び出され,そして一度だけ呼び出されることを保証します.
M4マクロmacro-nameがまだ呼び出されていない場合,それを(引数無しで) 呼び出します.角カッコでmacro-nameを囲んでいることを確認してくださ い.macro-nameは,
AC_DEFUN
を使用して定義されている,または 呼び出されていることを示すAC_PROVIDE
の呼び出しを含んでいる必要が あります.
AC_REQUIRE
はAC_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
を使用することが可能です.