Previous: Obsoleting Macros, Up: Writing Autoconf Macros


9.6 コーディングスタイル

Autoconfマクロはスクリプトコーディングスタイルに従います.以下のスタイル に従うように推奨し,特に,Autoconf自身に寄稿したり,その他の目的で,マク ロを配布する目的がある場合はそうしてください.

最初に必要なことは,引用符に大きく注意を払うことです.詳細は, Autoconf LanguageM4 Quotationを参照してください.

新たなインターフェースの発明は試みないでください.定義しているマクロに似 ているAutoconfマクロが存在することはよくあります.この既存のインターフェー スに従ってみてください(引数の順序,デフォルト値,等々).我々は,これらの インターフェースに完全でないものがあることは,意識しています.そ れにもかかわらず,無害なときは,創造性より均質性が好まれるでしょう.

M4シンボル間とシェル変数間の両方の衝突に注意してください.

推奨されるM4命名規則(see Macro Names)に従う場合,衝突が生じることは あまりないでしょう.それにもかかわらず,特殊な値を設定する必要があるとき, 通常のマクロ名を使用することを避けてください.“信じられない”名 前を使用する代わりです.例えば,バージョン2.13までは,通常のマクロ名 AC_SUBST_symbolを設定することで既に定義されている symbolを記憶するため,マクロAC_SUBSTを使用していました.し かし,AC_SUBST_FILEと命名されているマクロが存在するので, ‘AC_SUBST(FILE)’を使用することはできませんでした!この場合, AC_SUBST(symbol)_AC_SUBST(symbol)が使用され るべきでした(そうです,カッコは使用します)...または,より良い方法と して,AC_EXPAND_ONCEのようなハイレベルのマクロを使用すべきでした.

Autoconfマクロは,ユーザ変数の名前空間に入るべきではありません.すなわち, 実際のマクロの実行結果となる変数以外の,全てシェル変数はac_ で始 めるべきです.さらに,小さなマクロや他のマクロに埋め込まれるようなマクロ は,明示的な名前を使用しないように注意すべきです.

コメントを導入するために,dnlを使用しないでください.書こうとして いるコメントのほとんどは,出力されないヘッダコメント,または, configureに書かれるべきコメントです.特殊なM4の構成のコメントが欲 しい場合は例外があり,その場合はdnlが正しいのですが,あまりないこ とだということを覚えておいてください.

M4は,引数に前置されるスペースを無視します.呼び出されているマクロの開カッ コに,引数が整列するように字下げするために,この特徴を使用してください. 例えば,以下の代わりを考えます.

     AC_CACHE_CHECK(for EMX OS/2 environment,
     ac_cv_emxos2,
     [AC_COMPILE_IFELSE([AC_LANG_PROGRAM(, [return __EMX__;])],
     [ac_cv_emxos2=yes], [ac_cv_emxos2=no])])

以下のように書いてください.

     AC_CACHE_CHECK([for EMX OS/2 environment], [ac_cv_emxos2],
     [AC_COMPILE_IFELSE([AC_LANG_PROGRAM([], [return __EMX__;])],
                        [ac_cv_emxos2=yes],
                        [ac_cv_emxos2=no])])

または,以下のようにしてください.

     AC_CACHE_CHECK([for EMX OS/2 environment],
                    [ac_cv_emxos2],
                    [AC_COMPILE_IFELSE([AC_LANG_PROGRAM([],
                                                        [return __EMX__;])],
                                       [ac_cv_emxos2=yes],
                                       [ac_cv_emxos2=no])])

AC_RUN_IFELSEや,クロスコンパイルで動作不可能なマクロを使用してい るとき,悲観的な値(通常は‘no’)を提供してください.

