次: , 前: Shell Script Compiler, 上: Writing configure.ac


3.1.2 Autoconf言語

Autoconf言語は,プレーンテキスト同様に実際のコードを扱うので,多くの他の コンピュータ言語と全く異なります.例えばCでは,データと命令は全く異なる 構文上のステータスとなりますが,Autoconfでは,それらのステータスは厳密に 同じです.このため,我々はリテラル文字列を展開されたテキストと区別する手 段が必要です.それは引用符です.

引数があるマクロを呼び出すとき,マクロ名と開いているカッコの間に空白があっ てはなりません.引数は,M4の引用符文字`['と`]'で囲み,カンマで 分けるべきです.引数が単純なテキストのときは,引用符がなくても大丈夫かも しれませんが,他のマクロの呼び出しのような複雑な引数は,常に引用 符で囲んでください.この規則は,他のマクロからの呼び出しを含め,全てのマ クロ呼び出しで再帰的に適用されます.

例えば,以下のようにします.

     AC_CHECK_HEADER([stdio.h],
                     [AC_DEFINE([HAVE_STDIO_H])],
                     [AC_MSG_ERROR([Sorry, can't do anything for you])])

これは,正しく引用符で囲まれます.その引用を以下のように単純にしても大丈 夫かもしれません.

     AC_CHECK_HEADER(stdio.h,
                     [AC_DEFINE(HAVE_STDIO_H)],
                     [AC_MSG_ERROR([Sorry, can't do anything for you])])

AC_MSG_ERRORの引数は,引用符で囲まれたままだということに注意して ください.そうしない場合は,カンマは引数を分離するものとして解釈されるで しょう.

以下の例は,引用符で囲まれていないので,間違っていて危険です.

     AC_CHECK_HEADER(stdio.h,
                     AC_DEFINE(HAVE_STDIO_H),
                     AC_MSG_ERROR([Sorry, can't do anything for you]))

場合によっては,マクロ呼び出しのようなテキストを使用する必要があるかもし れません.マクロ引数として渡されないときでもテキストは引用符で囲む必要が あります.

     echo "Hard rock was here!  --[AC_DC]"

結果として以下のようになります.

     echo "Hard rock was here!  --AC_DC"

同じテキストをマクロ引数で使用するときは,そのために余分な引用符レベルを 追加する必要があります(一つはマクロ置換で削除されるためです).従って一般 的に,全てのリテラル文字列の引数に対して二重に引用符を使用すること は良い考えです.

     AC_MSG_WARN([[AC_DC stinks  --Iron Maiden]])

絶えず誤解されていたAutoconfの構成物の一つを,今では理解できるでしょう ....第一の規則は,マクロ展開が予測されるところでは,引用符の 展開を予測してくださいということです.すなわち,引用符のレベルの一つが 失われるということです.例えば,以下のようにします.

     AC_COMPILE_IFELSE([char b[10];],, [AC_MSG_ERROR([you lose])])

これは正しいものです.ここで,AC_COMPILE_IFELSE最初の引数は, `char b[10];'で,一度展開されて,結果として`char b10;'になりま す.(M4のchangequoteプリミティブを用いてこの問題を解決することが, 一般的な慣習として以前のAutoconfにありましたが,それを使用しないでくださ い!)さて,より詳しく見てみましょう.もう一方では,第一引数はリテラルと して理解され,そのためそれは引用符で二重に囲む必要があります.

     AC_COMPILE_IFELSE([[char b[10];]],, [AC_MSG_ERROR([you lose])])

Voilà,今回は実際に`char b[10];'を生成しているのです!

注意深く読んでいると,これらのガイドラインによれば,上記の例の AC_CHECK_HEADERで引用符で“正しく”囲まれているものは,実際には三 組の引用符が足りないことに気付くでしょう!それにもかかわらず,可読性のた め,リテラルを二重に引用符で囲むことは,このマニュアルでは必要なところで のみ使用されます.

オプションの引数を受け入れるマクロもあり,それはこのドキュメントでは(引 用符の文字を使用して混乱しないように),[arg]として表現します.空の ままにしたり,明示的に引数を空にするために`[]'を使用したり,単純に 後置されるカンマを省略したりすることが可能です.以下の三行は等価となりま す.

     AC_CHECK_HEADERS(stdio.h, [], [], [])
     AC_CHECK_HEADERS(stdio.h,,,)
     AC_CHECK_HEADERS(stdio.h)

configure.acでは,単独行にそれぞれのマクロ呼び出しを書くことが最 善です.ほとんどのマクロは,余分な改行を加えません.それらは,コマンドを 終端するためのマクロ呼び出しの後の改行に依存しています.このアプローチで は,生成されたconfigureスクリプトを,多くの空白行を挿入するこ となく,若干読みやすくします.シェルは,改行に干渉されることなく割り当て ることが可能なので,シェル変数をマクロ呼び出しと同じ行で設定すると,通常 は安全です.

configure.acファイルに`#'で始まるコメントを含めることも可能 です.例えば,以下のような行をconfigure.acファイルの最初に書くと 役に立つでしょう.

     # Process this file with autoconf to produce a configure script.