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

2. Making configure Scripts

Autoconfによって生成される自動設定スクリプトは、configureと 呼ばれることになってます。configureは実行されると、 設定パラメタを適切な値に書き換えながらいくつかのファイルを作成します。 configureが生成するファイルは以下のとおりです:

Autoconfを使ってconfigureスクリプトを作成するためには、 Autoconfの入力ファイル`configure.in'を作り、autoconfを 実行する必要があります。Autoconfに標準でついてくるものを補うために、 OSの機能をチェックするための自作のshellスクリプトを書いた場合には、 それを`aclocal.m4'と`acsite.m4'に書いておくとよいでしょう。 #defineディレクティブを含むCヘッダファイルを使うなら、 `acconfig.h'を作成する必要があるかもしれません。 さらに、Autoconfの生成した`config.h.in'をパッケージとともに 配布することになります。

以下の図は、自動設定が行われるときにどのようにファイルが用いられる のかを示しています。実行されるプログラム名には`*'がつけてあります。 なくてもいいファイルは角カッコ(`[]')でかこんであります。 autoconfautoheaderは、下図に加えてAutoconfマクロファイルを 読み込みます(`autoconf.m4'のことです)。

配布用ソフトウェアパッケージの作成時に使われるファイル:

 
your source files --> [autoscan*] --> [configure.scan] --> configure.in

configure.in --.   .------> autoconf* -----> configure
               +---+
[aclocal.m4] --+   `---.
[acsite.m4] ---'       |
                       +--> [autoheader*] -> [config.h.in]
[acconfig.h] ----.     |
                 +-----'
[config.h.top] --+
[config.h.bot] --'

Makefile.in -------------------------------> Makefile.in

ソフトウェアパッケージの設定時に使われるファイル:

 
                       .-------------> config.cache
configure* ------------+-------------> config.log
                       |
[config.h.in] -.       v            .-> [config.h] -.
               +--> config.status* -+               +--> make*
Makefile.in ---'                    `-> Makefile ---'

2.1 Writing `configure.in'  What to put in an Autoconf input file.
2.2 Using autoscan to Create `configure.in'  Semi-automatic `configure.in' writing.
2.3 Using ifnames to List Conditionals  Listing the conditionals in source code.
2.4 Using autoconf to Create configure  How to create configuration scripts.
2.5 Using autoreconf to Update configure Scripts  Remaking multiple configure scripts.


2.1 Writing `configure.in'

あるソフトウェアパッケージ用のconfigureスクリプトを 生成するためには、`configure.in'という名前のファイルを 作成する必要があります。このファイルには、ソフトウェアパッケージが 必要とする、または使う事のできるOSの機能をチェックするための Autoconfマクロの呼出列が記述されます。 たくさんの機能をチェックするために、Autoconfマクロとして既に たくさんのものが準備されています。4. Existing Testsを 参照してください。 AutoconfマクロのないOSの機能でも、多くの場合には特製チェックルーチンを 作るのにAutoconfテンプレートマクロを使うことができます。 5. Writing Testsを参照してください。 特にトリッキー、または特殊なOS機能のチェックをする場合、 `configure.in'に手でshellコマンド列を書かないといけないかも しれません。 autoscanプログラムを使うと、`configure.in'を 書きはじめるための元ファイルを自動生成してくれます(より詳しくは see section 2.2 Using autoscan to Create `configure.in'を参照)。

`configure.in'の中でAutoconfマクロを呼び出す順番は、一部の例外を 除けば重要ではありません。`configure.in'ファイルにはAC_INIT マクロの呼び出しが一番最初に、AC_OUTPUTマクロの呼び出しが 一番最後に入っている必要があります(see section 3.2 Creating Output Files参照)。 さらに、一部のマクロは先に呼ばれる他のマクロに依存しています。 先に呼ばれるマクロによって設定される値によって動作を変えるためです。 このようなマクロはそれぞれのマクロの説明に注意書きがしてあります (see section 4. Existing Tests参照)し、もし逆順に呼んだ場合、configureの 生成時に警告が出ます。

`configure.in'に統一性をもたせるため、以下の順でAutoconfマクロを 呼ぶことを推奨します。一般にいって、最後の方に書かれているものは 先にあるものに依存しています。例えば、ライブラリ関数のチェックは typedefとライブラリファイルのチェック結果に依存します。

 
AC_INIT(file)
checks for programs
checks for libraries
checks for header files
checks for typedefs
checks for structures
checks for compiler characteristics
checks for library functions
checks for system services
AC_OUTPUT([file...])

`configure.in'に、1行にひとつづつマクロの呼び出しを記述することを お勧めします。ほとんどのマクロは、余計な改行を生成しません。すなわち、 マクロ呼び出しの直後の改行があることに頼っています。 このようにすることで、余計な空行がなく、読みやすいconfigure スクリプトを生成することができます。shell変数への代入を マクロ呼び出しとおなじ行で行うのはたいていの場合安全です。 shellスクリプトでは代入文を改行をはさまず記入することができるからです。

