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

3. configureスクリプトの作成

Autoconfが生成するコンフィギュレーションスクリプトは,慣習的に configureと呼ばれます.実行時に,configureはいくつか のファイルを作成し,そこで,コンフィギュレーションパラメータを適切な値に 置換します.configureが作成するファイルは以下の通りです.

Autoconfを用いてconfigureスクリプトを作成するために,Autoconf の入力ファイル`configure.ac'(または`configure.in')を書き, autoconfをそこで実行する必要があります.Autoconfでもたらされた ものを補うために独自の機能テストを書く場合,`aclocal.m4'と `acsite.m4'という名のファイルも書くことになるでしょう. #defineディレクティブを含むCヘッダファイルを使用する場合, autoheaderも実行し,パッケージで生成されるファイル `config.h.in'を配布することになるでしょう.

コンフィギュレーションで使用可能なファイルを生成する方法は,以下で示す図 の用になります.実行するプログラムには,`*'が付いています.オプショ ンのファイルは角カッコ(`[]')で囲っています.autoconfautoheaderは,Autoconfでインストールされる(`autoconf.m4' が読む)マクロファイルも読み込みます.

ソフトウェアパッケージを配布する準備で使用されるファイルは,以下のように なっています.

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

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

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

ソフトウェアパッケージのコンフィグレーションで使用されるファイルは,以下 のようになっています.

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

3.1 `configure.ac'を書く

ソフトウェアパッケージのconfigureスクリプトを生成するため,パッ ケージが必要とする,または利用可能なシステムの特徴をテストするAutoconfマ クロの呼び出しを含んでいる,`configure.ac'と呼ばれるファイルを作成 してください.Autoconfマクロには,多くの特徴を調査するものはすでに存在し ています.それら関する記述は,存在の調査を参照してください.ほ とんどのその他の特徴に対しては,カスタムチェックを生成するAutoconfのテン プレートマクロを使用することが可能です.それらに関する詳細は, テストを書くを参照してください.特にトリッキーな,または専門的な 特徴に対して,`configure.ac'に,若干の手作りのシェルコマンドを含め る必要もあるでしょう.autoscanプログラムは`configure.ac' を書くための良いきっかけ与えてくれます.(詳細は,see section `configure.ac'を作成するためにautoscanを使用する).

Autoconfのこれまでのバージョンでは,名前`configure.in'を勧めていま したが,それは曖昧で(このファイルを処理するために必要なツールは,拡張子 では分かりません),`config.h.in'などで(`.in'は "configureで生成される"という意味では)ちょっと混乱していまし た.現在では,`configure.ac'の使用が好まれます.


3.1.1 シェルスクリプトコンパイラ

他のコンピュータ言語に対して,Autoconfで`configure.ac'を正しくプロ グラムするために,言語が解決しようとする問題がで,そうするため にどうするのかを理解する必要があります.

Autoconfが解決する問題は,世界が混乱しているということです.結局,全ての 異なる種類のシステムでパッケージのコンパイルを簡単にするためにAutoconfを 使用しますが,それを極端に嫌う人も中にはいます.Autoconf自身は,これらの 差を価値あるものとして扱います.configureをこれらの全てのシス テムで実行する必要があり,そのため,configure には,機能的にそ れらの最小公倍数に制限する必要があります.

通常,シェルスクリプトを考えるでしょう.autoconfが必要でしょう か?正しく書かれたシェル関数の組み合わせで,手でconfigureスク リプトを書くことを十分に簡単にします.ああ!残念ながら,シェル関数は最小 公倍数ではありません.そのため,関数を定義しそれを十回使用したいところで, その本体を十回コピーする必要があるでしょう.

