[ << ] [ >> ]           [Top] [Contents] [Index] [ ? ]

7. Writing Macros

複数のソフトウェアパッケージに適用できるOS機能のテストマクロを記述 する場合、新しいマクロとして定義するのが最もよい方法です。 以下ではAutoconfマクロを記述するための手順とガイドラインを示します。

7.1 Macro Definitions  Basic format of an Autoconf macro.
7.2 Macro Names  What to call your new macros.
7.3 Quoting  Protecting macros from unwanted expansion.
7.4 Dependencies Between Macros  What to do when macros depend on other macros.


7.1 Macro Definitions

AutoconfのマクロはAC_DEFUNマクロを使って定義されます。 これはm4defineマクロと類似しています。 AC_DEFUNはマクロを定義する際に、マクロの呼び出し順を 制約するためのコードを加えます(see section 7.4.1 Prerequisite Macros参照)。

Autoconfマクロの定義は以下のようになります:

 
AC_DEFUN(macro-name, [macro-body])

角括弧はオプショナルという意味ではありません; 角括弧はマクロ展開の 問題を避けるため、実際に字面の上でもマクロ定義に記述される必要があります (see section 7.3 Quoting参照)。マクロに渡される引数は、`$1'や`$2'として 参照できます。

m4プログラム内にコメントを記述するためには、m4組み込みの dnlを使ってください; これはm4に次の改行までのテキストを 無視させます。`acsite.m4'と`aclocal.m4'の中のマクロ定義の間には dnlは必要ありません。AC_INITが呼び出されるまでの出力は 無視されるからです。

m4マクロを書く詳細は、See section `How to define new macros' in GNU m4.


7.2 Macro Names

Autoconfマクロの名前は、他の文字列との衝突を避けるため、 全て大文字で、`AC_'で始まっています。内部で使われるshell変数は なるべく全部小文字で、`ac_'で始まっています。 既存の/将来のAutoconfマクロと衝突しないために、 自分で定義するマクロの名前およびshell変数の名前には、 先頭に別の文字列を使うべきです。例えばあなたのイニシャル、組織名や ソフトウェアパッケージの名前の略称などが考えられます。

Autoconfマクロの名前は、ほとんどの場合構造化された名前づけ規則に したがっています。名前はチェックされるOSの機能を示しています。 マクロ名は下線で区切られたいくつかの単語からなり、各単語は 一般的なものから特殊なものへと並んでいます。マクロに対する キャッシュ変数の名前もおなじ規則を使っています(より詳しくは see section 6.3.1 Cache Variable Names参照)。

`AC_'の次にある単語は、調べる対象のOS機能のカテゴリを示しています。 ここに、書く可能性の高いマクロの種類のテストマクロを指定するため、 Autoconfが使うカテゴリがあります。それらはキャッシュ変数でも全て小文字で 使われます。適用可能なものを使ってください。無ければ独自のカテゴリを考え 出してください。

C
C言語組み込みの特徴。
DECL
ヘッダファイルでのC変数の宣言。
FUNC
ライブラリの関数。
GROUP
ファイルのUNIXグループオーナー。
HEADER
ヘッダファイル。
LIB
Cライブラリ。
PATH
プログラムを含むファイルのフルパス名。
PROG
プログラムのベース名。
STRUCT
ヘッダファイルのC構造体の定義。
SYS
OSの特徴。
TYPE
C組み込みや宣言タイプ。
VAR
ライブラリのC変数。

カテゴリ名の次には、テスト対象のOS機能の名前が来ます。 それ以降の単語はそれぞれOSの機能の持つ特定の意味を表しています。 例えば、AC_FUNC_UTIME_NULLutime関数の引数に NULLを与えたときのふるまいをチェックします。

あるマクロの内部サブルーチンとして動作するマクロには、 呼び元マクロ名のあとに、マクロが行うことがらを意味する ひとつ以上の単語をつけた名前をつけるのがよいです。 たとえば、AC_PATH_XAC_PATH_X_XMKMFAC_PATH_X_DIRECTを内部で呼び出すマクロとして使います。


7.3 Quoting

他のマクロに呼び出されるマクロはm4によって複数回評価されます; 通常の文字列がマクロやm4組み込み命令(たとえば`define'や `$1')と勘違いされて評価されないように、各評価ごとにもう1重 quoteする必要があるかもしれません。また、カンマを含むマクロの 引数についてはquoteする必要があります。なぜなら、カンマは各引数を 区切るのに使われるからです。改行を含むマクロの引数を与える場合や、 他のマクロを呼び出す場合にはquoteする方がいいでしょう。

Autoconfは、m4のquote文字を、デフォルトの``'と`''から `['と`]'に変更しています。これは多くのマクロで ``'と`''は対応せずに使われているからです。しかしながら、 ときどき角カッコをマクロ内で使用する必要が出る場合があります (Cプログラムソースや正規表現など)。そのような場合、m4の 組み込み命令changequoteを使って一時的にquote文字を`<<'と `>>'に切替えます(quoteを全く必要としない場合、quote文字に空文字を 指定することでquoteの機能を殺すこともできます)。 以下、例題です:

 
AC_TRY_LINK(
changequote(<<, >>)dnl
<<#include <time.h>
#ifndef tzname /* For SGI.  */
extern char *tzname[]; /* RS6000 and others reject char **tzname.  */
#endif>>,
changequote([, ])dnl
[atoi(*tzname);], ac_cv_var_tzname=yes, ac_cv_var_tzname=no)

configureを新しく書いたマクロを使って生成する場合、 マクロ内にquoteを増やす必要があるかないか注意深く確認しましょう。 もしひとつ異常の単語がm4の出力から落ちていたら、 quoteする必要があります。疑わしいときはとりあえずquoteしましょう。

