Autoconfが生成するコンフィギュレーションスクリプトは,慣習的に @command{configure}と呼ばれます.実行時に,@command{configure}はいくつ かのファイルを作成し,そこで,コンフィギュレーションパラメータを適切な 値に置換します.@command{configure}が作成するファイルは以下の通りです.
#define
ディレクティブを含んでいます(see section コンフィグレーションヘッダファイル).
Autoconfを用いて@command{configure}スクリプトを作成するために,
Autoconfの入力ファイル`configure.ac'(または`configure.in')
を書き,@command{autoconf}をそこで実行する必要があります.Autoconfでも
たらされたものを補うために独自の機能テストを書く場合,
`aclocal.m4'と`acsite.m4'という名のファイルも書くことになる
でしょう.#define
ディレクティブを含むCヘッダファイルを使用する
場合,@command{autoheader}も実行し,パッケージで生成されるファイル
`config.h.in'を配布することになるでしょう.
コンフィギュレーションで使用可能なファイルを生成する方法は,以下で示す 図の用になります.実行するプログラムには,`*'が付いています.オプ ションのファイルは角カッコ(`[]')で囲っています. @command{autoconf}と @command{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 ---'
ソフトウェアパッケージの@command{configure}スクリプトを生成するため, パッケージが必要とする,または利用可能なシステムの特徴をテストする Autoconfマクロの呼び出しを含んでいる,`configure.ac'と呼ばれるファ イルを作成してください.Autoconfマクロには,多くの特徴を調査するものは すでに存在しています.それら関する記述は,section 存在の調査を参照し てください.ほとんどのその他の特徴に対しては,カスタムチェックを生成す るAutoconfのテンプレートマクロを使用することが可能です.それらに関する 詳細は,section テストを書くを参照してください.特にトリッキーな,また は専門的な特徴に対して,`configure.ac'に,若干の手作りのシェルコ マンドを含める必要もあるでしょう.@command{autoscan}プログラムは `configure.ac' を書くための良いきっかけ与えてくれます.(詳細は, see section `configure.ac'を作成するために@command{autoscan}を使用する).
Autoconfのこれまでのバージョンでは,名前`configure.in'を勧めてい ましたが,それは曖昧で(このファイルを処理するために必要なツールは,拡 張子では分かりません),`config.h.in'などで(`.in'は "@command{configure}で生成される"という意味では)ちょっと混乱していま した.現在では,`configure.ac'の使用が好まれます.
他のコンピュータ言語のために,Autoconfで`configure.ac'を正しくプ ログラムするために,言語が解決しようとする問題が何で,そうする ためにどうするのかを理解する必要があります.
Autoconfが解決する問題は,世界が混乱しているということです.結局,全て の異なる種類のシステムでパッケージのコンパイルを簡単にするために Autoconfを使用しますが,それを極端に嫌う人も中にはいます.Autoconf自身 は,これらの差を価値あるものとして扱います.@command{configure}をこれ らの全てのシステムで実行する必要があり,そのため,@command{configure} には,機能的にそれらの最小公倍数に制限する必要があります.
通常,シェルスクリプトを考えるでしょう.@command{autoconf}が必要でしょ うか?正しく書かれたシェル関数の組み合わせで,手で@command{configure} スクリプトを書くことを十分に簡単にします.ああ!残念ながら,シェル関数 は最小公倍数ではありません.そのため,関数を定義しそれを十回使用したい ところで,その本体を十回コピーする必要があるでしょう.
そのため,本当に必要なものは,コンパイラのようなもの,すなわち @command{autoconf},Autoconfプログラムが受け入れるもの,すなわち `configure.ac',そして,それを移植性の高いシェルスクリプト @command{configure}に変換するものです.
どのようにして,@command{autoconf}がこの作業を実行するのでしょう?
可能性としては明らかに二つあります.新しい言語を作成すること,または既
存のものを拡張することです.前者は非常に魅力的です.あらゆる最適化が簡
単に実装可能で,Autoconfプログラムで厳密なチェックを実行することが可能
です(例えば,移植性のないあらゆる構成物は除外します).あるいは,
sh
(Bourne shell) 言語のように,既存の言語を拡張することが可能で
す.
Autoconfは後者の方法でで行なっています.それはsh
の最上位層です.
そのため,マクロを展開するものとして@command{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の構成物の一つを,今では理解できるでしょう @enddots{}第一の規則は,@emph{マクロ展開が予測されるところでは,引用符 の展開を予測してください}ということです.すなわち,引用符のレベルの一 つが失われるということです.例えば,以下のようにします.
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`a,今回は実際に`char b[10];'を生成しているのです!
注意深く読んでいると,これらのガイドラインによれば,上記の例の
AC_CHECK_HEADER
で引用符で"正しく"囲まれているものは,実際には
三組の引用符が足りないことに気付くでしょう!それにもかかわらず,可読性
のため,リテラルを二重に引用符で囲むことは,このマニュアルでは必要なと
ころでのみ使用されます.
オプションの引数を受け入れるマクロもあり,それはこのドキュメントでは (引用符の文字を使用して混乱しないように),@ovar{arg}として表現します. 空のままにしたり,明示的に引数を空にするために`[]'を使用したり, 単純に後置されるカンマを省略したりすることが可能です.以下の三行は等価 となります.
AC_CHECK_HEADERS(stdio.h, [], [], []) AC_CHECK_HEADERS(stdio.h,,,) AC_CHECK_HEADERS(stdio.h)
`configure.ac'では,単独行にそれぞれのマクロ呼び出しを書くことが 最善です.ほとんどのマクロは,余分な改行を加えません.それらは,コマン ドを終端するためのマクロ呼び出しの後の改行に依存しています.このアプロー チでは,生成された@command{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 存在の調査)ていて,
@command{configure}が作成されているとき,間違った順番で呼び出されてい
る場合は警告されます.
整合性を促進するため,Autoconfマクロを呼び出す順番をここで提案します. 一般的に言って,このリストの終わり近くのものは,その前のものに依存しま す.例えば,ライブラリ関数は型とライブラリの影響があります.
Autoconfの必要条件AC_INIT(package, version, bug-report-address)
パッケージの情報 プログラムの調査 ライブラリの調査 ヘッダファイルの調査 型の調査 構造体の調査 コンパイラの特徴の調査 ライブラリ関数の調査 システムサービスの調査AC_CONFIG_FILES([file...])
AC_OUTPUT
@command{autoscan}プログラムは,ソフトウェアパッケージに対する `configure.ac'ファイルの作成と/または管理に役に立ちます. @command{autoscan}は,コマンドライン引数で与えられたディレクトリをルー トとするディレクトリツリー,または,与えられていない場合はカレントディ レクトリでソースファイルを調査します.それは,ソースファイルの一般的な 移植性の問題を検索して,パッケージに対する`configure.ac'の準備と なるファイル`configure.scan'を作成し,あるいは存在している `configure.ac'の完全性を調査します.
`configure.ac'を作成するために@command{autoscan}を使用するとき,
`configure.scan'を`configure.ac'に改名する前に,手作業でそれ
を調査する必要があります.恐らくなんらかの調整が必要です.時折
@command{autoscan}は,@command{autoconf}が警告を出すような,関連するマ
クロに対して間違った順序でマクロを出力する場合もあります.手作業でその
ようなマクロを移動する必要があります.また,パッケージでコンフィギュレー
ションヘッダファイルを使用する場合も,AC_CONFIG_HEADER
の呼び出
しを加える必要があります(see section コンフィグレーションヘッダファイル).また,
Autoconfで動作するように,プログラムの#if
ディレクティブを変更し
たり加えたりする必要があります(そのような仕事に役に立つプログラムの情
報は,see section 条件をリストアップするため@command{ifnames}を使用する).
`configure.ac'を管理するために@command{autoscan}を使用していると き,単純にそれが追加した提案を考えてください.ファイル `autoscan.log'には,マクロが要求される理由に関する詳細な情報が含 まれています.
@command{autoscan}は,パッケージのソースファイルで特定のシンボルを見つ けたときに出力するマクロを決定するため,(Autoconfと一緒にインストール されている)データファイルも使用します.これらのデータファイルはすべて 同じ書式です.それぞれの行は,シンボル,空白スペース,そしてそのシンボ ルがある場合に出力するAutoconfマクロから成り立っています.`#'で始 まる行はコメントです.
@command{autoscan}は以下のオプションを受け入れます.
@command{ifnames}は,ソフトウェアパッケージに対する`configure.ac' を書くとき役に立つはずです.それは,Cプリプロセッサの条件式でパッケー ジが既に使用している識別子を出力します.パッケージが既に移植性に対して 準備されている場合,@command{ifnames}は@command{configure}で調査するこ とが必要なものを理解することに役く立つはずです.それは @command{autoscan}が生成した`configure.ac'とのギャップを埋める役 にも立つかもしれません(see section `configure.ac'を作成するために@command{autoscan}を使用する).
@command{ifnames}は,コマンドラインで指名されたすべてのCソースファイル
を(無い場合は標準入力から)走査し,これらのファイルに現れる#if
,
#elif
,#ifdef
,または#ifndef
ディレクティブの,す
べての識別子をソートしたリストを標準出力に書き出します.それは,識別子
があるファイルの空白で分離されたリストに続いて,一行にぞれぞれの識別子
を出力します.
@command{ifnames}は以下のオプションを受け入れます.
`configure.ac'から@command{configure}を作成するために, @command{autoconf}プログラムを引数無しで実行してください. @command{autoconf}は,Autoconfマクロを使用しながら,M4マクロプロセッサ を用いて`configure.ac'を処理します.@command{autoconf}に引数を与 えている場合,`configure.ac'の代わりにそのファイルを読み, @command{configure}の代わりに,標準出力にコンフィグレーションスクリプ トを書き出します.@command{autoconf}に引数@option{-}を与えた場合, `configure.ac'の代わりに標準入力から読み込み,標準出力にコンフィ グレーションスクリプトを書き出します.
Autoconfマクロは,複数のファイルで定義されています.ファイルは, Autoconfと一緒に配布される物もあります.@command{autoconf}は最初にそれ を読み込みます.オプションのファイル`acsite.m4'を,配布された Autoconfマクロファイルを含むディレクトリで探し,オプションのファイル `aclocal.m4'はカレントディレクトリで探します.これらのファイルは, サイトやパッケージのAutoconfマクロ定義を含めることが可能です(詳細は, see section Autoconfマクロを書く).一つ以上のファイルで定義されているマ クロを@command{autoconf}が読み込む場合,最後の定義がそれ以前の定義に優 先します.
@command{autoconf}は以下のオプションを受け入れます.
AC_DIAGNOSE
と
See section メッセージの報告. 特別な値には,以下のものが含まれています.
WARNINGS
は尊重されます.`-W
category'を渡すことで,
`--warnings=syntax,$WARNINGS,category'が渡されたかのように
動作します.デフォルトとWARNINGS
を利用不可能にしたいが,(例えば)
時代遅れの構成物についての警告は利用可能にしたい場合,@option{-W
none,obsolete}を使用してください.
@command{autoconf}はバックグラウンドで@command{autom4te}を使用するので,
それはエラーのバックトレースを表示しますが,警告については行ないません.
そうしたい場合,@option{-W error}のみを渡してください.いくつかの例は,
See section @command{autom4te}の呼び出し.
AC_DEFUN
の定
義)の初期化を追跡しません.これで顕著に高速化されますが,このオプショ
ンで利用不可能にすることができます.
`configure.ac'ファイルの内容を調査する必要があることもよくありま すが,自分で解析することは,非常に脆くエラーを起こしやすいものです. `configure.ac'をスキャンするために,@option{--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
@acronym{GNU}ビルドシステムの様々なコンポーネントをインストールするこ とは退屈なものです.それは,Gettextに対する@command{autopoint}, `Makefile.in' や@command{automake}等を,それぞれのディレクトリで 実行することを意味します.@command{automake}のようなツールが更新された り,`configure.ac'のようなソースが更新されたり,ただ単純に @acronym{GNU}ビルドシステムを新しいツリーにインストールするためだけで も,そうすることが必要になるかもしれません.
@command{autoreconf}は,指定されたディレクトリとそのサブディレクトリ (see section サブディレクトリで他のパッケージをコンフィグレーションする)で,@acronym{GNU}ビルドシステムを更新するため に,@command{autoconf},@command{autoheader},@command{aclocal}, @command{automake},@command{libtoolize},そして(適切なときは) @command{autopoint}を繰り返し実行します.デフォルトで,ソースファイル より古いファイルだけが再生成されます.
新しいバージョンのツールをインストールした場合,@command{autoreconf}に @option{--force}オプションを与えることで,すべてのファイルを再 生成することが可能です.
ソースファイルを変更したとき,@command{configure}スクリプトを自動的に 再生成する`Makefile'ルールについては,See section 自動的なリメイク. その方法は,コンフィギュレーションヘッダテンプレートのタイムスタンプを 正確に処理しますが,@option{--autoconf-dir=dir}や @option{--localdir=dir}を渡しません.
@command{autoreconf}は以下のオプションを受け入れます.
WARNINGS
は尊重されます.`-W
category'を渡すと,実際には
`--warnings=syntax,$WARNINGS,category'を渡したかのように動
作します.デフォルトのものとWARNINGS
を利用不可能にし,(例えば)
時代遅れの構成物に関する警告を利用可能にしたい場合@option{-W
none,obsolete}を使用してください.
Go to the first, previous, next, last section, table of contents.