そのため,本当に必要なものは,コンパイラのようなもの,すなわち autoconf,Autoconfプログラムが受け入れるもの,すなわち `configure.ac',そして,それを移植性の高いシェルスクリプト configureに変換するものです.

どのようにして,autoconfがこの作業を実行するのでしょう?

可能性としては明らかに二つあります.新しい言語を作成すること,または既存 のものを拡張することです.前者は非常に魅力的です.あらゆる最適化が簡単に 実装可能で,Autoconfプログラムで厳密なチェックを実行することが可能です (例えば,移植性のないあらゆる構成物は除外します).あるいは, sh(Bourne shell) 言語のように,既存の言語を拡張することが可能です.

Autoconfは後者の方法で行なっています.それはshの最上位層です.そ のため,マクロを展開するものとしてautoconfを実装することが最も 便利になっています.マクロ呼び出しをマクロの本体で置換し,最終的にピュア なshスクリプトを生成しながら,テキスト入力でマクロ展開(macro expansion)を繰り返し実行するプログラムです.Autoconfマクロの展開に専念 して実装する代わりに,M4のような既存の一般的な目的を持つマクロ言語を使用 し,M4マクロの組み合わせとして拡張部分を実装する方が自然です.


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.

3.1.3 標準的な`configure.ac'のレイアウト

`configure.ac'でAutoconfマクロを呼び出す順番は,いくつか例外があり ますが重要ではありません.すべての`configure.ac'では,調査の前の AC_INITの呼び出しと,最後のAC_OUTPUTの呼び出しを含める必要 があります(see section 出力ファイルを生成する).さらに,いくつかの変数については,何を行なう かを決定するため,前もって設定されている値を調査できるように,他のマクロ が最初に呼ばれることに依存するマクロもあります.これらのマクロはそれぞれ の説明で書かれていて(see section 存在の調査),configureが作成 されているとき,間違った順番で呼び出されている場合は警告されます.

整合性を促進するため,Autoconfマクロを呼び出す順番をここで提案します.一 般的に言って,このリストの終わり近くのものは,その前のものに依存します. 例えば,ライブラリ関数は型とライブラリの影響があります.

 
Autoconfの必要条件
AC_INIT(package, version, bug-report-address)
パッケージの情報
プログラムの調査
ライブラリの調査
ヘッダファイルの調査
型の調査
構造体の調査
コンパイラの特徴の調査
ライブラリ関数の調査
システムサービスの調査
AC_CONFIG_FILES([file…])
AC_OUTPUT

3.2 `configure.ac'を作成するためにautoscanを使用する

autoscanプログラムは,ソフトウェアパッケージに対する `configure.ac'ファイルの作成と/または管理に役に立ちます. autoscanは,コマンドライン引数で与えられたディレクトリをルート とするディレクトリツリー,または,与えられていない場合はカレントディレク トリでソースファイルを調査します.それは,ソースファイルの一般的な移植性 の問題を検索して,パッケージに対する`configure.ac'の準備となるファ イル`configure.scan'を作成し,あるいは存在している `configure.ac'の完全性を調査します.

`configure.ac'を作成するためにautoscanを使用するとき, `configure.scan'を`configure.ac'に改名する前に,手作業でそれを 調査する必要があります.恐らくなんらかの調整が必要です.時折 autoscanは,autoconfが警告を出すような,関連するマク ロに対して間違った順序でマクロを出力する場合もあります.手作業でそのよう なマクロを移動する必要があります.また,パッケージでコンフィギュレーショ ンヘッダファイルを使用する場合も,AC_CONFIG_HEADERの呼び出しを加 える必要があります(see section コンフィグレーションヘッダファイル).また,Autoconfで動作 するように,プログラムの#ifディレクティブを変更したり加えたりする 必要があります(そのような仕事に役に立つプログラムの情報は, see section 条件をリストアップするためifnamesを使用する).

`configure.ac'を管理するためにautoscanを使用しているとき, 単純にそれが追加した提案を検討してください.ファイル`autoscan.log' には,マクロが要求される理由に関する詳細な情報が含まれています.