しかし、quoteしすぎてしまう場合もあります。このような場合、 出力されたconfigureスクリプトは展開されないままのマクロを 含んでいます。autoconfはこのような場合を検出するために、内部で `grep AC_ configure'を実行します。


7.4 Dependencies Between Macros

Autoconfマクロの一部は、正常な動作のために他のマクロが先に呼ばれていることを 仮定しています。Autoconfは特定のマクロを必要な場合にだけ呼び出したり、 正常に動作しない可能性のある順でマクロが呼び出された場合に 警告したりする方法を提供しています。

7.4.1 Prerequisite Macros  Ensuring required information.
7.4.2 Suggested Ordering  Warning about possible ordering problems.
7.4.3 Obsolete Macros  Warning about old ways of doing things.


7.4.1 Prerequisite Macros

一部のマクロは、他のマクロで求められた値を必要とすることがあります。 例えば、AC_DECL_YYTEXTflexlexの出力 結果を調べます。このため、shell変数LEXを設定するために AC_PROG_LEXマクロが先に呼ばれている必要があります。

AC_REQUIREマクロを使う事で、ユーザにマクロ間の依存関係を 管理させずに済みます。つまり、自動化できます。AC_REQUIREを 使うと、あるマクロを必要な場合にだけ、かつ1度だけ呼び出すことができます。

Macro: AC_REQUIRE (macro-name)
もしmacro-nameという名前のm4マクロが まだ呼び出されていなかったら、そのマクロを (引数なしで)呼び出します。macro-nameを 角カッコでquoteするのを忘れないでください。 macro-nameに指定されるマクロは AC_DEFUNで前もって定義されているか、 AC_PROVIDEの呼び出しを含んでいるかする 必要があります。これはmacro-nameが 呼び出されたことを検出するため必要です。

AC_DEFUNを使うかわりに、defineを使ってマクロを定義し、 中でAC_PROVIDEを呼び出すこともできます。この技法は メッセージのネストを防ぐ事ができないので、obsoleteです。

Macro: AC_PROVIDE (this-macro-name)
マクロthis-macro-nameが呼び出されたことを 記録します。this-macro-nameAC_PROVIDE マクロを呼び出すマクロの名前でなければなりません m4の組み込み変数$0を使うと簡単に マクロの名前を得る事ができます。たとえばこんな風:

 
AC_PROVIDE([$0])


7.4.2 Suggested Ordering

あるふたつのマクロについて、両方が呼び出される場合には片方が先に 呼び出されなければならないが、どちらも他方が呼び出されることを 必須としない場合があります。たとえば、Cコンパイラのふるまいを 変えるマクロはCコンパイラを呼び出すマクロ以前に呼び出される 必要があります。このような依存関係の多くはこの文書に記されています。

Autoconfはこのような場合のためにAC_BEFOREマクロを提供しています。 これは、依存関係があるマクロが`configure.in'中に逆順で現れた 場合に、ユーザに警告します。警告メッセージはconfigureを実行する ときではなく、configure.inからconfigureを生成するときに 出力されます。 例えば、AC_PROG_CPPマクロは、Cコンパイラに`-E' オプションをつけたときにCプリプロセッサを実行してくれるかを 調べます。このため、このマクロは利用されるCコンパイラを変更するような マクロ、たとえばAC_PROG_CCなどより後に呼び出される必要があります。 このため、AC_PROG_CCは以下の文を含んでいます:

 
AC_BEFORE([$0], [AC_PROG_CPP])dnl

この文を使うと、AC_PROG_CCが呼ばれた時点でAC_PROG_CPPが 既に呼ばれていた場合、ユーザに警告がでます。

Macro: AC_BEFORE (this-macro-name, called-macro-name)
マクロcalled-macro-nameが既に呼び出されていた 場合、m4が標準エラー出力に警告メッセージを 出力するようにします。this-macro-nameは マクロAC_BEFOREを呼び出すマクロの名前である 必要があります。called-macro-nameに 指定されるマクロはAC_DEFUNで前もって 定義されているか、AC_PROVIDEの呼び出しを 含んでいるかする必要があります。これは called-macro-nameが呼び出されたことを 検出するため必要です。


7.4.3 Obsolete Macros

自動設定および移植性向上のための技法は数年かけて徐々に進化しています。 しばしば、ある問題を解決するためのよりよい方法が開発されたり、 やっつけ仕事が系統だてて整理されたりします。このような変化は Autoconfの多くの部分で置きました。この結果、一部のマクロは obsoleteとされるようになりました; それらのマクロは 動作はしますが、最適なやりかたではなくなりました。 AutoconfはAC_OBSOLETEマクロを用意しています。 このマクロは、configureスクリプトを作っているユーザが obsoleteなマクロを使用した場合に警告し、あたらしいマクロに 移行するよう勧めます。使用例はこんなかんじ:

 
AC_OBSOLETE([$0], [; use AC_CHECK_HEADERS(unistd.h) instead])dnl

Macro: AC_OBSOLETE (this-macro-name [, suggestion])
m4から標準エラー出力へ、マクロ this-macro-nameはobsoleteだ、という メッセージを出力させます。また、マクロが 使用されたファイル名と行番号も 出力されます。this-macro-nameAC_OBSOLETEを呼び出しているマクロの 名前である必要があります。もしsuggestionが 指定されていたら、警告メッセージの末尾に 指定された文字列が出力されます; 例えば、this-macro-nameのかわりに 使うべきマクロ名などがいいでしょう。


[ << ] [ >> ]           [Top] [Contents] [Index] [ ? ]

This document was generated by Akihiro Sagawa on January, 21 2003 using texi2html