引数をとるマクロを呼び出す場合、マクロ名と左括弧の間にスペースを 入れてはいけません。m4のquote文字`['と`]'で 囲むことで、複数行にわたる引数を記述できます。ファイル名の羅列などで 長い行を書かないといけない場合、行末にbackslashを置くことで 論理的な行を続ける(backslashの次の改行を無視させる)ことができます。 これはshellによって実現されているもので、Autoconfが特別なことをしている わけではありません。

マクロには場合分けを含んでいるものがあります: 条件が成立したときに 実行することがらと、条件が成立しなかったときに実行することがらを 記述するような場合です。条件が成立したときにはなにかを実行し、 成立しなかったときにはなにもしないようにしたい(あるいは逆)、ということが あると思います。条件が成立したときになにもしない場合、マクロの 引数action-if-foundに空文字列を渡してください。 条件が成立しなかったときになにもしない場合、マクロの引数 action-if-not-foundを直前のカンマもろとも省略してください。

`configure.in'にはコメントを含めることができます。 コメントはm4組み込みマクロdnlで始めます。 dnlマクロは次の改行までの文字列を単に無視します。 このようにして書かれたコメントは、configureスクリプトには現れません。 たとえば、`configure.in'を以下のような行ではじめれば 理解を助けることができるでしょう:

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


2.2 Using autoscan to Create `configure.in'

autoscanプログラム、あるソフトウェアパッケージのための `configure.in'を生成する際に役立ちます。autoscanは コマンドライン引数で指定されたディレクトリ(指定されなかった場合 カレントディレクトリ)以下のソースファイルについて、移植性に 問題のある記述があるかどうかを探します。そして、結果を`configure.scan' というファイルに出力します。このファイルはこのパッケージのための `configure.in'の雛型として使えます。

`configure.scan'を`configure.in'にリネームする前に、 内容を確認する必要があります; たぶん手で調整が必要です。 autoscanの出力した`configure.scan'のマクロ列が、 マクロ間の依存関係からみて正しくない順で並んでいる場合があります。 このような場合、autoconfは警告を出力しますので、 マクロの順序を手で変更する必要があります。また、configuration header fileを 使いたい場合、AC_CONFIG_HEADER(see section 3.4 Configuration Header Files) マクロの呼び出しを追加する必要があります。さらに、プログラムが Autoconfとうまく動くように、ソースコードの方に#ifディレクティブを 追加する必要があるでしょう(この作業を楽にするためのツールについては see section 2.3 Using ifnames to List Conditionalsを参照)。

autoscanはいくつかのデータファイルを使って、ソースファイルの中にある シンボルをみつけたときに出力すべきマクロ名を決定します。 このファイルはAutoconfマクロファイルと一緒に配布され、全て おなじフォーマットになっています。ファイルの各行はシンボル、スペース、 シンボルをみつけたときに出力するべきAutoconfのマクロ名、というふうに なっています。`#'で始まる行はコメントです。

autoscanはPerlがインストールされている場合にのみインストールされます。 autoscanのオプションには以下があります:

--help
コマンドラインオプションの説明を出力して終了します。

--macrodir=dir
デフォルトのインストールディレクトリでなく、 ディレクトリdirにある設定ファイルを 参照します。環境変数AC_MACRODIRを 設定しても同じ効果が得られます。 コマンドラインオプションは環境変数の設定より 優先されます。

--verbose
調べているファイルの名前と、みつけた重要そうな シンボル名を表示します。出力されるメッセージ量は 膨大になる可能性があります。

--version
Autoconfのバージョン番号を出力して終了します。


2.3 Using ifnames to List Conditionals

ifnamesはソフトウェアパッケージ用に`configure.in'を書くのを 支援します。ifnamesは、パッケージ中のソースコードで Cプリプロセッサの条件文(`#if')に使われている識別子を出力します。 もし、パッケージが既に移植性を高めるように記述されている場合には、 configureでなにをチェックしないといけないか決めるのに使えます。 autoscanの出力を穴うめして`configure.in'を作成するのにも 役立ちます(see section 2.2 Using autoscan to Create `configure.in')。

ifnamesはコマンドラインに指定されたCソースファイル(なにも 指定されなかったら標準入力)をチェックし、結果を標準出力に出力します。 結果は#if#elif#ifdef、または#ifndef の各ディレクティブで使われている識別子をソートして出力します。 各行にはひとつの識別子と、その識別子を使っているファイル名をスペースで 区切ったものが出力されます。

ifnamesは以下のオプションを受け付けます:

--help
-h
コマンドラインオプションの説明を出力して終了します。

--macrodir=dir
-m dir
デフォルトのインストールディレクトリでなく、 ディレクトリdirにある設定ファイルを 参照します。環境変数AC_MACRODIRを 設定しても同じ効果が得られます。 コマンドラインオプションは環境変数の設定より 優先されます。