構文をハイライト表示するエディタのような,補助ツールが不適切に動作するこ とを避けるため,様々な手段を自由に使用してください.例えば以下を考えます.

     m4_bpatsubst([$1], [$"])

以下を使用してください.

     m4_bpatsubst([$1], [$""])

それは,Emacsenが最初の引用符で終りのない“文字列”を開いたままにしない ようにするためです.同じ理由から以下のようなことは避けてください.

     test $[#] != 0

以下を使用してください.

     test $[@%:@] != 0

そうしない場合,閉カッコは‘#’コメント内に隠され,Emacsenのカッコ一 致のハイライト表示を破壊します.好ましいスタイルは,M4からエスケープされ るように注意してください.‘$[1]’,‘$[@]’,等です.不必要なと きにエスケープしないようにしてください.意味のない引用符の一般的な例は, ‘[$]$1’(‘$$1’と書いてください),‘[$]var’(‘$var’を使 用してください),等です.移植性の問題をこの状態に加える場合, ‘"[$]@"’より‘${1+"$[@]"}’にした方が良く,Autoconfをハッキ ングするより何か他のことをした方が良いでしょう:-)

sedを使用しているとき,字下げの目的以外で-eを使用しな いでください.sコマンドを用いた場合,‘/’自身がコマンドで使用 されない限り,優先されるセパレータは‘/’にし,コマンドで使用される場 合は‘,’を使用すべきです.

マクロ定義の方法の詳細は,See Macro Definitions. マクロで AC_REQUIREを使用しておらず,AC_REQUIREディレクティブのオブ ジェクトがないことを期待する場合,m4_defineを使用してください.疑 わしい場合は,AC_DEFUNを使用してください.全てのAC_REQUIRE 文は,dnlされているマクロの最初に書くべきです.

引数の数に依存すべきではありません.引数が足りないことを調査する代わりに, 空でないことをテストしてください.より簡単でより予測可能なインターフェー スをユーザに提供し,余分な引数に対する余地を節約してください.

マクロが短くない場合は,行の最初に‘])’を残し,定義されているマクロ の名前を繰り返すコメントを続けてください.これは,configureに 余分な改行を導入します.通常は問題ありませんが,削除したい場合は,行の最 後に‘[]dnl’を使用することが可能です.同様に,マクロ呼び出しの後に, 改行を削除するため,‘[]dnl’を使用することも可能です.M4が‘dnl’ をテキストやマクロ出力の前に付けられているものとして解釈しないことを確実 にするため,‘[]dnl’は‘dnl’の代わりとして推奨されています.例え ば以下の代わりを考えます.

     AC_DEFUN([AC_PATH_X],
     [AC_MSG_CHECKING([for X])
     AC_REQUIRE_CPP()
     # ...omitted...
       AC_MSG_RESULT([libraries $x_libraries, headers $x_includes])
     fi])

以下のように書くべきです.

     AC_DEFUN([AC_PATH_X],
     [AC_REQUIRE_CPP()[]dnl
     AC_MSG_CHECKING([for X])
     # ...omitted...
       AC_MSG_RESULT([libraries $x_libraries, headers $x_includes])
     fi[]dnl
     ])# AC_PATH_X

マクロが長い場合,論理的な塊に分けてみてください.通常マクロは,関数のバ グを調査し,このセットアップを実行するための補助マクロがある AC_LIBOBJの置換を準備します.コードの要素に補助マクロを導入するこ とをためらわないでください.

推奨されるコーディングスタイルを強調するために,古い手法で書かれているマ クロを紹介します.

     dnl Check for EMX on OS/2.
     dnl _AC_EMXOS2
     AC_DEFUN(_AC_EMXOS2,
     [AC_CACHE_CHECK(for EMX OS/2 environment, ac_cv_emxos2,
     [AC_COMPILE_IFELSE([AC_LANG_PROGRAM(, return __EMX__;)],
     ac_cv_emxos2=yes, ac_cv_emxos2=no)])
     test "$ac_cv_emxos2" = yes && EMXOS2=yes])

新しい方法は以下のようにします.

     # _AC_EMXOS2
     # ----------
     # Check for EMX on OS/2.
     m4_define([_AC_EMXOS2],
     [AC_CACHE_CHECK([for EMX OS/2 environment], [ac_cv_emxos2],
     [AC_COMPILE_IFELSE([AC_LANG_PROGRAM([], [return __EMX__;])],
                        [ac_cv_emxos2=yes],
                        [ac_cv_emxos2=no])])
     test "$ac_cv_emxos2" = yes && EMXOS2=yes[]dnl
     ])# _AC_EMXOS2