autoscanは,パッケージのソースファイルで特定のシンボルを見つけ たときに出力するマクロを決定するため,(Autoconfと一緒にインストールされ ている)データファイルも使用します.これらのデータファイルはすべて同じ書 式です.それぞれの行は,シンボル,空白スペース,そしてそのシンボルがある 場合に出力するAutoconfマクロから成り立っています.`#'で始まる行はコ メントです.

autoscanは以下のオプションを受け入れます.

` --help'
` -h'

コマンドラインオプションの概要を出力して終了します.

` --version'
` -V'

Autoconfのバージョンナンバーを出力して終了します.

` --verbose'
` -v'

調査しているファイルと,その中で見つかった興味深いものとなる可能性のある シンボル名を出力します.この出力は大量になるはずです.

` --include=dir'
` -I dir'

dirをインクルードパスの後に追加します.複数回の呼び出しで累積され ます.

` --prepend-include=dir'
` -B dir'

dirをインクルードパスの前に追加します.複数回の呼び出しで累積され ます.


3.3 条件をリストアップするためifnamesを使用する

ifnamesは,ソフトウェアパッケージに対する`configure.ac' を書くとき役に立つはずです.それは,Cプリプロセッサの条件式でパッケージ が既に使用している識別子を出力します.パッケージが既に移植性に対して準備 されている場合,ifnamesconfigureで調査することが必 要なものを理解することに役く立つはずです.それはautoscanが生成 した`configure.ac'とのギャップを埋める役に立つかもしれません (see section `configure.ac'を作成するためにautoscanを使用する).

ifnamesは,コマンドラインで指名されたすべてのCソースファイルを (無い場合は標準入力から)走査し,これらのファイルに現れる#if#elif#ifdef,または#ifndefディレクティブの,すべ ての識別子をソートしたリストを標準出力に書き出します.それは,識別子があ るファイルの空白で分離されたリストに続いて,一行にぞれぞれの識別子を出力 します.

ifnamesは以下のオプションを受け入れます.

` --help'
` -h'

コマンドラインオプションの概要を出力して終了します.

` --version'
` -V'

Autoconfのバージョンナンバーを出力して終了します.


3.4 configureを作成するためautoconfを使用する

`configure.ac'からconfigureを作成するために, autoconfプログラムを引数無しで実行してください. autoconfは,Autoconfマクロを使用しながら,M4マクロプロセッサを 用いて`configure.ac'を処理します.autoconfに引数を与えて いる場合,`configure.ac'の代わりにそのファイルを読み, configureの代わりに,標準出力にコンフィグレーションスクリプト を書き出します.autoconfに引数`-'を与えた場合, `configure.ac'の代わりに標準入力から読み込み,標準出力にコンフィグ レーションスクリプトを書き出します.

Autoconfマクロは,複数のファイルで定義されています.ファイルにはAutoconf と一緒に配布される物もあります.autoconfは最初にそれを読み込み ます.オプションのファイル`acsite.m4'を,配布されたAutoconfマクロファ イルを含むディレクトリで探し,オプションのファイル`aclocal.m4'はカ レントディレクトリで探します.これらのファイルは,サイトやパッケージの Autoconfマクロ定義を含めることが可能です(詳細は,see section Autoconfマクロを書く).一つ以上のファイルで定義されているマクロをautoconfが 読み込む場合,最後の定義がそれ以前の定義に優先します.

autoconfは以下のオプションを受け入れます.

` --help'
` -h'

コマンドラインオプションの概要を出力して終了します.

` --version'
` -V'

Autoconfのバージョンナンバーを出力して終了します.

` --verbose'
` -v'

処理しているステップを報告します.

` --debug'
` -d'

一時的なファイルを削除しません.

` --force'
` -f'

入力ファイルより`configure'が新しい場合でも,それを再生成します.

` --include=dir'
` -I dir'

dirをインクルードパスの後に追加します.複数回の呼び出しで累積され ます.

` --prepend-include=dir'
` -B dir'

dirをインクルードパスの前に追加します.複数回の呼び出しで累積され ます.

` --output=file'
` -o file'

(出力や追跡の)出力をfileに保存します.ファイル`-'は標準出力 に対するものです.

` --warnings=category'
` -W category'

(実際にはカンマで分けたリストが可能な)categoryに関連する警告を報告 します.カテゴリの総合的なリストは,マクロAC_DIAGNOSEと See section メッセージの報告. 特別な値には,以下のものが含まれています.

` all'

全ての警告を報告します.

` none'

何も報告しません.

` error'

警告をエラーとして扱います.

` no-category'

categoryに分類される警告を利用不可能にします.

`syntax'に関する警告はデフォルトで利用可能で,カンマで分けられたカ テゴリリストの環境変数WARNINGSは尊重されます.`-W category'を渡すことで, `--warnings=syntax,$WARNINGS,category'が渡されたかのように動 作します.デフォルトとWARNINGSを利用不可能にしたいが,(例えば) 時 代遅れの構成物についての警告は利用可能にしたい場合,`-W none,obsolete'を使用してください.

autoconfはバックグラウンドでautom4teを使用するので, それはエラーのバックトレースを表示しますが,警告については行ないません. そうしたい場合,`-W error'のみを渡してください.いくつかの例は, See section autom4teの呼び出し.

` --trace=macro[:format]'
` -t macro[:format]'

configureスクリプトを作成しませんが,formatでマクロの呼 び出しをリストアップします.複数の`--trace'の引数は,複数のマクロ をリストアップするために使用可能です.単一のマクロに対する複数の `--trace'の引数は,累積的ではありません.その代わりにformat を必要なものにすべきです.

formatは,必要な場合は改行をともなう通常の文字列と,いくつかの特殊 なエスケープコードです.デフォルトは`$f:$l:$n:$%'です.format の詳細は,autom4teの呼び出しを参照してください.

` --initialization'
` -i'

デフォルトで,`--trace'はAutoconfマクロ(特にAC_DEFUNの定義) の初期化を追跡しません.これで顕著に高速化されますが,このオプションで利 用不可能にすることができます.

`configure.ac'ファイルの内容を調査する必要があることもよくあります が,自分で解析することは,非常に脆くエラーを起こしやすいものです. `configure.ac'をスキャンするために,`--trace'を信頼してみて ください.例えば,置換される変数のリストを見つけるため,以下のようにして みてください.

 
$ autoconf -t AC_SUBST
configure.ac:2:AC_SUBST:ECHO_C
configure.ac:2:AC_SUBST:ECHO_N
configure.ac:2:AC_SUBST:ECHO_T
More traces deleted

以下の例では,`$@',`$*'と$%の違いを強調しています.

 
$ cat configure.ac
AC_DEFINE(This, is, [an
[example]])
$ autoconf -t 'AC_DEFINE:@: $@
*: $*
$: $%'
@: [This],[is],[an
[example]]
*: This,is,an
[example]
$: This:is:an [example]

formatは,柔軟にできます.

 
$ autoconf -t 'AC_SUBST:$$ac_subst{"$1"} = "$f:$l";'
$ac_subst{"ECHO_C"} = "configure.ac:2";
$ac_subst{"ECHO_N"} = "configure.ac:2";
$ac_subst{"ECHO_T"} = "configure.ac:2";
More traces deleted

長いseparatorは,複雑な構想の可読性を改善したり,解析を簡単にする ために使用可能です(例えば,分離文字に適した単一文字が無いときです).

 
$ autoconf -t 'AM_MISSING_PROG:${|:::::|}*'
ACLOCAL|:::::|aclocal|:::::|$missing_dir
AUTOCONF|:::::|autoconf|:::::|$missing_dir
AUTOMAKE|:::::|automake|:::::|$missing_dir
More traces deleted

3.5 configureスクリプトを更新するためautoreconfを使用する

GNUビルドシステムの様々なコンポーネントをインストールすること は退屈なものです.それは,Gettextに対するautopoint, `Makefile.in'やautomake等を,それぞれのディレクトリで実行 することを意味します.automakeのようなツールが更新されたり, `configure.ac'のようなソースが更新されたり,ただ単純にGNU ビルドシステムを新しいツリーにインストールするためだけでも,そうすること が必要になるかもしれません.

autoreconfは,指定されたディレクトリとそのサブディレクトリ (see section サブディレクトリで他のパッケージをコンフィグレーションする)で,GNUビルドシステムを更新するために, autoconfautoheaderaclocalautomakelibtoolize,そして(適切なときは) autopointを繰り返し実行します.デフォルトで,ソースファイルよ り古いファイルだけが再生成されます.

新しいバージョンのツールをインストールした場合,autoreconfに `--force'オプションを与えることで,すべてのファイルを再生 成することが可能です.

ソースファイルを変更したとき,configureスクリプトを自動的に再 生成する`Makefile'ルールについては,See section 自動的なリメイク. そ の方法は,コンフィギュレーションヘッダテンプレートのタイムスタンプを正確 に処理しますが,`--autoconf-dir=dir'や `--localdir=dir'を渡しません.

autoreconfは以下のオプションを受け入れます.

` --help'
` -h'

コマンドラインオプションの概要を出力して終了します.

` --version'
` -V'

Autoconfのバージョンナンバーを出力して終了します.

` --verbose'

autoreconfautoconf(と適切な場合は autoheader)を実行している,それぞれのディレクトリ名を出力しま す.

` --debug'
` -d'

一時ファイルを削除しません.

` --force'
` -f'

`configure'スクリプトとコンフィグレーションヘッダが入力ファイル (`configure.ac'と,存在する場合は`aclocal.m4')より新しくても更 新します.

` --install'
` -i'

パッケージの足りない補助ファイルをインストールします.デフォルトで,ファ イルはコピーされます.`--symlink'で変更することも可能です.

このオプションは,`automake --add-missing',`libtoolize', `autopoint'等を呼び出すきっかけにもなります.

` --symlink'
` -s'

`--install'とともに使用されるとき,足りない補助ファイルをコピーす る代わりに,シンボリックリンクを配置します.

` --make'
` -m'

ディレクトリがコンフィグレーションされるとき,`./config.status --recheck && ./config.status'を実行してコンフィグレーションを更新し, `make'を実行します.

` --include=dir'
` -I dir'

dirをインクルードパスの後に追加します.複数回の呼び出しで累積され ます.

` --prepend-include=dir'
` -B dir'

dirをインクルードパスの前に追加します.複数回の呼び出しで累積され ます.

` --warnings=category'
` -W category'

(実際にはカンマで分離されているリストになっている)categoryに関連す る警告を報告します.

` cross'

クロスコンパイルの問題に関連するもの.

` obsolete'

時代遅れの構成物の使用を報告.

` portability'

移植性の問題.

` syntax'

曖昧な構文の構成物.

` all'

すべての警告を報告.

` none'

何も報告しない.

` error'

警告をエラーとして処理.

` no-category'

categoryに分類される警告を利用不可能にする.

`syntax'の警告はデフォルトで利用可能で,カンマでカテゴリを分離した リストとなっている環境変数WARNINGSは尊重されます.`-W category'を渡すと,実際には `--warnings=syntax,$WARNINGS,category'を渡したかのように動作 します.デフォルトのものとWARNINGSを利用不可能にし,(例えば) 時代 遅れの構成物に関する警告を利用可能にしたい場合`-W none,obsolete' を使用してください.


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

This document was generated by Akihiro Sagawa on June, 15 2005 using texi2html 1.70.