--version
Autoconfのバージョン番号を出力して終了します。


2.4 Using autoconf to Create configure

configure.inからconfigureを生成するためには、 autoconfプログラムをコマンドライン引数なしで実行します。 autoconfは`configure.in'をAutoconfマクロを使って m4マクロプロセッサに通します。autoconfにコマンドライン 引数を与えた場合、`configure.in'のかわりに引数で指定したファイルが 読み込まれ、結果は標準出力に出力されます(通常は`configure'に結果を 出力します)。`-'をコマンドライン引数として指定した場合、 `configure.in'のかわりに標準入力を読み込み、設定スクリプトを 標準出力に出力します。

Autoconfマクロは複数のファイルで定義されます。 autoconfはAutoconfといっしょに配布されているマクロファイルを最初に 読み込みます。次に、Autoconfと一緒に配布されるマクロファイルとおなじ ディレクトリにある、`acsite.m4'を読み込みます。 その次に、カレントディレクトリにある`aclocal.m4'を読み込みます。 各ファイルにはサイト単位の、またはパッケージ単位のAutoconfマクロ定義を 書いておくことができます(マクロの定義法についてはsee section 7. Writing Macros 参照)。同じマクロがautoconfが読み込むファイルのうち複数のファイルで 定義されていた場合、あとから読み込まれたものが有効になります。

autoconfは以下のオプションを受け付けます:

--help
-h
コマンドラインオプションの説明を出力して終了します。

--localdir=dir
-l dir
`aclocal.m4'を探すとき、カレントディレクトリでなしに ディレクトリdirを探しにいきます。

--macrodir=dir
-m dir
デフォルトのインストールディレクトリでなく、 ディレクトリdirにあるAutoconfマクロ ファイルを参照します。環境変数AC_MACRODIRを 設定しても同じ効果が得られます。 コマンドラインオプションは環境変数の設定より 優先されます。

--version
Autoconfのバージョン番号を出力して終了します。


2.5 Using autoreconf to Update configure Scripts

Autoconfで生成されたconfigureスクリプトがたくさんある場合、 autoreconfを使うと仕事量を減らせるかもしれません。 autoreconfは、カレントディレクトリ以下のconfigureスクリプトと configuration headerテンプレートを、autoconf(と、必要なら autoheader)を繰り返し起動して再生成します。 デフォルトでは、`configure.in'と(もしあれば)`aclocal.m4'よりも 古いファイルのみを再生成します。ただし、これによって行われる作業は 必要最低限の作業とは限りません。これは、autoheaderは出力ファイルの 内容が変化しなかったときにはファイルのタイムスタンプを変更しないためです。 新しいバージョンのAutoconfをインストールした場合、autoreconfに `--force'オプションを指定することで、全てのファイルを更新 させることができます。

autoreconfに、`--macrodir=dir'または `--localdir=dir'のオプションを与えた場合、 これらはautoreconfから呼び出されるautoconfautoheaderに渡されます。その際、相対パス名は適切に調整されます。

autoreconfは同じディレクトリツリーの中で、(`aclocal.m4'と `acconfig.h'を共有する)大きなパッケージの一部であるディレクトリと (自身の`aclocal.m4'と`acconfig.h'をそれぞれ持つ)独立したパッケー ジのディレクトリを両方持つことをサポートしません。もし`--localdir' を使うならすべてが同じパッケージの一部であると仮定し、使わないなら、それ ぞれのディレクトリは分割したパッケージであると仮定します。この制限は将来 なくなるかもしれません。

`Makefile'のルールで必要なときにconfigureスクリプトを 自動再生成させるためにはSee section 3.3.3 Automatic Remakingを参照してください。 この方法を使うとconfiguration headerテンプレートのタイムスタンプは きちんと取り扱われますが、`--macrodir=dir'や `--localdir=dir'は渡されません。

autoreconfは以下のオプションを受け付けます:

--help
-h
コマンドラインオプションの説明を出力して終了します。

--force
-f
`configure'スクリプトとconfiguration headerが 入力ファイルより新しい場合でも、これらの再生成を 行います。入力ファイルとは`configure.in'と、もし 存在すれば`aclocal.m4'のことです。

--localdir=dir
-l dir
`aclocal.m4'を探すとき、カレントディレクトリで なしにディレクトリdirを探しにいきます。 `autoheader'を呼び出す場合には、 `acconfig.h'を探すディレクトリも変わります。 `file.top'と`file.bot'に ついては挙動は変わりません。

--macrodir=dir
-m dir
デフォルトのディレクトリでなく、ディレクトリ dirにある Autoconfマクロファイルを参照します。 環境変数AC_MACRODIRを設定しても同じ効果が 得られます。コマンドラインオプションは環境変数の 設定より優先されます。

--verbose
autoreconfからautoconf(と、必要なら autoheader)を呼び出すディレクトリ名を表示します。

--version
Autoconfのバージョン番号を出力して終了します。


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

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