[ << ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
configure
スクリプトの作成 Autoconfが生成するコンフィギュレーションスクリプトは,慣習的に
configure
と呼ばれます.実行時に,configure
はいくつか
のファイルを作成し,そこで,コンフィギュレーションパラメータを適切な値に
置換します.configure
が作成するファイルは以下の通りです.
一つ以上の`Makefile'で,通常はパッケージのそれぞれのサブディレクト リに一つずつあります(see section Makefileへの代入).
オプションのCヘッダファイルで,それはコンフィグレーション可能な名前で,
#define
ディレクティブを含んでいます(see section コンフィグレーションヘッダファイル).
`config.status'という名のシェルスクリプトで,それは実行時に上記でリ ストアップされているファイルを再生成します(see section コンフィグレーションの再生成).
(`configure --config-cache'が使用されるときに作成される) `config.cache'という名のオプションのシェルスクリプトで,それは多く のテストの実行結果を保存しています(see section キャッシュファイル).
`config.log'という名のコンパイラが生成する全てのメッセージを含んで
いるファイルで,configure
が失敗した場合はデバッグの助けとなり
ます.
Autoconfを用いてconfigure
スクリプトを作成するために,Autoconf
の入力ファイル`configure.ac'(または`configure.in')を書き,
autoconf
をそこで実行する必要があります.Autoconfでもたらされた
ものを補うために独自の機能テストを書く場合,`aclocal.m4'と
`acsite.m4'という名のファイルも書くことになるでしょう.
#define
ディレクティブを含むCヘッダファイルを使用する場合,
autoheader
も実行し,パッケージで生成されるファイル
`config.h.in'を配布することになるでしょう.
コンフィギュレーションで使用可能なファイルを生成する方法は,以下で示す図
の用になります.実行するプログラムには,`*'が付いています.オプショ
ンのファイルは角カッコ(`[]')で囲っています.autoconf
と
autoheader
は,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'を書く | What to put in an Autoconf input file | |
3.2 `configure.ac'を作成するためにautoscan を使用する | Semi-automatic `configure.ac' writing | |
3.3 条件をリストアップするためifnames を使用する | Listing the conditionals in source code | |
3.4 configure を作成するためautoconf を使用する | How to create configuration scripts | |
3.5 configure スクリプトを更新するためautoreconf を使用する | Remaking multiple configure scripts
|
ソフトウェアパッケージの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 as solution of a problem | |
3.1.2 Autoconf言語 | Programming in Autoconf | |
3.1.3 標準的な`configure.ac'のレイアウト | Standard organization of `configure.ac' |
他のコンピュータ言語に対して,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マクロの組み合わせとして拡張部分を実装する方が自然です.
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. |
`configure.ac'でAutoconfマクロを呼び出す順番は,いくつか例外があり
ますが重要ではありません.すべての`configure.ac'では,調査の前の
AC_INIT
の呼び出しと,最後のAC_OUTPUT
の呼び出しを含める必要
があります(see section 出力ファイルを生成する).さらに,いくつかの変数については,何を行なう
かを決定するため,前もって設定されている値を調査できるように,他のマクロ
が最初に呼ばれることに依存するマクロもあります.これらのマクロはそれぞれ
の説明で書かれていて(see section 存在の調査),configure
が作成
されているとき,間違った順番で呼び出されている場合は警告されます.
整合性を促進するため,Autoconfマクロを呼び出す順番をここで提案します.一 般的に言って,このリストの終わり近くのものは,その前のものに依存します. 例えば,ライブラリ関数は型とライブラリの影響があります.
Autoconfの必要条件 |
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
は以下のオプションを受け入れます.
コマンドラインオプションの概要を出力して終了します.
Autoconfのバージョンナンバーを出力して終了します.
調査しているファイルと,その中で見つかった興味深いものとなる可能性のある シンボル名を出力します.この出力は大量になるはずです.
dirをインクルードパスの後に追加します.複数回の呼び出しで累積され ます.
dirをインクルードパスの前に追加します.複数回の呼び出しで累積され ます.
ifnames
を使用する ifnames
は,ソフトウェアパッケージに対する`configure.ac'
を書くとき役に立つはずです.それは,Cプリプロセッサの条件式でパッケージ
が既に使用している識別子を出力します.パッケージが既に移植性に対して準備
されている場合,ifnames
はconfigure
で調査することが必
要なものを理解することに役く立つはずです.それはautoscan
が生成
した`configure.ac'とのギャップを埋める役に立つかもしれません
(see section `configure.ac'を作成するためにautoscan
を使用する).
ifnames
は,コマンドラインで指名されたすべてのCソースファイルを
(無い場合は標準入力から)走査し,これらのファイルに現れる#if
,
#elif
,#ifdef
,または#ifndef
ディレクティブの,すべ
ての識別子をソートしたリストを標準出力に書き出します.それは,識別子があ
るファイルの空白で分離されたリストに続いて,一行にぞれぞれの識別子を出力
します.
ifnames
は以下のオプションを受け入れます.
コマンドラインオプションの概要を出力して終了します.
Autoconfのバージョンナンバーを出力して終了します.
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
は以下のオプションを受け入れます.
コマンドラインオプションの概要を出力して終了します.
Autoconfのバージョンナンバーを出力して終了します.
処理しているステップを報告します.
一時的なファイルを削除しません.
入力ファイルより`configure'が新しい場合でも,それを再生成します.
dirをインクルードパスの後に追加します.複数回の呼び出しで累積され ます.
dirをインクルードパスの前に追加します.複数回の呼び出しで累積され ます.
(出力や追跡の)出力をfileに保存します.ファイル`-'は標準出力 に対するものです.
(実際にはカンマで分けたリストが可能な)categoryに関連する警告を報告
します.カテゴリの総合的なリストは,マクロAC_DIAGNOSE
と
See section メッセージの報告. 特別な値には,以下のものが含まれています.
全ての警告を報告します.
何も報告しません.
警告をエラーとして扱います.
categoryに分類される警告を利用不可能にします.
`syntax'に関する警告はデフォルトで利用可能で,カンマで分けられたカ
テゴリリストの環境変数WARNINGS
は尊重されます.`-W
category'を渡すことで,
`--warnings=syntax,$WARNINGS,category'が渡されたかのように動
作します.デフォルトとWARNINGS
を利用不可能にしたいが,(例えば) 時
代遅れの構成物についての警告は利用可能にしたい場合,`-W
none,obsolete'を使用してください.
autoconf
はバックグラウンドでautom4te
を使用するので,
それはエラーのバックトレースを表示しますが,警告については行ないません.
そうしたい場合,`-W error'のみを渡してください.いくつかの例は,
See section autom4te
の呼び出し.
configure
スクリプトを作成しませんが,formatでマクロの呼
び出しをリストアップします.複数の`--trace'の引数は,複数のマクロ
をリストアップするために使用可能です.単一のマクロに対する複数の
`--trace'の引数は,累積的ではありません.その代わりにformat
を必要なものにすべきです.
formatは,必要な場合は改行をともなう通常の文字列と,いくつかの特殊
なエスケープコードです.デフォルトは`$f:$l:$n:$%'です.format
の詳細は,autom4te
の呼び出しを参照してください.
デフォルトで,`--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 |
configure
スクリプトを更新するためautoreconf
を使用する GNUビルドシステムの様々なコンポーネントをインストールすること
は退屈なものです.それは,Gettextに対するautopoint
,
`Makefile.in'やautomake
等を,それぞれのディレクトリで実行
することを意味します.automake
のようなツールが更新されたり,
`configure.ac'のようなソースが更新されたり,ただ単純にGNU
ビルドシステムを新しいツリーにインストールするためだけでも,そうすること
が必要になるかもしれません.
autoreconf
は,指定されたディレクトリとそのサブディレクトリ
(see section サブディレクトリで他のパッケージをコンフィグレーションする)で,GNUビルドシステムを更新するために,
autoconf
,autoheader
,aclocal
,
automake
,libtoolize
,そして(適切なときは)
autopoint
を繰り返し実行します.デフォルトで,ソースファイルよ
り古いファイルだけが再生成されます.
新しいバージョンのツールをインストールした場合,autoreconf
に
`--force'オプションを与えることで,すべてのファイルを再生
成することが可能です.
ソースファイルを変更したとき,configure
スクリプトを自動的に再
生成する`Makefile'ルールについては,See section 自動的なリメイク. そ
の方法は,コンフィギュレーションヘッダテンプレートのタイムスタンプを正確
に処理しますが,`--autoconf-dir=dir'や
`--localdir=dir'を渡しません.
autoreconf
は以下のオプションを受け入れます.
コマンドラインオプションの概要を出力して終了します.
Autoconfのバージョンナンバーを出力して終了します.
autoreconf
がautoconf
(と適切な場合は
autoheader
)を実行している,それぞれのディレクトリ名を出力しま
す.
一時ファイルを削除しません.
`configure'スクリプトとコンフィグレーションヘッダが入力ファイル (`configure.ac'と,存在する場合は`aclocal.m4')より新しくても更 新します.
パッケージの足りない補助ファイルをインストールします.デフォルトで,ファ イルはコピーされます.`--symlink'で変更することも可能です.
このオプションは,`automake --add-missing',`libtoolize', `autopoint'等を呼び出すきっかけにもなります.
`--install'とともに使用されるとき,足りない補助ファイルをコピーす る代わりに,シンボリックリンクを配置します.
ディレクトリがコンフィグレーションされるとき,`./config.status --recheck && ./config.status'を実行してコンフィグレーションを更新し, `make'を実行します.
dirをインクルードパスの後に追加します.複数回の呼び出しで累積され ます.
dirをインクルードパスの前に追加します.複数回の呼び出しで累積され ます.
(実際にはカンマで分離されているリストになっている)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.