[ << ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
複数のソフトウェアパッケージに適用できる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. |
AutoconfのマクロはAC_DEFUN
マクロを使って定義されます。
これはm4
のdefine
マクロと類似しています。
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.
Autoconfマクロの名前は、他の文字列との衝突を避けるため、 全て大文字で、`AC_'で始まっています。内部で使われるshell変数は なるべく全部小文字で、`ac_'で始まっています。 既存の/将来のAutoconfマクロと衝突しないために、 自分で定義するマクロの名前およびshell変数の名前には、 先頭に別の文字列を使うべきです。例えばあなたのイニシャル、組織名や ソフトウェアパッケージの名前の略称などが考えられます。
Autoconfマクロの名前は、ほとんどの場合構造化された名前づけ規則に したがっています。名前はチェックされるOSの機能を示しています。 マクロ名は下線で区切られたいくつかの単語からなり、各単語は 一般的なものから特殊なものへと並んでいます。マクロに対する キャッシュ変数の名前もおなじ規則を使っています(より詳しくは see section 6.3.1 Cache Variable Names参照)。
`AC_'の次にある単語は、調べる対象のOS機能のカテゴリを示しています。 ここに、書く可能性の高いマクロの種類のテストマクロを指定するため、 Autoconfが使うカテゴリがあります。それらはキャッシュ変数でも全て小文字で 使われます。適用可能なものを使ってください。無ければ独自のカテゴリを考え 出してください。
C
DECL
FUNC
GROUP
HEADER
LIB
PATH
PROG
STRUCT
SYS
TYPE
VAR
カテゴリ名の次には、テスト対象のOS機能の名前が来ます。
それ以降の単語はそれぞれOSの機能の持つ特定の意味を表しています。
例えば、AC_FUNC_UTIME_NULL
はutime
関数の引数に
NULL
を与えたときのふるまいをチェックします。
あるマクロの内部サブルーチンとして動作するマクロには、
呼び元マクロ名のあとに、マクロが行うことがらを意味する
ひとつ以上の単語をつけた名前をつけるのがよいです。
たとえば、AC_PATH_X
はAC_PATH_X_XMKMF
と
AC_PATH_X_DIRECT
を内部で呼び出すマクロとして使います。
他のマクロに呼び出されるマクロは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'を実行します。
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. |
一部のマクロは、他のマクロで求められた値を必要とすることがあります。
例えば、AC_DECL_YYTEXT
はflex
やlex
の出力
結果を調べます。このため、shell変数LEX
を設定するために
AC_PROG_LEX
マクロが先に呼ばれている必要があります。
AC_REQUIRE
マクロを使う事で、ユーザにマクロ間の依存関係を
管理させずに済みます。つまり、自動化できます。AC_REQUIRE
を
使うと、あるマクロを必要な場合にだけ、かつ1度だけ呼び出すことができます。
m4
マクロが
まだ呼び出されていなかったら、そのマクロを
(引数なしで)呼び出します。macro-nameを
角カッコでquoteするのを忘れないでください。
macro-nameに指定されるマクロは
AC_DEFUN
で前もって定義されているか、
AC_PROVIDE
の呼び出しを含んでいるかする
必要があります。これはmacro-nameが
呼び出されたことを検出するため必要です。
AC_DEFUN
を使うかわりに、define
を使ってマクロを定義し、
中でAC_PROVIDE
を呼び出すこともできます。この技法は
メッセージのネストを防ぐ事ができないので、obsoleteです。
AC_PROVIDE
マクロを呼び出すマクロの名前でなければなりません
m4
の組み込み変数$0
を使うと簡単に
マクロの名前を得る事ができます。たとえばこんな風:
AC_PROVIDE([$0]) |
あるふたつのマクロについて、両方が呼び出される場合には片方が先に 呼び出されなければならないが、どちらも他方が呼び出されることを 必須としない場合があります。たとえば、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
が
既に呼ばれていた場合、ユーザに警告がでます。
m4
が標準エラー出力に警告メッセージを
出力するようにします。this-macro-nameは
マクロAC_BEFORE
を呼び出すマクロの名前である
必要があります。called-macro-nameに
指定されるマクロはAC_DEFUN
で前もって
定義されているか、AC_PROVIDE
の呼び出しを
含んでいるかする必要があります。これは
called-macro-nameが呼び出されたことを
検出するため必要です。
自動設定および移植性向上のための技法は数年かけて徐々に進化しています。
しばしば、ある問題を解決するためのよりよい方法が開発されたり、
やっつけ仕事が系統だてて整理されたりします。このような変化は
Autoconfの多くの部分で置きました。この結果、一部のマクロは
obsoleteとされるようになりました; それらのマクロは
動作はしますが、最適なやりかたではなくなりました。
AutoconfはAC_OBSOLETE
マクロを用意しています。
このマクロは、configure
スクリプトを作っているユーザが
obsoleteなマクロを使用した場合に警告し、あたらしいマクロに
移行するよう勧めます。使用例はこんなかんじ:
AC_OBSOLETE([$0], [; use AC_CHECK_HEADERS(unistd.h) instead])dnl |
m4
から標準エラー出力へ、マクロ
this-macro-nameはobsoleteだ、という
メッセージを出力させます。また、マクロが
使用されたファイル名と行番号も
出力されます。this-macro-nameは
AC_OBSOLETE
を呼び出しているマクロの
名前である必要があります。もしsuggestionが
指定されていたら、警告メッセージの末尾に
指定された文字列が出力されます;
例えば、this-macro-nameのかわりに
使うべきマクロ名などがいいでしょう。
[ << ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |