Autoconf

Creating Automatic Configuration Scripts

Edition 2.13, for Autoconf version 2.13

December 1998

by David MacKenzie and Ben Elliston


Introduction

A physicist, an engineer, and a computer scientist were
discussing the nature of God.  Surely a Physicist, said the
physicist, because early in the Creation, God made Light; and you
know, Maxwell's equations, the dual nature of electro-magnetic
waves, the relativist consequences... An Engineer!, said the
engineer, because before making Light, God split the Chaos into
Land and Water; it takes a hell of an engineer to handle that big
amount of mud, and orderly separation of solids from
liquids... The computer scientist shouted: And the Chaos,
where do you think it was coming from, hmm?

---Anonymous
物理学者と工学者と計算機科学者の 3 人が神の本質について語りあっていた。
「もちろんそれは物理学者さ」と、物理学者は言った。天地想像の最初に神は光
を創造した。それは御存知の通り Maxwell の方程式そのものだ。電磁波、そし
て相対論的に結果は... 「工学者さ!」と、工学者は言った。神は光を創造
する前に混沌から大地と海を分離したんだぜ。そんな大量の泥を扱えるのは工学
者だけさ。秩序正しく液体と固体を分離するということは... その時、計算
機科学者が叫んだ : じゃあ、混沌はどこから来たっていうんだい? え? もちろ
んそれは...

---作者不詳

Autoconfは、各種UNIX系システムにあわせてソースコードパッケージを 設定(configure)するためのshellスクリプトを自動生成するツールです。 Autoconfによって生成された自動設定スクリプトは、実行されるときには Autoconfとは独立に動きます。このため、自動設定スクリプトのユーザは Autoconfを持っている必要がありません。

Autoconfによって生成される自動設定スクリプトは、ユーザの介入を 必要としません。普通はシステム種別を引数として指定する必要も ありません。引数を求めたりするかわりに、ソフトウェアパッケージが使う 可能性のあるOSの機能が存在するかどうかがひとつづつチェックされます。 (各チェックの前に、何をチェックしているのかが1行メッセージとして 表示されます。このため、ユーザはスクリプトの実行を待っている間さほど 退屈せずにすみます) 結果として、ターゲットが通常のUNIX系のOSよりもカスタマイズされていたり、 (BSD系とSVR4系の)融合されたOSだったりしても、スクリプトはターゲットOSを うまく扱うことができます。各々のUNIX系OSについて、どの機能がサポート されているかをファイルに記録したりする必要はありません。

Autoconfは、Autoconfを用いる各ソフトウェアパッケージについて、 自動設定スクリプトを作成します。自動設定スクリプトは各パッケージが 必要とする、または用いることのできるOSの機能を並べた テンプレートファイルから生成されます。 OSの機能を検出して反応するshellスクリプトが書けたなら、 Autoconfはそのshellスクリプトを複数のソフトウェアパッケージで 共有する機構を持っています。もし後でshellスクリプトを修正する 必要が生じた場合でも、定義を1箇所だけ変更すればいいようになっています。 各ソフトウェアパッケージの自動生成スクリプトを再生成すれば、 shellスクリプトへの修正が反映されます。

MetaconfigパッケージはAutoconfと似た目的をもっていますが、 Metaconfigによって生成されるスクリプトはユーザの介入を必要とし、 大きなソースツリーを設定する場合には不便です。 Metaconfigの生成するスクリプトと違い、Autoconfはクロスコンパイルの 設定も扱うことができます(設定ファイルを注意深く書けば)。

移植性の高いソフトウェアパッケージを作るためには、Autoconfの してくれないことがいくつか必要になります。例えば、各ターゲット プログラムのための`Makefile'の自動生成や、システムに欠けている 標準ライブラリ関数やヘッダファイルを補う、などです。これらを自動化 するための作業は現在進行中です。

Autoconfを使う場合、C言語のプログラムで#ifdefして使うシンボルの 名前に一部制限が生じます(see section Preprocessor Symbol Index)。

Autoconfはスクリプトの生成のためにGNU m4を必要とします。 Autoconfは一部のUNIXについてくるm4にはない機能を使っています。 また、Autoconfは(GNU m4 1.0を含む)一部のバージョンのm4の 内部制限を越えてしまう場合があります。 Autoconfと一緒には、GNU m4 1.1以降を使う必要があります。 バージョン1.3あるいはそれ以降を使った場合、1.1や1.2を使う場合より 大幅に高速になります。

バージョン1からのアップグレードのためにはSee section Upgrading From Version 1を 参照してください。 Autoconfの開発経緯についてはSee section History of Autoconfを参照してください。 Autoconfに関する質問集はSee section Questions About Autoconfを参照してください。

Autoconfに関する御意見やバグレポートは bug-gnu-utils@prep.ai.mit.eduまでmailでお寄せください。 Autoconfのバージョン番号を書くのを忘れずに。 バージョン番号は`autoconf --version'で調べられます。

訳註: この和訳版は萩野(伊藤)いとぢゅん純一郎 (itojun@itojun.org)に よるものです。 訳し間違いがあっても、犬も食いません。 疑問点があったら、「必ず原文を参照する」ようにしてください。 再配布などについては原文に従います。

訳註2: 伊藤いとぢゅん純一郎氏の和訳に私、山内斉 (yamauchi@archi.is.tohoku.ac.jp)は大変助けられました。全体を読む 気が起きたのは和訳のおかげです。伊藤氏の訳は途中とはいえ、公開して下さっ たおかげで、私は非常に助けられ、感謝の意を込めて残る部分を和訳しました。 私が訳を行なった部分についても、疑問点は「必ず原文を参照」して下さい。訳 語が統一されていない部分もあると思いますが、御容赦下さい。(1999/11)

訳註3: というわけで山内氏の訳をマージし、ほとんど訳しあがりました。(1999/11)

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 ---'

Writing `configure.in'

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

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

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 Configuration Header Files) マクロの呼び出しを追加する必要があります。さらに、プログラムが Autoconfとうまく動くように、ソースコードの方に#ifディレクティブを 追加する必要があるでしょう(この作業を楽にするためのツールについては see section Using ifnames to List Conditionalsを参照)。

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

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

--help
コマンドラインオプションの説明を出力して終了します。
--macrodir=dir
デフォルトのインストールディレクトリでなく、 ディレクトリdirにある設定ファイルを 参照します。環境変数AC_MACRODIRを 設定しても同じ効果が得られます。 コマンドラインオプションは環境変数の設定より 優先されます。
--verbose
調べているファイルの名前と、みつけた重要そうな シンボル名を表示します。出力されるメッセージ量は 膨大になる可能性があります。
--version
Autoconfのバージョン番号を出力して終了します。

Using ifnames to List Conditionals

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

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

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

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

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 Writing Macros 参照)。同じマクロがautoconfが読み込むファイルのうち複数のファイルで 定義されていた場合、あとから読み込まれたものが有効になります。

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

--help
-h
コマンドラインオプションの説明を出力して終了します。
--localdir=dir
-l dir
`aclocal.m4'を探すとき、カレントディレクトリでなしに ディレクトリdirを探しにいきます。
--macrodir=dir
-m dir
デフォルトのインストールディレクトリでなく、 ディレクトリdirにあるAutoconfマクロ ファイルを参照します。環境変数AC_MACRODIRを 設定しても同じ効果が得られます。 コマンドラインオプションは環境変数の設定より 優先されます。
--version
Autoconfのバージョン番号を出力して終了します。

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' を利用した場合には、そ れらは全て同じパッケージとみなされ、`--localdir' を利用しない場合に は、それぞれのディレクトリは分離したディレクトリとみなされます。この制限 は将来的には解消される予定です。

`Makefile'のルールで必要なときにconfigureスクリプトを自動再 生成させる場合にはSee section 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のバージョン番号を出力して終了します。

Initialization and Output Files

Autoconfで生成されたconfigureスクリプトは、初期化や結果出力の ための情報を必要します。たとえば、パッケージのソースファイルは どこにあるのかとか、どのような出力ファイルを生成すべきか、などです。 以下の節では、初期化と結果出力について説明します。

Finding configure Input

configureスクリプトは他の全てのマクロより先に、AC_INIT マクロを呼び出さねばなりません。必ず呼び出されなければならないマクロは AC_INITAC_OUTPUTだけです(see section Creating Output Files)。

Macro: AC_INIT (unique-file-in-source-dir)
コマンドライン引数を処理し、ソースコードの置かれている ディレクトリをみつけます。unique-file-in-source-dirは パッケージのソースコードの置かれたディレクトリにある、 任意のファイルの名前です; configureは、指定された ディレクトリにソースコードが実際あるかどうか、 そのファイルが存在するかどうかを調べることで判断します。 ときには、ユーザはコマンドラインオプション`--srcdir'で 間違ったディレクトリを指定するかもしれません; この判定は、 安全のためのチェックです。詳しくはSee section Running configure Scriptsを 参照してください。

手動で設定を行うパッケージや、installプログラムを 利用するパッケージでは、AC_CONFIG_AUX_DIRを使って、 configureに他のshellスクリプトがどこにあるかを 知らせる必要があるかもしれません。たいていはデフォルトで 調べにいく場所で正しいのですが。

Macro: AC_CONFIG_AUX_DIR(dir)
ディレクトリdirに格納されている `install-sh'`config.sub'`config.guess'、それからCygnus configureスクリプトを利用することを 指定します。dirは絶対パス、または `srcdir'からの相対パスで指定します。 デフォルトは`srcdir'または `srcdir/..'または `srcdir/../..'のうち、 `install-sh'が最初にみつかった場所です。 他のファイルの置き場所についてはチェックが 行われません。これはAC_PROG_INSTALLを 使っただけで他のファイルを配布しなければ ならなくなるのを防ぐためです。 このマクロは`install.sh'もチェックしますが、 このファイル名はobsoleteです。なぜなら、 `Makefile'がない場合、makeが組み込み ルールを使って`install.sh'から`install'を 生成しようとするからです。

Creating Output Files

Autoconfで生成されたconfigureスクリプトは、 最後にAC_OUTPUTを呼び出さねばなりません。 このマクロは、`Makefile'や他のファイルを自動設定結果にしたがって 生成します。configure.inに必ず含まれなければならない マクロは、AC_OUTPUTの他にはAC_INITだけです(see section Finding configure Input)。

Macro: AC_OUTPUT ([file... [, extra-cmds [, init-cmds]]])
出力ファイルを生成します。このマクロは 1度だけ、`configure.in'の末尾で 呼び出す必要があります。マクロの 引数file...は、スペースで 区切られた出力ファイル列です; これは空でも構いません。 このマクロは、入力ファイルを `file'へ出力変数の値を 置換しながらコピーすることで生成します。 入力ファイルの名前はデフォルトでは `file.in'です。 出力変数の使い方についてはSee section Substitutions in Makefilesを 参照してください。出力変数を定めるためには、 See section Setting Output Variablesを参照してください。 このマクロは出力先のディレクトリがなければ ディレクトリを作成します(が、さらに親のディレクトリは 作成されません)。通常、このマクロを使って生成する ファイルは`Makefile'ですが、他のファイル、たとえば `.gdbinit'を生成するのにも使えます。

AC_CONFIG_HEADERAC_LINK_FILES、または AC_CONFIG_SUBDIRSマクロが呼び出されていた場合、 AC_OUTPUTは各マクロの引数に指定されたファイルも 生成します。

たいてい、AC_OUTPUTは以下のように呼び出されます:

AC_OUTPUT(Makefile src/Makefile man/Makefile X/Imakefile)

入力ファイルの名前は、fileのあとにコロンをつけて、 そのあとに入力ファイル名を繋げることで変更できます。 たとえば:

AC_OUTPUT(Makefile:templates/top.mk lib/Makefile:templates/lib.mk)
AC_OUTPUT(Makefile:templates/vars.mk:Makefile.in:templates/rules.mk)

こうすることで、ファイル名をMS-DOSでも使える フォーマットにしたり、ファイルの前後に メッセージ(訳註: boilerplate)をつけたり することができます。

extra-cmdsを指定した場合、指定された コマンドは他の処理の後に実行されるように `config.status'に追加されます。 init-cmdsが指定された場合、それは shell変数、コマンド、backslashの 置き換えが行われた後、extra-cmdsの 直前に挿入されます。init-cmdsを 使うことで、configureから extra-cmdsに変数を引き渡すことが できます。AC_OUTPUT_COMMANDSマクロが 呼び出されていた場合、AC_OUTPUT_COMMANDSに 指定されたコマンドは、AC_OUTPUTに指定された コマンドの直前に実行されます。

Macro: AC_OUTPUT_COMMANDS (extra-cmds [, init-cmds])
`config.status'の末尾で実行される shellコマンドと、shellコマンド呼び出し前に configureで行うべき変数初期化 手続きを指定します。このマクロは複数回呼び出しても 構いません。実用的でない例題はこんな感じ:

fubar=27
AC_OUTPUT_COMMANDS([echo this is extra $fubar, and so on.], fubar=$fubar)
AC_OUTPUT_COMMANDS([echo this is another, extra, bit], [echo init bit])

makeをサブディレクトリで実行する場合には、 変数MAKEを使ってmakeを呼び出さねば なりません。ほとんどのmakeでは、変数 MAKEmakeプログラムと与えられた オプションに設定されます(が、多くの場合 コマンドラインでの変数値設定は含まれません)。 一部の古いmakeでは、変数MAKEは 設定されません。以下のマクロを使うと、そのような 古いmakeでも変数MAKEを使うことができます。

Macro: AC_PROG_MAKE_SET
makeが変数MAKEを設定しているなら、 変数SET_MAKEを空にします。 そうでない場合、SET_MAKE`MAKE=make'に 設定します。内部でAC_SUBSTSET_MAKEを置換するように呼び出します。

このマクロを利用する場合、MAKEを利用する 各々のMakefile.inに以下のような行を置いてください:

@SET_MAKE@

Substitutions in Makefiles

配布パッケージの各サブディレクトリのうちでコンパイルやインストールが 必要なディレクトリには、`Makefile.in'を置きます。 configure`Makefile.in'から`Makefile'を生成します。 `Makefile'を生成する際には、configureは単純な 変数置換を行います。これは、`Makefile.in'中に登場する `@variable@'configureが求めた変数値で 置き換えることによって行われます。このようにして出力ファイルで 置換される変数のことをoutput variables(出力変数)と呼びます。 通常、出力変数はconfigureが設定するshell変数です。 configureにある変数値で置換を行わせる場合、変数名を 引数にしてマクロAC_SUBSTを呼び出す必要があります。 AC_SUBSTの呼び出されていない変数については、 `@variable@'はそのまま出力されます。 AC_SUBSTを使って出力変数を決める方法については See section Setting Output Variablesを参照してください。

configureスクリプトを用いるソフトウェアパッケージは、 `Makefile'ではなくて`Makefile.in'と一緒に配布される 必要があります; こうすれば、ユーザはコンパイルの前に必ず configureスクリプトを実行して、各々のシステムにあわせた 設定を行うことになります。

See section `Makefile Conventions' in The GNU Coding Standards, for more information on what to put in `Makefile's.

Preset Output Variables

Autoconfマクロでいくつかの出力変数が前もって設定されています。 Autoconfマクロの一部では、追加の出力変数を設定します。これについては 各マクロの説明のところで述べられています。 出力変数の完全なリストをみるにはSee section Output Variable Indexを 参照してください。前もって設定される出力変数の意味を以下に示します。 `dir'で終る出力変数については、 See section `Variables for Installation Directories' in The GNU Coding Standards, を参照してください。

Variable: bindir
ユーザが実行する実行ファイルを格納するディレクトリです。

Variable: configure_input
「このファイルはconfigureによって 自動生成されました」というコメントと、 入力ファイル名を含んだコメント文字列です。 AC_OUTPUTは、生成する`Makefile'の 先頭に、この文字列を含むコメント行を 付け加えます。他のファイルについては、 この変数を各入力ファイル先頭のコメント 領域の中で参照しましょう。たとえば、 shellスクリプトである入力ファイルの先頭は 以下のようになります:

#! /bin/sh
# @configure_input@

また、この行を置いておくことで、ファイルを 編集する人にconfigureを使って 処理しないといけない、ということを 思い出させることができます。

Variable: datadir
読み込み専用のアーキテクチャ非依存の データファイルを置くディレクトリ名です。

Variable: exec_prefix
アーキテクチャ依存のファイル名のプレフィックスです。

Variable: includedir
Cヘッダファイルをインストールする先のディレクトリ名です。

Variable: infodir
infoフォーマットのドキュメントをインストールする 先のディレクトリ名です。

Variable: libdir
ライブラリファイルをインストールする先の ディレクトリ名です。

Variable: libexecdir
(ユーザからではなく)他の実行ファイルから呼び出される 実行ファイルをインストールする先のディレクトリ名です。

Variable: localstatedir
各マシンごとの、変更可能なデータを格納するための ディレクトリ名です(訳註: XXX)。

Variable: mandir
manフォーマットのドキュメントをインストールする先の トップディレクトリ名です。

Variable: oldincludedir
gcc以外のコンパイラ向けのCヘッダファイルを インストールする先のディレクトリ名です。

Variable: prefix
アーキテクチャ非依存のファイルをインストールする際の ファイル名のプレフィックスです。

Variable: sbindir
システム管理者によって実行される実行ファイルを インストールする先のディレクトリです。

Variable: sharedstatedir
アーキテクチャ非依存の変更可能なデータを インストールする先のディレクトリ名です。

Variable: srcdir
`Makefile'の処理すべきソースコードの入っている ディレクトリ名です。

Variable: sysconfdir
読み込み専用のマシン単位のデータファイルを インストールする先のディレクトリ名です。

Variable: top_srcdir
パッケージのトップディレクトリです。トップディレクトリでは、 srcdirとおなじです。

Variable: CFLAGS
Cコンパイラのデバッグ/最適化のための オプションです。configureが 実行された環境で指定されていなかった場合、 AC_PROG_CCを呼び出したときの デフォルト値(または、呼び出さなかったら空)が 設定されます。configureはこの変数の 値を使って、Cコンパイラの機能チェックのための コンパイルを行います。

Variable: CPPFLAGS
CプリプロセッサとCコンパイラのための、 ヘッダファイル検索対象ディレクトリ (`-Idir')と、その他の もろもろのオプションです。 もしconfigureが実行された 環境でこの変数が指定されなかった場合、 デフォルト値は空になります。 configureはこの変数の 値を使って、Cコンパイラの機能チェック のためのコンパイル、または プリプロセスを行います。

Variable: CXXFLAGS
C++コンパイラのデバッグ/最適化のための オプションです。configureが 実行された環境で指定されていなかった場合、 AC_PROG_CXXを呼び出したときの デフォルト値(または、呼び出さなかったら空)が 設定されます。configureはこの変数の 値を使って、C++コンパイラの機能チェックのための コンパイルを行います。

Variable: FFLAGS
Fortran 77 コンパイラのためのデバッグ/最適化のオプションです。 configure が実行された環境でこん環境変数が指定されていなかった場 合、 AC_PROG_F77 を呼び出した時のデフォルト値(または、呼び出さな かった場合には空)が設定されます。configure はこの変数の値を使って Fortran 77 コンパイラの feature を調べるためのプログラムをコンパイルしま す。

Variable: DEFS
Cコンパイラに渡す`-D'オプションです。 AC_CONFIG_HEADERマクロが呼び出された 場合、configure`@DEFS@'`-D'群でなく、`-DHAVE_CONFIG_H'で 置き換えます(see section Configuration Header Files 参照)。この変数はconfigureがテストを 行っている間は定義されません。出力ファイルを 生成するときにだけ定義されます。 既に行われてたテストの結果を参照する 場合には、See section Setting Output Variablesを 参照してください。

Variable: LDFLAGS
リンカのためのstrip(`-s')のためや 他のもろもろのためのオプションです。 configureが実行された環境で 指定されていなかった場合、 デフォルト値の空文字列が 設定されます。 configureはこの変数の値を 使って、Cコンパイラの機能チェックの 際のリンクを行います。

Variable: LIBS
リンカに渡す`-l'オプションと `-L'です。

Build Directories

ソフトウェアパッケージを展開した単一のソースコードツリー上で、 同時に複数のアーキテクチャのためのコンパイルを行うことができます。 オブジェクトファイルは各アーキテクチャ別のディレクトリに格納されます。

このためには、makeはソースコードをみつけるために make変数VPATHを使用します。GNU makeと 最近のmakeのほとんどはこの機能をサポートしています。 古いmakeVPATHをサポートしていません; 古いmakeを使う場合、ソースコードとオブジェクトファイルは 同じディレクトリに置かれていなければなりません。

VPATHをサポートするために、各`Makefile.in'には 以下ような行が含まれている必要があります:

srcdir = @srcdir@
VPATH = @srcdir@

VPATHを他の変数の値を使って設定しないでください(たとえば `VPATH = $(srcdir)'のように)。一部のmakeVPATHの 値を設定する場合に変数置換を行います。

configure`Makefile'を生成する際に、 srcdirを正しい値に設定し置換します。

make変数$<(VPATHを使ってみつけたソースディレクトリ中の ファイルのパス名)は、暗黙的ルールの中以外では使わないでください (暗黙的ルールとは、例えば`.c'ファイルから`.o'ファイルを 生成するための手順を定義する`.c.o'のルールのことです)。 一部のmakeは明示的ルール(訳中: 暗黙的ルールでないルール)の中では、 $<定義しません; $<は空になります。

そのかわりに、`Makefile'に記述するコマンドラインはソースファイルを `$(srcdir)/'で始めるようにしてください。例えば:

time.info: time.texinfo
        $(MAKEINFO) $(srcdir)/time.texinfo

Automatic Remaking

以下に示すようなルールをトップレベルの`Makefile.in'に含めると、 設定ファイルを変更したら自動的に設定情報を更新させることができます。 この例題には`aclocal.m4'やconfiguration header fileのような、 使っても使わなくてもいいファイルが全て含まれています。 `Makefile.in'にルールを追加するときには、パッケージ中で 実際使わないものは省略してください。

`${srcdir}/'プレフィックスはVPATHの制限を回避するために 記述されています。

`config.h.in'`config.h'の内容に変化がない場合、 これらのファイルのタイムスタンプは変わりません。 `stamp-'で始まる名前のファイルは、このせいで用いられています。 このようにすることで、余計な再設定を防ぐことができます。 この手法を使う場合、make`config.h.in'が更新済みだと 思うように、`stamp-h.in'をパッケージの配布に含める必要があります。 古いBSD系のシステムでは、touchや他のファイルで空ファイルが 作成される場合、タイムスタンプが変わりません。 このため、逃げ道としてechoを使っています。

${srcdir}/configure: configure.in aclocal.m4
        cd ${srcdir} && autoconf

# autoheader might not change config.h.in, so touch a stamp file.
${srcdir}/config.h.in: stamp-h.in
${srcdir}/stamp-h.in: configure.in aclocal.m4 acconfig.h \
    config.h.top config.h.bot
        cd ${srcdir} && autoheader
        echo timestamp > ${srcdir}/stamp-h.in

config.h: stamp-h
stamp-h: config.h.in config.status
        ./config.status

Makefile: Makefile.in config.status
        ./config.status

config.status: configure
        ./config.status --recheck

さらに、`echo timestamp > stamp-h'AC_OUTPUTの 引数extra-cmdsに指定する必要があります。 config.statusを実行したときに、`config.h'が更新されたという ことがわかるようにするためです。AC_OUTPUTの詳細については See section Creating Output Filesを参照。

設定ファイルにまつわる依存関係については、See section Recreating a Configurationを 参照。

Configuration Header Files

パッケージの移植性テストで、Cプリプロセッサシンボルをいくつか以上 使う場合、コンパイラを起動するときのコマンドラインは、`-D'オプションを 渡さなければならないので非常に長くなります。 この手法にはふたつの問題があります。まずmakeの出力を眺めて間違いを みつけるのが難しくなります。もっと深刻なのは、一部のOSのコマンドライン 長の制限を越えてしまう可能性がある、ということです。 `-D'オプションを使うかわりに、configureスクリプトは `#define'ディレクティブを含んだCヘッダファイルを生成することができます。 AC_CONFIG_HEADERマクロでこのような出力ファイルを選択します。 このマクロはAC_INITの直後に呼び出す必要があります。

パッケージ中のソースコードでは、`#include'ディレクティブを使って、 configuration header fileを他のどのヘッダファイルよりも前に 読み込む必要があります。 一番最初に読み込むのは、定義の一貫性を保つためです(例えば、constを 再定義するヘッダを先に読み込んだりしたら困ります)。 `#include "config.h"'でなしに、`#include <config.h>'を使い、 Cコンパイラに`-I.'オプションを渡しましょう (あるいは`-I..'などと、`config.h'のあるディレクトリを 指定しましょう)。このようにすることで、ソースファイルのあるディレクトリに `config.h'がある状態でも、他のビルドディレクトリを作成して そちらの`config.h'を使ってパッケージをコンパイルすることができます (訳註: 結構意訳)。

Macro: AC_CONFIG_HEADER (header-to-create ...)
AC_OUTPUTにCプリプロセッサ向けの #defineディレクティブ入りの ファイルを作成させ、`@DEFS@'を (shell変数DEFSの値でなく) `-DHAVE_CONFIG_H'に置換させます。 出力ファイル名はheader-to-createに、 スペースで区切って指定します。 通常、header-to-createに使う ファイル名は`config.h'です。

もしheader-to-createに指定された ファイルが既に存在していて、AC_OUTPUTが 出力しようとしている内容と同じ内容だったら、 ファイルは更新されずそのままになります。 このようにすることで、パッケージの設定の 一部を変更したとき、header-to-createに 指定されたヘッダファイルに依存している ファイルを余計に再コンパイルしなくて済みます。

通常、入力ファイルは `header-to-create.in'という名前です; が、もし名前を変えたい場合には header-to-createにコロンで区切った 名前の列を繋げることで変えられます。 たとえば:

AC_CONFIG_HEADER(defines.h:defines.hin)
AC_CONFIG_HEADER(defines.h:defs.pre:defines.h.in:defs.post)

こうすることで、ファイル名をMS-DOSでも使える フォーマットにしたり、ファイルの前後に メッセージ(訳註: boilerplate)をつけたり することができます。

Configuration Header Templates

配布パッケージには、ヘッダファイルのテンプレートを含める必要があります。 テンプレートは出力がこうあってほしいと思うとおりに書き、 コメントと、デフォルト値を含めた#defineディレクティブを 書いておく必要があります。 例えば、`configure.in'が以下のマクロ呼び出しを含んでいる場合:

AC_CONFIG_HEADER(conf.h)
AC_CHECK_HEADERS(unistd.h)

以下のような行が`conf.h.in'に含まれている必要があります。 `unistd.h'があるシステムでは、configure`#define'の行の0を1に変えて出力します。ないシステムでは、 そのまま出力します。

/* Define as 1 if you have unistd.h.  */
#define HAVE_UNISTD_H 0

あなたのプログラムが#ifでなく#ifdefで 設定オプションを調べている場合、入力ファイルにデフォルト値を設定する #defineの行を書くかわりに、#undefの行を書くことができます。 `unistd.h'があるシステムでは、configureは 2行目を`#define HAVE_UNISTD_H 1'と書き換えます。 そうでないシステムでは、2行目をコメントアウトして出力します (コメントアウトするのは、このシンボルがシステムで既に使われている かもしれないからです)。

/* Define if you have unistd.h.  */
#undef HAVE_UNISTD_H

Using autoheader to Create `config.h.in'

autoheaderプログラムは、configureが使う Cの`#define'ディレクティブ入りのファイルを生成してくれます。 `configure.in'AC_CONFIG_HEADER(file)を 呼び出している場合、autoheader`file.in'を 生成します。複数のファイルが指定されていたら、最初のファイル名を使います。 さもなくば、autoheader`config.h.in'を生成します。

autoheaderにコマンドライン引数を渡した場合、 入力として`configure.in'のかわりに指定されたファイルが使われ、 結果は(`config.h.in'でなく)標準出力に出力されます。 autoheader`-'をコマンドライン引数として渡すと、 (`configure.in'のかわりに)標準入力が読み込まれ、 結果は標準出力に出力されます。

autoheader`configure.in'を調べ、どんなCプリプロセッサシンボルが 定義される可能性があるか推測します。そして、 `acconfig.h'というファイルからコメントと#defineまたは #undefの行をコピーします。 上記の`acconfig.h'はAutoconfと一緒に配布され、所定の場所にインストール されているものです。 カレントディレクトリにも`acconfig.h'がある場合、こちらも使われます。 AC_DEFINEマクロで標準以外のシンボルを定義している場合、 それらのシンボルのぶんのエントリをカレントディレクトリの`acconfig.h'に 造っておく必要があります。 AC_CHECK_HEADERSAC_CHECK_FUNCSAC_CHECK_SIZEOF、 またはAC_CHECK_LIBで定義されるシンボルについては、 (`acconfig.h'から定義をコピーするのではなく) autoheaderがコメントと#undefの行を自動生成します。 なぜなら、これらのマクロで使われる可能性のあるシンボルは事実上無限に あるからです。

autoheaderの生成したファイルは、主に#defineまたは #undefと、付随するコメントからなります。 `./acconfig.h'`@TOP@'という文字列があった場合、 autoheader`@TOP@'を含む行以前の行を 出力の先頭にコピーします。 同様に、`./acconfig.h'`@BOTTOM@'という文字列があった場合、 autoheader`@BOTTOM@'を含む行以降の行を 出力の末尾にコピーします。 どちらの文字列もなくても構いません。

`file.top'(通常`config.h.top'になります)や `file.bot'という名前のファイルをカレントディレクトリに 作っておくと、同様の効果が得られます。 もしファイルがあった場合、autoheaderはファイルの内容を 出力の先頭(または末尾)にコピーします。 これらのファイルを使うのはおすすめしません。 なぜなら、これらのファイル名はMS-DOSファイルシステムに格納できないからです; また、2つのファイルを置くことでディレクトリがごちゃごちゃします。 でも利点もあります。 他のディレクトリにある`acconfig.h'を読み込むために autoheader`--localdir=dir'オプションを使う場合には、 これら2つのファイルを使うと全ての出力ファイルに別々のメッセージ (訳註: boilerplate)をつけることができます。

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

--help
-h
コマンドラインオプションの説明を出力して終了します。
--localdir=dir
-l dir
`aclocal.m4'`acconfig.h'を 探すとき、カレントディレクトリでなしに ディレクトリdirを探しにいきます。 `autoheader'を呼び出す場合には、 `file.top'`file.bot'に ついては挙動は変わりません。
--macrodir=dir
-m dir
デフォルトのディレクトリでなく、ディレクトリ dirにある`acconfig.h'を参照します。 環境変数AC_MACRODIRを設定しても同じ効果が 得られます。コマンドラインオプションは環境変数の 設定より優先されます。
--version
Autoconfのバージョン番号を出力して終了します。

Configuring Other Packages in Subdirectories

ほとんどの場合、サブディレクトリに`Makefile'を作るには AC_OUTPUTを使えば十分です。 しかし、複数の独立したパッケージを制御するconfigure スクリプトを作る場合には、AC_CONFIG_SUBDIRSを使うことで サブディレクトリにあるconfigureスクリプトを呼び出すことができます。

Macro: AC_CONFIG_SUBDIRS (dir ...)
AC_OUTPUTマクロに、 dirに指定されたディレクトリ にあるconfigureを実行させます。 ディレクトリが複数の場合はdirに ディレクトリをスペースで区切って並べます。 ディレクトリdirがみつからない場合、 エラーにはなりません。これは、 configure大きなソースコード ツリーのうちの実在する一部分だけを 設定できるようにするためです。 dir`configure.in'があって `configure'がない場合、Cygnus ディレクトリAC_CONFIG_AUXDIRにある Cygnus configureスクリプトが 使われます。

サブディレクトリにあるconfigure スクリプトには、現在実行中の configureスクリプトと、 基本的には同じコマンドライン引数が 渡されます。 コマンドライン引数は必要な場合には わずかに変更されます(例えば、 キャッシュファイルやソースファイルの あるディレクトリへの相対パスの調整など)。 このマクロは出力変数subdirsに、 サブディレクトリのリスト(dir ...) を設定します。`Makefile'ルールでは この変数を使って、どのサブディレクトリを 再帰的にmakeすればいいのか決める ことができます。このマクロは複数回 呼び出しても構いません。

Default Prefix

デフォルトでは、configureはインストールのためのファイル名の ディレクトリプレフィクスを`/usr/local'に設定します。configureの ユーザは、`--prefix'`--exec-prefix'オプションを使って、 他のディレクトリプレフィクスを選択することができます。 デフォルトの設定を変更するにはふたつの方法があります: configure生成時と、configureの実行時です。

一部のソフトウェアパッケージでは、デフォルトで`/usr/local'以外のところに インストールしたい場合があるでしょう。このためには、 AC_PREFIX_DEFAULTマクロを使ってください。

Macro: AC_PREFIX_DEFAULT (prefix)
デフォルトのインストールディレクトリ プレフィクスを、`/usr/local' でなくprefixにします。

configureスクリプトが、既にインストールされている 関係あるプログラムのインストール位置から、 インストールディレクトリプレフィクスを推測してくれると 便利なこともあるでしょう。このためには、AC_PREFIX_PROGRAMを 呼び出しましょう。

Macro: AC_PREFIX_PROGRAM (program)
ユーザがインストールディレクトリ プレフィクスを(`--prefix'オプションで) 指定しなかった場合、値をprogramの 位置から推測します。programは shellと同様、PATHをたぐって 探されます。もしprogramPATHに書かれたディレクトリの どこかに存在した場合、ディレクトリ プレフィクスをprogramのある ディレクトリの親ディレクトリに 設定します; もしなかったら、 `Makefile.in'に指定された プレフィクスをそのままにします。 例えば、programgccで、 PATHを探した結果 `/usr/local/gnu/bin/gcc'が 見つかった場合、プレフィクスは `/usr/local/gnu'になります。

Version Numbers in configure

以下のマクロはconfigureスクリプトのバージョン番号を管理します。 このマクロは使っても使わなくても構いません。

Macro: AC_PREREQ (version)
Autoconfの十分最近のバージョンが 使われているか確かめます。 configureを生成するのに 使われているAutoconfがversion 以前のものだった場合、エラーメッセージを 標準エラー出力に出力し、configureを 生成しません。例えば:

AC_PREREQ(1.8)

このマクロは、`configure.in'が、 Autoconfのバージョンアップで変化した 自明でないふるまいに依存している場合に 役立ちます。もし最近定義されたマクロが 必要なだけの場合、AC_PREREQマクロは あまり使いでがありません。なぜなら、 autoconfはAutoconfの ユーザに、マクロがないというエラーを 出力しているはずだからです。 同様のことは、`cofigure.in'AC_PREREQが追加される以前の Autoconfに通したときに起こります。

Macro: AC_REVISION (revision-info)
revision-infoに指定したRCS リビジョンスタンプ(訳註: `$'`Id $' とかのこと)を、`$'マークや ダブルクォートを取り除いてから configureスクリプトに埋め込みます。 このマクロを使って`configure.in'の リビジョンスタンプconfigureスクリプトに 取り込むと、RCS/CVSによって configure内のリビジョンスタンプを 書き換えられずに済みます。 このようにすれば、configure スクリプトがどのリビジョンの `configure.in'から生成されたかを 簡単に知ることができます。

このマクロをAC_INIT以前に 使うようにすると、リビジョン番号が `configure.in'configureの どちらでも先頭部分に入るので、 具合がよいです。 このように使われることを想定して、 AC_REVISIONの出力は `#! /bin/sh'という行ではじまります。 これは通常のconfigureの 始まり方と同じです。

例えば、`configure.in'中の以下のような行は:

AC_REVISION($Revision: 1.30 $)dnl

configureに以下のような出力を生成します:

#! /bin/sh
# From configure.in Revision: 1.30

Existing Tests

以下のマクロは、パッケージが必要な、あるいは使いたい特定のOSの機能を 調べます。以下のマクロに定義されていない機能の有無をチェックしたい場合、 基本テストマクロ(primitive test macro)に適切な引数を渡してチェックを 実現することになります(see section Writing Tests参照)。

以下のテストは、どの機能をチェックしているか、なにがわかったかを 知らせるメッセージを出力します。チェック結果はconfigureを 再度実行したときのためにキャッシュされます(see section Caching Results参照)。

マクロには出力変数を設定するものがあります。出力変数の値を 参照するやりかたについてはSee section Substitutions in Makefilesを参照してください。 以下で、「nameを定義します」という文は、 「Cプリプロセッサシンボルnameを1に定義します」という意味です。 定義された値をプログラム中で参照するやりかたについてはSee section Defining C Preprocessor Symbols を参照してください。

Alternative Programs

以下のマクロは特定のプログラムの有無、またはふるまいをチェックします。 マクロは、いくつかの候補となるプログラムからどれかひとつを選んだり、 選んだものをどう利用するかを定めるために使われます。 パッケージで使うプログラム専用のマクロが定義されておらず、 そのプログラムに関する特殊なチェックが必要ない場合、 汎用のマクロのうちいずれかを利用することができます。

Particular Program Checks

以下のマクロは特定のプログラムをチェックします--- プログラムが存在するかどうか、およびいくつかのプログラムについては プログラム特有の機能をチェックします。

Macro: AC_DECL_YYTEXT
yytextの型が`char []'でなく `char *'だった場合、 YYTEXT_POINTERを定義します。 また、lexの出力ファイル名を 出力変数LEX_OUTPUT_ROOTに 定義します。通常は`lex.yy'ですが 他の値のこともあります。これらの結果は lexflexのどちらが 利用されているかによって変わります。

Macro: AC_PROG_AWK
mawkgawknawkawkがあるかどうかをこの順序で 調べ、出力変数AWKの値を 最初にみつけたプログラムの 名前に設定します。mawkを最初に 調べるのは、これが一番高速動作する 実装だと言われているからです。

Macro: AC_PROG_CC
利用するCコンパイラを決定します。 環境変数CCが設定されて いなかったら、gccがあるか どうか調べ、なければccを 使います。出力変数CCを みつけたコンパイラの名前に設定します。

このマクロは、GNU Cコンパイラを使う場合 shell変数GCC`yes'に、 そうでない場合空に設定します。 もし出力変数CFLAGSがまだ 設定されていなかったら、 GNU Cコンパイラの場合には `-g -O2'に設定します (GCCが`-g'を受け付けない場合 `-O2'に、他のコンパイラの場合 `-g'に設定します)。

現在利用することになっている Cコンパイラが、configureが 実行されているシステム以外のための バイナリを生成する場合、 shell変数cross_compiling`yes'に設定します。 そうでない場合`no'に設定します。 言い替えれば、このテストは build対象のシステムが ホストシステムタイプ(訳註: コンパイルを行うシステムのタイプ)と 異なるかどうかを調べます (「ターゲットシステムタイプ」は このマクロとは無関係です)。 クロスコンパイルのサポートに ついてはSee section Manual Configurationを 参照してください。

Macro: AC_PROG_CC_C_O
コンパイラがコマンドラインオプション `-c'`-o'を 同時に受け付けない場合、 NO_MINUS_C_MINUS_Oを定義します。

Macro: AC_PROG_CPP
出力変数CPPに、Cプリプロセッサを 実行するためのコマンド名を定義します。 `$CC -E'が動かない場合、 `/lib/cpp'が使われます。 CPP`.c'ファイル以外に 用いるのは移植性がありません。 移植性のために、CPPに通すのは 拡張子が`.c'のファイルだけにしましょう。

現在選択されている言語がCの場合 (see section Language Choice参照)、 一部のテストマクロは出力変数CPPの 値を間接的に利用しています。 「間接的に」というのは、テストマクロ内部でマクロ AC_TRY_CPPAC_CHECK_HEADERAC_EGREP_HEADERAC_EGREP_CPPを 呼び出しているからです。

Macro: AC_PROG_CXX
利用するC++コンパイラを判別します。 環境変数CXXまたはCCCが 定義されていないか(CXXを先に) 調べます; もし定義されていたら、定義されている値を 出力変数CXXにセットします。 さもなくば、C++コンパイラらしい名前の プログラムを探します (c++, g++, gcc, CC, cxx, それからcc++)。 もし以上のチェックが全て失敗したら、 最後の手段としてCXXgccにセットします。

GNU C++コンパイラを利用する場合、 shell変数GXX`yes'に、 さもなくば空にセットします。 出力変数CXXFLAGSがまだ定義されて いない場合、CXXFLAGSを定義します。 GNU C++コンパイラを 利用するなら`-g -O2'(GNU C++が `-g'を受け付けない場合`-O2')に、 他のコンパイラの場合は`-g'になります。

現在利用することになっている C++コンパイラが、configureが 実行されているシステム以外のための バイナリを生成する場合、 shell変数cross_compiling`yes'に設定します。 そうでない場合`no'に設定します。 言い替えれば、このテストは build対象のシステムが ホストシステムタイプ(訳註: コンパイルを行うシステムのタイプ)と 異なるかどうかを調べます (「ターゲットシステムタイプ」は このマクロとは無関係です)。 クロスコンパイルのサポートに ついてはSee section Manual Configurationを 参照してください。

Macro: AC_PROG_CXXCPP
出力変数CXXCPPに、C++プリプロセッサを 実行するためのコマンド名を定義します。 `$CXX -E'が動かない場合、 `/lib/cpp'が使われます。 CXXCPP`.c'`.C' または`.cc'以外のファイルに 用いるのは移植性がありません。 移植性のために、CPPに通すのは 上記に挙げた拡張子をもつファイルだけにしましょう。

現在選択されている言語がC++の場合 (see section Language Choice参照)、 一部のテストマクロは出力変数CXXCPPの 値を間接的に利用しています。 「間接的に」というのは、テストマクロ内部でマクロ AC_TRY_CPPAC_CHECK_HEADERAC_EGREP_HEADERAC_EGREP_CPPを 呼び出しているからです。

Macro: AC_PROG_F77
利用する Fortran 77 コンパイラを決定します。環境変数 F77 が存在し ていなかったら、 g77, f77, f2c の順に調べていきます。 output variable の F77にみつかったコンパイラの名前を設定します。 g77 (GNU の Fortran 77 コンパイラ) を使用する場合は、 AC_PROG_F77 は shell 変数 G77`yes' に設定し、そ うでない場合には変数は空となります。もし、output variable FFLAGS が環境変数として設定されていない時、g77 の場合には `-g -02' が設定されます(ただし、g77`-g' に対応していない場合には、 `-O2' が設定されます)。そうでない場合、g77 でない Fortran 77 コンパイラのために、FFLAGS`-g' に設定されます。

Macro: AC_PROG_F77_C_O
Fortran 77 コンパイラが `-c'`-o' のオプションを同時に指定 することに対応しているかどうか調べ、もし対応していない場合には F77_NO_MINUS_C_MINUS_O を定義します。

Macro: AC_PROG_GCC_TRADITIONAL
GNU Cコンパイラを使っていて、 `-traditional'フラグを指定しないと ioctlがうまく動かない場合、 出力変数CC`-traditional'を 付け加えます。 通常、これはGNU Cコンパイラ用に修正された ヘッダファイルがインストールされていない 古いシステムで起こります。 GNU Cコンパイラの最近のバージョンでは、 インストール時にヘッダファイルを修正するので、 この問題は起きなくなってきました。

Macro: AC_PROG_INSTALL
現在のPATH上にBSD互換の installプログラムがあった場合、 出力変数INSTALLをその名前にセットします。 さもなくば、`dir/instal-sh -c'を セットします。 後者の場合、AC_CONFIG_AUX_DIRに 指定されたディレクトリ(またはデフォルトの ディレクトリ)を使ってdirを決定します (see section Creating Output Files)。 さらに、INSTALL_PROGRAMINSTALL_SCRIPT`${INSTALL}'に、 INSTALL_DATA`${INSTALL} -m 644'にセットします。

このマクロは、うまく動作しない installプログラムを無視します。 プログラムを探す際には、速度のためにスクリプトよりは Cで書かれたプログラムの方を優先します。 `install-sh'以外に、`install.sh'を 使うこともできますが、`install.sh'という ファイル名はobsoleteなので使わない方がいいでしょう(訳註: 意訳)。 これは、 一部のmakeが、`Makefile'がないときに `install.sh'から`install'を生成する ルールをもっているためです。

パッケージに含める(訳註: 意訳) `install-sh'としては、 Autoconfと一緒に配布されている`install-sh'を 利用することができます。 AC_PROG_INSTALLを利用した場合、 `install-sh'または`install.sh'を 配布に含める必要があります。 含めなかった場合、configureは ファイルがみつからなかった旨 エラーメッセージを出力します。 エラーメッセージは正しく動作する installがある場合にも出力されます。 このチェックは、install-shを パッケージに含め忘れないための安全策です。 含め忘れた場合、あなたのパッケージを BSD互換のinstallプログラムのない システムでインストールできなくなってしまいます。

標準的なinstallプログラムにない機能が 必要で独自のインストールプログラムを利用したい 場合には、AC_PROG_INSTALLを利用する 必要はありません; 御自分のインストールプログラムへの パス名を`Makefile.in'に単に含めればいいのです。

Macro: AC_PROG_LEX
flexがあったら、出力変数LEX`flex'に、(もし`libfl.a'が 標準的な場所にあったら)LEXLIB`-lfl'に設定します。 もしflexがなかったら、 LEX`lex'に、 LEXLIB`-ll'に設定します。

Macro: AC_PROG_LN_S
`ln -s'が現在のファイルシステムで うまく使えたら(すなわち、OSとファイルシステムが シンボリックリンクをサポートしていたら)、 出力変数LN_S`ln -s'に設定します。 動かなかったら、`ln'に設定します。

カレントディレクトリ以外のパス名をリンク先として 指定した場合、`ln'`ln -s'では 意味が異なってきます。 `$(LN_S)'を使って安全にリンクを作成するためには、 makefile中でどちらが使われているか調べて動作を変えるか、 lnコマンドをリンクが置かれるディレクトリで 呼び出すかのいずれかを行わねばなりません。

言い替えれば、以下はうまく動きません:

$(LN_S) foo /x/bar

ので、かわりにこうしましょう:

(cd /x && $(LN_S) foo bar)

Macro: AC_PROG_RANLIB
もしranlibがみつかったら、出力変数 RANLIB`ranlib'に設定します。 さもなくば、:(なにもしない)に設定します。

Macro: AC_PROG_YACC
もしbisonがみつかったら、出力変数 YACC`bison -y'に設定します。 かわりにbyaccがみつかったら、出力変数 YACC`byacc'に設定します。 さもなくば、yaccに設定します。

Generic Program and File Checks

以下のマクロは、プログラムをみつけるための専用マクロが特に 定義されていないプログラムをみつけるために使われます。 プログラムの存在だけでなくプログラムの挙動を調べたい場合、 自分でテストスクリプトを記述する必要があります(see section Writing Tests)。 デフォルトでは、マクロは環境変数PATHを使います。 ユーザのPATHにないようなプログラムをチェックする場合、 以下のように自分でサーチパスを変更してマクロに渡すことができます:

AC_PATH_PROG(INETD, inetd, /usr/libexec/inetd,
  $PATH:/usr/libexec:/usr/sbin:/usr/etc:etc)

Macro: AC_CHECK_FILE (file [, action-if-found [, action-if-not-found]])
file というファイルがネイティブなシステム上に存在するかどうかを調 べます。このマクロが与えられた場合、もしファイルが存在した場合には、 action-if-found が実行され、ない場合には action-if-not-found が実行されます。

Macro: AC_CHECK_FILES (files[, action-if-found [, action-if-not-found]])
AC_CHECK_FILE files に並べられた各ファイルにつきそれぞれ一回づつ AC_CHECK_FILE を適用します。さらに、各ファイルが見つかるごとに `HAVEfile' を 1 にセットします。

Macro: AC_CHECK_PROG (variable, prog-to-check-for, value-if-found [, value-if-not-found [, path, [ reject ]]])
プログラムprog-to-check-forPATH中に あるかどうかを調べます。もし発見された場合variablevalue-if-foundに設定します。発見されなかった場合 (value-if-not-foundが指定されていた場合は) value-if-not-foundに設定します。 このマクロは、reject (絶対パスのファイル名)を サーチパス上で発見してもそれは無視します。 この場合、variableはパス上でみつかった prog-to-check-forで、rejectではない ファイルの絶対パス名になります。 variableが既に設定されていた場合、なにもしません。 variableのために、AC_SUBSTを呼び出します。

Macro: AC_CHECK_PROGS (variable, progs-to-check-for [, value-if-not-found [, path]])
progs-to-check-forに指定された、 スペースで区切られたプログラム名たちがPATH上に あるかどうかを調べます。もしあった場合、 そのプログラム名をvariableに設定します。 さもなくば、次のプログラム名を探します。 もし、指定された全てのプログラムがなかった場合、 value-if-not-foundの値をvariableに設定します。 もしvalue-if-not-foundが指定されていなかったら、 variableの値は変更されません。 variableのために、AC_SUBSTを呼び出します。

Macro: AC_CHECK_TOOL (variable, prog-to-check-for [, value-if-not-found [, path]])
AC_CHECK_PROGと同様ですが、prog-to-check-forの 先頭にAC_CANONICAL_HOSTで判定されたホストタイプを つけたものを最初に探します(see section Getting the Canonical System Type参照)。 例えば、ユーザが`configure --host=i386-gnu'を 実行し、その中で
AC_CHECK_TOOL(RANLIB, ranlib, :)

というマクロが使われていたなら、まずパス上の `i386-gnu-ranlib'が探され、もしあったなら `i386-gnu-ranlib'RANLIBに設定します。 プログラムがなければRANLIB`:'にされます。

Macro: AC_PATH_PROG (variable, prog-to-check-for [, value-if-not-found [, path]])
AC_CHECK_PROGと同様ですが、 プログラムが発見された場合variableprog-to-check-forの全体に設定します。

Macro: AC_PATH_PROGS (variable, progs-to-check-for [, value-if-not-found [, path]])
AC_CHECK_PROGSと同様ですが、 progs-to-check-forの中のいずれかが 見付かったら、プログラムの絶対パスを variableに設定します。

Library Files

以下のマクロは指定されたC、C++またはFortran 77ライブラリファイルが 存在するかどうかを調べます。

Macro: AC_CHECK_LIB (library, function [, action-if-found [, action-if-not-found [, other-libraries]]])
functionに指定されたC、C++またはFortran 77の関数が存在するか どうかを調べます。 言語処理系は指定されたもの(see section Language Choice)を使います。 チェックはテスト用のプログラムとライブラリ libraryを一緒にリンクしてみて成功するかどうかで 行われます。 libraryはライブラリのベースネームです。 例えば、`-lmp'を調べる場合、`mp'を 引数libraryに指定することになります。

action-if-foundには、リンクが成功した場合に 呼び出されるshellコマンド列を指定します。 action-if-not-foundには、リンクが失敗したときに 呼び出されるshellコマンド列を指定します。 action-if-foundaction-if-not-foundが 両方とも指定されなかった場合、デフォルトの動作になります。 デフォルトの動作はLIB`-llibrary'を追加し、 `HAVE_LIBlibrary'を(全部大文字)定義するように なっています。

もしlibraryだけとリンクするのでは未解決のシンボルが 出てしまい、他のライブラリをリンクしないといけない場合には、 それらのライブラリ名をスペースで区切ってother-librariesに 指定してください: `-lXt -lX11'のように。 指定しなかった場合、マクロはlibraryが存在することを 検出できません。なぜなら、未解決シンボルのせいでリンクが 常に失敗するからです。

Macro: AC_HAVE_LIBRARY (library, [, action-if-found [, action-if-not-found [, other-libraries]]])
このマクロはAC_CHECK_LIBを、引数functionmainにして呼び出すのと同じです。引数library`foo'でも`-lfoo'でも、あるいは`libfoo.a' とでも指定できます。これらの全ての場合に、コンパイラには 引数`-lfoo'が渡ります。 libraryにshell変数を渡すことはできません。 libraryは文字列リテラルである必要があります。 このマクロはobsoleteです。

Macro: AC_SEARCH_LIBS (function, search-libs [, action-if-found [, action-if-not-found [, other-libraries]]])
functionがまだみつかっていなければ、 functionが含まれているライブラリを探します。 このマクロは最初にAC_TRY_LINK_FUNCをライブラリ指定なしで呼び出し、 駄目ならsearch-libsのライブラリを順に指定して呼び出すのと等価です。

関数がみつかったらaction-if-foundを実行します。 みつからなかったらaction-if-not-foundを実行します。

libraryをリンクしたときに未定義シンボルが出て、 他のライブラリをリンクすればそれが解決するのであれば、 追加のライブラリをother-librariesにスペースで区切って指定してください。 例えば`-lXt -lX11'とか。 other-librariesを指定しなかった場合、 このマクロはfunctionの認識に失敗します。 追加のライブラリがなければ、テストプログラムのリンクは常に失敗するからです。

Macro: AC_SEARCH_LIBS (function, search-libs[, action-if-found [, action-if-not-found]])
This macro is equivalent to calling AC_TRY_LINK_FUNC once for each library listed in search-libs. Add `-llibrary' to LIBS for the first library found to contain function, and execute action-if-found. Otherwise execute action-if-not-found.

訳註: このエントリはどうみても原文での削除忘れである。

Library Functions

以下のマクロは、Cのライブラリ関数があるかどうかを調べます。 もし、あるマクロをチェックする特別の関数が定義されておらず、 特殊なチェックが必要でない場合には、汎用の関数チェックマクロを 用いることができます。

Particular Function Checks

以下のマクロは、特定のCライブラリ関数をチェックします --- 関数が存在するかどうか、および特定の引数を与えられたときの 挙動がチェックされます。

Macro: AC_FUNC_ALLOCA
allocaの有無をチェックします。 このチェックでは、なるべくコンパイラ組み込みの allocaを探そうとします。 このために、`alloca.h'があるかどうかおよび Cプリプロセッサマクロ__GNUC___AIXがあらかじめ定義されているかを調べます。 もし`alloca.h'がみつかったら、 HAVE_ALLOCA_Hが定義されます。

上記のチェックが失敗したら、標準Cライブラリに 関数があるかどうかを探します。 ここまでのチェックのいずれかが成功した場合、 HAVE_ALLOCAを定義します。 全てが失敗した場合、出力変数ALLOCA`alloca.o'に定義し、C_ALLOCAを定義します (C_ALLOCAは、プログラムがGCのために 定期的に`alloca(0)'を呼び出すことが できるようにするため定義されます)。 ALLOCALIBOBJSとは独立に定義されます。 これは複数のプログラムをコンパイルするとき、 allocaを実際使うものが少なかった場合に いちいち`alloca.o'をコンパイルしなくて済むようにするためです (訳註: 超意訳。自信なし。原文は「 This variable is separate from LIBOBJS so multiple programs can share the value of ALLOCA without needing to create an actual library, in case only some of them use the code in LIBOBJS.」)。

このマクロはSystem V R3の`libPW'や System V R4の`libucb'に含まれる allocaを探すことはしません。 なぜなら、これらのライブラリには 場合によってはallocaが 含まれていなかったり、 含まれていてもallocaバグがあったり、 あるいは互換性に問題のあるalloca以外の 関数が含まれていたりするためです。 どうしてもこれらのライブラリに含まれる allocaを利用したい場合には、 (`alloca.c'をコンパイルするのではなく) arを使って`alloca.o'を取り出してください。

allocaを利用するソースファイルには、 正しく定義を行うため先頭部分に以下のような コードが含まれている必要があります。 AIXの一部のバージョンにおいては、allocaの 宣言は(コメントやプリプロセッサディレクティブを 除いて)ファイルの一番先頭に現れる必要があります。 #pragmaディレクティブはANSI以前のCコンパイラでは 無視されることを期待して書かれています。

/* AIX requires this to be the first thing in the file.  */
#ifndef __GNUC__
# if HAVE_ALLOCA_H
#  include <alloca.h>
# else
#  ifdef _AIX
 #pragma alloca
#  else
#   ifndef alloca /* predefined by HP cc +Olibcalls */
char *alloca ();
#   endif
#  endif
# endif
#endif

Macro: AC_FUNC_CLOSEDIR_VOID
ライブラリ関数closedirが 意味のある値を返さない場合、CLOSEDIR_VOIDを 定義します。 定義されなかった場合には、 closedirを呼んだ場合 返り値を用いてエラーチェックを行うべきです。

Macro: AC_FUNC_FNMATCH
ライブラリ関数fnmatchが存在し、かつ動作するなら、 HAVE_FNMATCHを定義します (ちなみに、SunOS 5.4付属のものは動きません)。

Macro: AC_FUNC_GETLOADAVG
システムのロードアベレージを得る方法をチェックします。 現在のシステムでgetloadavgが利用できるなら、 HAVE_GETLOADAVGを定義し、 LIBSに必要なライブラリファイルを追加します。

もしgetloadavgが利用できないなら、 `getloadavg.o'を出力変数LIBOBJSに追加し、 必要ならいくつかのCプリプロセッサマクロや出力変数を定義します:

  1. SVR4DGUXUMAXまたは UMAX4_3のうちであてはまるものを定義します。
  2. `nlist.h'があった場合、NLIST_STRUCTを定義します。
  3. `struct nlist'にメンバ`n_un'があった場合、 NLIST_NAME_UNIONを定義します。
  4. `getloadavg.c'をコンパイルする際に LDAV_PRIVILEGEDが定義された場合、 getloadavgが正しく動作するには、 プログラムは(setuid bitをたてるなどして) root権限で動作するようにインストールされる必要があります。 この場合、GETLOADAVG_PRIVILEGEDが定義されます。
  5. 出力変数NEED_SETGIDが定義されます。 インストールする際にsetgid bitをたてる必要がある場合には 値は`true'に、さもなくば値は`false'になります。 NEED_SETGID`true'である場合には、 プログラムファイルの所属すべき gidがKMEM_GROUPに定義されます。

Macro: AC_FUNC_GETMNTENT
getmntentがライブラリファイル `sun'`seq'および`gen'の いずれかに含まれているかどうか調べます (順に、Irix 4、PTX、Unixwareの場合の ライブラリファイルです)。 getmntentが存在した場合、 HAVE_GETMNTENTを定義します。

Macro: AC_FUNC_GETPGRP
getpgrpが引数をとらない場合 (つまりPOSIX.1準拠の場合)、 GETPGRP_VOIDを定義します。 定義されなかった場合、getpgrpはBSDでのように プロセスIDを引数にとります。 このマクロはgetpgrpがあるかどうかは 全く調べません; getpgrpがない場合に 対処するには、先にAC_CHECK_FUNCを使って getpgrpがあるかどうか調べてください。

Macro: AC_FUNC_MEMCMP
ライブラリ関数memcmpがないか、 または(SunOS 4.1.3のように)8bitデータに対して 使えない場合、`memcmp.o'を 出力変数LIBOBJSに追加します。

Macro: AC_FUNC_MMAP
mmapが存在して正常動作する場合、 HAVE_MMAPを定義します。 動作チェックは、既にマップされたメモリを 自プロセスの固定アドレスにマップする場合に関してのみ 行われます。

Macro: AC_FUNC_SELECT_ARGTYPES
select 関数の引数のそれぞれが正しい型を通すかをテストします。そし て、SELECT_TYPE_ARG1, SELECT_TYPE_ARG234, SELECT_TYPE_ARG5 にそれぞれの型を定義します。 SELECT_TYPE_ARG1 はデフォルトで `int' 型に、 SELECT_TYPE_ARG234 はデフォルトで `int *' 型に、 SELECT_TYPE_ARG5 はデフォルトで `struct timeval *' に定義さ れます。

Macro: AC_FUNC_SETPGRP
setpgrpが引数をとらない場合 (つまりPOSIX.1準拠の場合)、 SETPGRP_VOIDを定義します。 定義されなかった場合、setpgrpはBSDでのように プロセスIDを引数にとります。 このマクロはsetpgrpがあるかどうかは 全く調べません; setpgrpがない場合に 対処するには、先にAC_CHECK_FUNCを使って setpgrpがあるかどうか調べてください。

Macro: AC_FUNC_SETVBUF_REVERSED
setvbufの第2引数がバッファリングの形式で、 第3引数がバッファへのポインタの場合、 SETVBUF_REVERSEDを定義します。 SETVBUF_REVERSEDが定義されるのは、 release 3以前のSystem Vの場合です。

Macro: AC_FUNC_STRCOLL
strcollが存在して正常動作する場合、 HAVE_STRCOLLを定義します。 このマクロはstrcollがあるかどうかを AC_CHECK_FUNCより詳しく調べます。 一部のシステムでは、strcollの 定義が誤っているためこの関数を使うべきではないからです。

Macro: AC_FUNC_STRFTIME
strftime`intl'ライブラリにあるかどうかを調べます (これはSCO UNIXのためです)。 もしあった場合、HAVE_STRFTIMEを定義します。

Macro: AC_FUNC_UTIME_NULL
`utime(file, NULL)'fileの タイムスタンプを現在時刻に設定する場合、 HAVE_UTIME_NULLを定義します。

Macro: AC_FUNC_VFORK
`vfork.h'があった場合、HAVE_VFORK_Hを定義します。 正常動作動作するvforkが発見されなかった場合、 vforkfork#defineします。 このマクロは、いくつかのシステムでのvforkの バグをチェックし、バグつきの場合にはvforkが みつからなかったかのように振舞います。 ただし、子プロセスでsignalを呼んでも 親プロセスのシグナルハンドラが変更されない場合には これはバグつきとはみなされません。 子プロセスでシグナルハンドラを変更することは めったにないからです。

Macro: AC_FUNC_VPRINTF
vprintfが存在する場合、 HAVE_VPRINTFを定義します。 ない場合に_doprntが存在したら、 HAVE_DOPRNTを定義します。 ちなみに、vprintfが存在したら、 vfprintfvsprintfも 存在すると仮定して構いません。

Macro: AC_FUNC_WAIT3
wait3が存在し、呼び出し時に第3引数 (`struct rusage *')の指し先の内容がきちんと 設定される場合、 HAVE_WAIT3を定義します。 ちなみに、HP-UXでは第3引数の差し先はきちんと設定されません。

Generic Function Checks

以下のマクロは、チェックのための特別のマクロがないライブラリ関数について 調べるために用意されています。 ライブラリ関数がデフォルトのCライブラリに入っていない 可能性がある場合には、AC_CHECK_LIBを用いて そのライブラリファイルがあるかどうか調べてください。 ライブラリ関数があるかどうかだけでなく、その振舞いも調べる 必要がある場合には、自前でテストを記述する必要があるでしょう (see section Writing Tests)。

Macro: AC_CHECK_FUNC (function, [action-if-found [, action-if-not-found]])
Cの関数functionが存在する場合、shellコマンドaction-if-foundを 実行します。 ない場合にはaction-if-not-foundを実行します。 関数のあるなしによってシンボルを定義したいだけであれば、 AC_CHECK_FUNCSを使ったほうがいいでしょう。 このマクロはAC_LANG_CPLUSPLUSが呼ばれているいないに関わらず C linkageで関数を探します。 C++ではCよりもライブラリ関数がきちんと標準化されているので、 AC_CHECK_FUNCを使う機会は少なそうだからです (環境を調べる対象の言語を選ぶやりかたについては、 see section Language Choiceを参照)。

Macro: AC_CHECK_FUNCS (function... [, action-if-found [, action-if-not-found]])
スペースで区切られた複数のfunctionのうち、 実際存在するものについてHAVE_function(全部大文字)を定義します。 action-if-foundには、 各々の関数がみつかったときに実行したいshellスクリプトを記述します。 action-if-found`break'にすると、 最初に関数が見つかったところでループを抜けることができます。 action-if-not-foundには、 各関数がみつからなかったときに実行されるshellスクリプトを記述します。

Macro: AC_REPLACE_FUNCS (function...)
このマクロは、 特定の関数functionが存在しない場合に LIBOBJS`function.o'を追加します。 この動作は、 AC_CHECK_FUNCSaction-if-not-foundに 「出力変数LIBOBJS`function.o'を追加する」 と記述した場合と似ています。 ライブラリの置き換え用の関数を定義するときには、 プロトタイプ宣言を`#ifndef HAVE_function'で くくっておいた方がいいでしょう。 システムにfunctionがある場合、 システム定義のincludeファイルのどこかにプロトタイプ宣言があるはずです。 定義が矛盾するかもしれないから、システムにfunctionが あるときには再定義を避けるべきです。

Header Files

以下のマクロはCヘッダファイルがあるかないか調べます。 あなたのチェックしたいヘッダファイルについて 特定ヘッダファイル向けのマクロがなくて、 しかも特殊なことを調べる必要がなければ、 汎用のヘッダファイル検査マクロを使うとよいでしょう。

Particular Header Checks

以下のマクロは特定のシステムヘッダファイルを検査します。 ファイルがあるかどうか、それから必要なときには なにを定義しているかを検査します。

Macro: AC_DECL_SYS_SIGLIST
sys_siglist`signal.h'または`unistd.h'で定義されているなら、 SYS_SIGLIST_DECLAREDを定義します。

Macro: AC_DIR_HEADER
AC_HEADER_DIRENTAC_FUNC_CLOSEDIR_VOIDを呼ぶのと似ていますが、 定義するCプリプロセッサマクロが違います。 AC_DIR_HEADERは どのヘッダファイルがみつかったのかを表すCプリプロセッサマクロを定義します。 AC_DIR_HEADER、およびこれにより定義されるCプリプロセッサマクロは obsoleteです。 定義されるCプリプロセッサマクロは以下のとおり:

`dirent.h'
DIRENT
`sys/ndir.h'
SYSNDIR
`sys/dir.h'
SYSDIR
`ndir.h'
NDIR

さらに、関数closedirの返り値に意味がない場合には VOID_CLOSEDIRを定義します。

Macro: AC_HEADER_DIRENT
以下のヘッダファイルの有無を調べます。 そして、ヘッダファイルが存在し`DIR'を定義した最初のファイルについて 以下のCプリプロセッサマクロを定義します:

`dirent.h'
HAVE_DIRENT_H
`sys/ndir.h'
HAVE_SYS_NDIR_H
`sys/dir.h'
HAVE_SYS_DIR_H
`ndir.h'
HAVE_NDIR_H

ソースコード中でディレクトリライブラリのための定義をするには、 以下のようにするといいでしょう:

#if HAVE_DIRENT_H
# include <dirent.h>
# define NAMLEN(dirent) strlen((dirent)->d_name)
#else
# define dirent direct
# define NAMLEN(dirent) (dirent)->d_namlen
# if HAVE_SYS_NDIR_H
#  include <sys/ndir.h>
# endif
# if HAVE_SYS_DIR_H
#  include <sys/dir.h>
# endif
# if HAVE_NDIR_H
#  include <ndir.h>
# endif
#endif

上記の定義を使う場合、プログラム中では変数を(struct directでなく) struct dirent型として定義します。 ディレクトリエントリ名をとるためにはNAMLENマクロに struct direntへのポインタを渡します。

このマクロはSCO Xenixの`dir'`x'ライブラリも検査します。

Macro: AC_HEADER_MAJOR
`sys/types.h'majorminor、それから makedevが定義されておらず、 `sys/mkdev.h'で定義されている場合、 MAJOR_IN_MKDEVを定義します。 `sys/sysmacros.h'で定義されている場合、 MAJOR_IN_SYSMACROSを定義します。

Macro: AC_HEADER_STDC
システムにANSI Cヘッダファイルがある場合、STDC_HEADERSを定義します。 具体的には、`stdlib.h'`stdarg.h'`string.h'、 それから`float.h'をチェックします。 これらのヘッダがあれば、多分他のANSI Cヘッダファイルもあるでしょう。 このマクロは、`string.h'memchrが定義されているかどうか 調べます(もしmemchrがあればほかのmem系関数もあるでしょう)。 それから、`stdlib.h'freeが定義されているかどうか 調べます(もしokならmallocや他の関連関数もあるでしょう)。 さらに、`ctype.h'で定義されるマクロがANSI Cの定義どおり、 `2^7'のビットが立っていても動くかどうか調べます。

ANSI互換のヘッダファイル(とCライブラリ関数)があるかどうか決めるには、 __STDC__でないしにSTDC_HEADERSを使いましょう。 GCCがインストールされているシステムの多くには ANSI Cヘッダファイルがないからです(訳註: つまり、__STDC__が あってもANSI Cヘッダファイルがあるとは限らない、ということ)。

ANSI Cヘッダのないシステムでは、どのヘッダでなにを定義しているかは 全くばらばらです。 ですから、どのヘッダファイルに定義があるか探すよりも、 自分で使う関数を自分で定義した方が簡単です。 あるシステムではANSIとBSDの関数が混在しています。 あるシステムはほぼANSI互換なのに`memmove'がありません。 あるシステムはBSD由来の関数を`string.h'`strings.h'註の マクロとして定義しています。 あるシステムではBSD由来の関数しかなく、`string.h'がありません。 メモリ関係の関数は`memory.h'で定義されていたり、`string.h'で 定義されていたりします。 他にもいろいろ変種があります。 とりあえず、ANSIで定義されている関数が 文字列関係関数をひとつ、 メモリ関係関数を検査すれば多分こと足りるでしょう。 検査が成功すれば、多分他のANSI定義の関数もあるでしょう。 以下を`configure.in'に含めた場合:

AC_HEADER_STDC
AC_CHECK_FUNCS(strchr memcpy)

プログラム中では以下のように定義します:

#if STDC_HEADERS
# include <string.h>
#else
# ifndef HAVE_STRCHR
#  define strchr index
#  define strrchr rindex
# endif
char *strchr (), *strrchr ();
# ifndef HAVE_MEMCPY
#  define memcpy(d, s, n) bcopy ((s), (d), (n))
#  define memmove(d, s, n) bcopy ((s), (d), (n))
# endif
#endif

もしプログラム中でmemchrmemsetstrtokstrspnなど、BSD系OSに代用になる関数がないような関数を使う場合、 この定義だけでは足りません。 各関数について配布キット中にプログラムコードを添付しなければなりません。 添付したプログラムを必要なときにだけ使うにはどうすればいいでしょう? (システムのCライブラリに入っている関数の方が最適化されていて 速いかもしれないので) 例えば関数memchrの場合、 `memchr.c'というファイルを置いて、 `AC_REPLACE_FUNCS(memchr)'を使えば大丈夫です。

Macro: AC_HEADER_SYS_WAIT
`sys/wait.h'があって、POSIX.1互換なら、 HAVE_SYS_WAIT_Hを定義します。 `sys/wait.h'がない場合、exit statusを保持するのにintでなしに 古いBSDのようにunion waitを使っている場合にはPOSIX.1非互換です。 `sys/wait.h'がPOSIX.1互換でない場合には、 ヘッダファイルをincludeせず、 POSIX.1マクロを自分で定義しましょう。 例えば:

#include <sys/types.h>
#if HAVE_SYS_WAIT_H
# include <sys/wait.h>
#endif
#ifndef WEXITSTATUS
# define WEXITSTATUS(stat_val) ((unsigned)(stat_val) >> 8)
#endif
#ifndef WIFEXITED
# define WIFEXITED(stat_val) (((stat_val) & 255) == 0)
#endif

Macro: AC_MEMORY_H
memcpymemcmpなどが`string.h'で定義されておらず、 `memory.h'が存在する場合、NEED_MEMORY_Hを定義します。 このマクロはobsoleteです。 かわりにAC_CHECK_HEADERS(memory.h)を使ってください。 AC_HEADER_STDCの例参照。

Macro: AC_UNISTD_H
`unistd.h'があればHAVE_UNISTD_Hを定義します。 このマクロはobsoleteです。 かわりに`AC_CHECK_HEADERS(unistd.h)'を使ってください。

POSIX.1互換かどうか調べるには以下のようにします:

#if HAVE_UNISTD_H
# include <sys/types.h>
# include <unistd.h>
#endif

#ifdef _POSIX_VERSION
/* Code for POSIX.1 systems.  */
#endif

_POSIX_VERSIONは、POSIX.1互換のシステムで`unistd.h'をinclude すると定義されます。 `unistd.h'がないシステムは間違いなくPOSIX.1非互換です。 でも、一部のPOSIX.1非互換のシステムには`unistd.h'があります。

Macro: AC_USG
`strings.h'rindexbzeroがないシステムなら USGを定義します。 このマクロは `string.h'strrchrmemset等が存在すると仮定しています。

USGはobsoleteです。 このマクロでなしに、AC_HEADER_STDCの例題をみてください。

Generic Header Checks

以下のマクロは、特定のヘッダファイル用マクロが定義されていない ヘッダファイルを検査するためのものです。 ヘッダファイルがあるかないかだけでなく、中身もチェックしたい場合、 自力で検査マクロを記述しないといけません(see section Writing Tests参照)。

Macro: AC_CHECK_HEADER (header-file, [action-if-found [, action-if-not-found]])
システムヘッダファイルheader-fileがあったら action-if-foundを実行します。 なければaction-if-not-foundを実行します。 単にヘッダファイルがあったときにCプリプロセッサシンボルを定義したいだけなら、 AC_CHECK_HEADERSを使った方がいいでしょう。

Macro: AC_CHECK_HEADERS (header-file... [, action-if-found [, action-if-not-found]])
スペースで区切られた複数のheader-fileのうち、 実際システムヘッダファイルが存在するものについて HAVE_header-file(全部大文字)を定義します。 action-if-foundには、 各々のヘッダファイルがみつかったときに実行したいshellスクリプトを記述します。 action-if-found`break'にすると、 最初にヘッダファイルが見つかったところでループを抜けることができます。 action-if-not-foundには、 各ヘッダファイルがみつからなかったときに実行されるshellスクリプトを記述します。

Structures

以下のマクロは特定の構造体や構造体のメンバを検査します。 ここにない構造体を検査したい場合、 AC_EGREP_CPP (see section Examining Declarations)やAC_TRY_COMPILE (see section Examining Syntax)を使ってください。

Macro: AC_HEADER_STAT
S_ISDIRS_ISREGなどの、`sys/stat.h'で定義されている マクロが正しく動かない場合(返り値が嘘の場合)、 STAT_MACROS_BROKENを定義します。 Tektronix UTekV、Amdahl UTS、それからMotorola System V/88が該当します。

Macro: AC_HEADER_TIME
`time.h'`sys/time.h'の両方をincludeしていいなら、 TIME_WITH_SYS_TIMEを定義します。 古いシステムでは、`sys/time.h'`time.h'をincludeしていて、 しかも`time.h'に複数回includeされた場合に対する対処がないことがあります。 この場合、両方のヘッダファイルを明示的にincludeしてはいけません。 このマクロは、例えば、struct timevalstruct timezoneと、 struct tmを同時に使うプログラムに有効です。 HAVE_SYS_TIME_Hとあわせて使うのがよいでしょう。 HAVE_SYS_TIME_HAC_CHECK_HEADERS(sys/time.h)マクロを使うと定義されます。

#if TIME_WITH_SYS_TIME
# include <sys/time.h>
# include <time.h>
#else
# if HAVE_SYS_TIME_H
#  include <sys/time.h>
# else
#  include <time.h>
# endif
#endif

Macro: AC_STRUCT_ST_BLKSIZE
struct statにメンバst_blksizeが定義されているなら、 HAVE_ST_BLKSIZEを定義します。

Macro: AC_STRUCT_ST_BLOCKS
struct statにメンバst_blocksが定義されているなら、 HAVE_ST_BLOCKSを定義します。 もしなければ、`fileblocks.o'を出力変数LIBOBJSに足します。

Macro: AC_STRUCT_ST_RDEV
struct statにメンバst_rdevが定義されているなら、 HAVE_ST_RDEVを定義します。

Macro: AC_STRUCT_TM
`time.h'struct tmが定義されていなければ、 TM_IN_SYS_TIMEを定義します。 TM_IN_SYS_TIMEは、struct tmの定義が欲しければ `sys/time.h'をincludeせよ、という意味です(訳註: 意訳)。

Macro: AC_STRUCT_TIMEZONE
現在のtimezoneを知る方法を推測します。 struct tmにメンバtm_zoneが定義されているなら、 HAVE_TM_ZONEを定義します。 グローバル変数tznameが定義されていたら、HAVE_TZNAMEを定義します。

Typedefs

以下のマクロはCのtypedefを検査します。 検査したいtypedef用に特定のマクロがなくて、 しかも特殊な検査をしたいわけでないのなら、 汎用のtypedef検査マクロが使えます。

Particular Typedef Checks

以下のマクロは、`sys/types.h'`stdlib.h'の中のC typedefを 検査します(もしファイルがあれば、ですが)。

Macro: AC_TYPE_GETGROUPS
GETGROUPS_Tを、 getgroupsの引数の型(配列の基底型)にあわせて、 gid_tまたはintに定義します。

Macro: AC_TYPE_MODE_T
mode_tが定義されていない場合、 Cプリプロセッサマクロmode_tint#defineします。

Macro: AC_TYPE_OFF_T
off_tが定義されていない場合、Cプリプロセッサマクロoff_tlong#defineします。

Macro: AC_TYPE_PID_T
pid_tが定義されていない場合、Cプリプロセッサマクロpid_tint#defineします。

Macro: AC_TYPE_SIGNAL
`signal.h'で、関数signalが 「返り値がvoidの関数へのポインタ(つまり、(void (*)())」を 返す場合、RETSIGTYPEvoidに定義します。 さもなくば、RETSIGTYPEintに定義します。

シグナルハンドラ関数を定義するときには、 返り値をRETSIGTYPEにしましょう:

RETSIGTYPE
hup_handler ()
{
...
}

Macro: AC_TYPE_SIZE_T
size_tが定義されていなければ、Cプリプロセッサマクロsize_tunsignedと定義します。

Macro: AC_TYPE_UID_T
uid_tが定義されていなければ、 Cプリプロセッサマクロuid_tintに、 gid_tintに定義します。

Generic Typedef Checks

このマクロは、 特定のtypedef検査マクロが提供されていないtypedefについて調べるときに 使います。

Macro: AC_CHECK_TYPE (type, default)
type`sys/types.h'で定義されていない場合、 Cプリプロセッサマクロを使って C (or C++)のビルトインタイプdefault (例えば、`short'とか`unsigned'とか)に#defineします。 もしヘッダファイルが存在するなら、 `stdlib.h'`stddef.h'についても調べます。

C Compiler Characteristics

以下のマクロはCコンパイラやマシンアーキテクチャの特性を調べます。 以下にない性質を調べたい場合、 AC_TRY_COMPILE (see section Examining Syntax) か AC_TRY_RUN (see section Checking Run Time Behavior)を使ってください。

Macro: AC_C_BIGENDIAN
16ビット幅の値を上位の8ビット(`2^15'から`2^8'の8ビット)から 先に格納するCPUアーキテクチャの場合、WORDS_BIGENDIANを定義します。 例えばMotorolaやSPARCなどのCPUがこれにあたります。 IntelやVAXは違います。

Macro: AC_C_CONST
Cコンパイラがconstを完全にサポートしていなければ、 constを空に#defineします。 世の中にはconstをサポートしているのに_STDC__を定義していない Cコンパイラや、 逆にconstを完全にはサポートしていないのに_STDC__を定義している Cコンパイラがあります。 AC_C_CONSTを使えば、プログラム中では必ずCコンパイラがconstを サポートしているつもりで、constを書けば大丈夫です。 Cコンパイラがconstをサポートしていなければ、 const`Makefile'またはconfiguration header fileで空にされます。

Macro: AC_C_INLINE
Cコンパイラがinlineをサポートしていればなにもしません。 inlineがサポートされておらず、__inline__あるいは __inlineがサポートされていれば、 inline__inline____inline#defineします。 どちらもサポートされていなければ空にします。

Macro: AC_C_CHAR_UNSIGNED
Cの型charが符号なし(unsigned)だったら、 __CHAR_UNSIGNED__を定義します。 ただし、Cコンパイラが既に__CHAR_UNSIGNED__を 定義していたらなにもしません。

Macro: AC_C_LONG_DOUBLE
Cコンパイラがlong double型をサポートしていたら、 HAVE_LONG_DOUBLEを定義します。 世の中には _STDC__を定義していないのに long doubleをサポートしているCコンパイラや、 _STDC__を定義しているのに long doubleをサポートしていないCコンパイラがあります。

Macro: AC_C_STRINGIZE
もし、 C preprocessor が文字列化演算子(訳注 : stringizing operator (文字 列連結演算子?、 C 言語で文字列という言葉も使って良いものか。))をサポート している場合、HAVE_STRINGIZE を定義します。文字列化演算子 `#'とは、下記のようなマクロです。

#define x(y) #y

Macro: AC_CHECK_SIZEOF (type [, cross-size])
SIZEOF_uctypeをC(またはC++の)基底型typeの バイトサイズにします。 typeは例えば`int'とか`char *'とかです。 コンパイラが`type'を知らない場合、SIZEOF_uctypeは 0になります。 uctypeは、typeの小文字を大文字に、スペースを下線`_'に、 アスタリスク(`*')を`P'にしたものです。 クロスコンパイルをしている場合、 cross-sizeを指定していればそれが使われます。 クロスコンパイルをしている場合に cross-sizeが指定されていないと、 configureはエラーメッセージを出して終了します。

例えば、DEC Alpha AXPで

AC_CHECK_SIZEOF(int *)

とすると、SIZEOF_INT_Pは8になります。

Macro: AC_INT_16_BITS
Cの型intが16ビットの場合、INT_16_BITSを定義します。 このマクロはobsoleteです。 かわりにより汎用的な`AC_CHECK_SIZEOF(int)'を使ってください。

Macro: AC_LONG_64_BITS
Cの型long intが64ビットの場合、LONG_64_BITSを定義します。 このマクロはobsoleteです。 かわりにより汎用的な`AC_CHECK_SIZEOF(long)'を使ってください。

Fortran 77 Compiler Characteristics

以下のマクロはFortran 77コンパイラの特性を調べます。 以下にない性質を調べたい場合、 AC_TRY_COMPILE (see section Examining Syntax) か AC_TRY_RUN (see section Checking Run Time Behavior)を使ってください。 テストの前に、AC_LANG_FORTRAN77 (see section Language Choice)を使って チェック対象コンパイラをFortran 77に切替えるのを忘れずに。

Macro: AC_F77_LIBRARY_LDFLAGS
Fortran 77のプログラムや共有ライブラリを正しくリンクするために必要な Fortran 77 intrinsic and run-time librariesを呼び出すための リンカフラグを調べます(`-L'`-l'など)。 結果として出力変数FLIBSが設定されます。

このマクロは複数言語のソースコード(例えばC++とFortran 77)をひとつの プログラムや共有ライブラリの中に混ぜないといけないときに使うものです (see section `Mixing Fortran 77 With C and C++' in GNU Automake)。

たとえば、C++コンパイラとFortran 77コンパイラの出力を混ぜてリンクしないと いけない場合には、リンク時にはC++コンパイラ/リンカを使わないといけません。 なぜなら、リンク時にglobal constructorの呼び出し、templateの 生成、例外サポートの有効化など、C++特有の処理が必要だからです。

この場合でも(Fortran 77で生成されたバイナリのために) Fortran 77 intrinsic and run-time librariesをリンクしないといけませんが、 C++コンパイラ/リンカはFortran 77ライブラリをどうやって追加指定しなければ いけないのかわかりません。 このような場合にFortran 77ライブラリを調べるために AC_F77_LIBRARY_LDFLAGSが作られたのです。

System Services

次のマクロは OS のサービスや機能を調べるためのものです。

Macro: AC_CYGWIN
Cygwin環境かどうか調べます。 Cygwin環境があれば、shell変数CYGWIN`yes'に設定します。 Cygwin環境がなければshell変数CYGWINを空にします (訳註: Cygwin環境はあったりなかったりするものなのでしょうか? それとも「Cygwin環境であれば」という方が適当? コメント求む)。

Macro: AC_EXEEXT
コンパイラの出力ファイルから.c、.o、.objファイルを除外して拡張子を調べ(意訳)、 substitute variable EXEEXTを定義します (訳註: substitute variableの訳語はなに?)。 通常、Unixでは空文字列、Win32では`.exe'または`.EXE'になります。

Macro: AC_OBJEXT
コンパイラの出力ファイルから.cファイルを除外して拡張子を調べ(意訳)、 substitute variable OBJEXTを定義します。 通常、Unixでは`.o'、Win32では`.obj'になります。

Macro: AC_MINGW32
MingW32コンパイラ環境かどうか調べます。 MingW32環境があれば、shell変数MINGW32`yes'に設定します。 MingW32環境がなければshell変数MINGW32を空にします (訳註: Cygwinに同じ)。
Macro: AC_PATH_X
X Window Systemのincludeファイルとライブラリがどこにあるか調べます。 configureの呼び出し時に、ユーザが `--x-includes=dir'`--x-libraries=dir'を 指定していたら、指定されたディレクトリを使います。 片方または両方とも指定されていなかったら、 決まっていない値を、 簡単な`Imakefile'xmkmfに食わせ、 生成された`Makefile'を調べることで定めます。 もしこれが(xmkmfがないとかの理由で)失敗したら、 一般的にX Window Systemが置かれるディレクトリを探します。 いずれかの方法で値が決まったら、 shell変数x_includesx_librariesに結果を格納します。 ただし、ディレクトリがコンパイラのデフォルトサーチパスに入っている場合には 値は設定されません。

上記の方法でもディレクトリがわからなかった場合や、 ユーザが`--without-x'を指定していた場合、 no_x`yes'に設定します。 no_x`yes'でなければ空になります。

Macro: AC_PATH_XTRA
AC_PATH_Xの拡張版です。 X_CFLAGSにXが必要とするCコンパイラのフラグを、 X_LIBSにリンカのフラグを設定します。 Xがない場合にはX_CFLAGS`-DX_DISPLAY_MISSING'を追加します。

このマクロは、 Xを使うプログラムをコンパイルするときに特別なライブラリが必要なら、 それもチェックしてX_EXTRA_LIBSに追加します。 X11R6特有のライブラリのうち`-lX11'より前に指定しないといけない ものがあったら、 それをX_PRE_LIBSに追加します。

Macro: AC_SYS_INTERPRETER
このシステムに、 「スクリプトファイルの先頭に`#! /bin/csh'のような行を付け加えることで、 スクリプトを実行するshellを選択する」機能がついているかどうか調べます。 このマクロを使用したあとは、 configure.inの中に記述するshellスクリプトの中で、 shell変数ac_cv_sys_interpreterを使えます。 このshell変数の値はシステムが`#!'をサポートしていれば`yes'、 していなければ`no'になります。

Macro: AC_SYS_LONG_FILE_NAMES
システムが14文字以上のファイル名をサポートしていたら、 HAVE_LONG_FILE_NAMESを定義します。

Macro: AC_SYS_RESTARTABLE_SYSCALLS
signalで割り込まれたシステムコールが自動で再開されるなら、 HAVE_RESTARTABLE_SYSCALLSを定義します。

UNIX Variants

以下のマクロは、ヘッダファイルやライブラリに癖があるなどの理由で、 特別な取扱が必要なOSについてチェックします。 これらのマクロは無理矢理作った逃げ道です (訳註: wartだから「目の上のたんこぶ」とか言ってもいいのだけれど、 それでは意味が通じない)。 本来はよりシステマチックに、ライブラリやヘッダファイルの内容および機能や、 OSで提供される環境について調べるべきです。

Macro: AC_AIX
OSがAIXだったら、_ALL_SOURCEを定義します。 BSDの機能の一部が使えます。 Cコンパイラを実行するマクロより前に使わないといけません。

Macro: AC_DYNIX_SEQ
OSがDynix/PTX (Sequent UNIX)だったら、 `-lseq'を出力変数LIBSに追加します。 このマクロはobsoleteです。 かわりにAC_FUNC_GETMNTENTを使いましょう。

Macro: AC_IRIX_SUN
OSがIRIX (Silicon Graphics UNIX)だったら、 `-lsun'を出力変数LIBSに追加します。 このマクロはobsoleteです。 getmntentを使いたいためにこのマクロを使っていたのなら、 AC_FUNC_GETMNTENTを使いましょう。 NISサポート入りのパスワード/gid系関数を使いたければ、 `AC_CHECK_LIB(sun, getpwnam)'を使いましょう。

Macro: AC_ISC_POSIX
OSがPOSIXサポート入りのISC UNIX(POSIXized ISC UNIX)上だったら、 _POSIX_SOURCEを定義し、`-posix'(GNU Cコンパイラ用) または`-Xp'(他のCコンパイラ用)をCCに追加します。 AC_PROG_CCより後で、しかもCコンパイラを呼び出す他のマクロより先に 呼び出さねばなりません。

Macro: AC_MINIX
OSがMinixだったら、_MINIX_POSIX_SOURCEを定義し、 _POSIX_1_SOURCEを2に定義します。 こうするとPOSIXの機能が使えます。 Cコンパイラを実行するマクロより前に使わないといけません。

Macro: AC_SCO_INTL
OSがSCO UNIXだったら、`-lintl'LIBSに追加します。 このマクロはobsoleteです。 かわりにAC_FUNC_STRFTIMEを使いましょう。

Macro: AC_XENIX_DIR
OSがXenixだったら、`-lx'を出力変数LIBSに追加します。 また、`dirent.h'が使われていたら、`-ldir'を出力変数LIBSに 追加します。 このマクロはobsoleteです。 AC_HEADER_DIRENTを使いましょう。

Writing Tests

あなたの必要としている検査項目が既存のマクロで実現されていない場合、 自分であたらしいマクロを書かねばなりません。 以下のマクロは、マクロの基本部品です 以下のマクロは、他のマクロ内でOS/コンパイラの機能を検査したり、 結果を出力したりするのに使われています。

この章では、推奨されるマクロの書き方、 それから既存のマクロがどうして現在あるように記述されているのかについて 述べています。 既存のマクロがどのように書かれているのか見ることで、 どうやってAutoconfのマクロを記述すべきか学べるでしょう。 Autoconfのテストでなにかがうまくいかなかったら、 マクロがなにを仮定しているのか理解するのに この章の内容が役立つかもしれません。 マクロが仮定していることを理解すれば、 マクロの問題点をどう解くべきなのかを知るにも役立つでしょう (訳註: 相当意訳)。

以下のマクロは、Cコンパイラの出力を調べます。 以下のマクロは結果をキャッシュしません(see section Caching Results)。 なぜなら、これらのマクロからは検査している内容がわからないし キャッシュ変数名も決められないからです。 Cコンパイラの特定の機能を調べるマクロは、結果をキャッシュしますし、 なにを調べているのかメッセージも出力されます。

複数のソフトウェアパッケージで利用できる検査を書いた場合、 新しいマクロを定義するのがよいでしょう。 どうやるかはSee section Writing Macros参照。

Examining Declarations

AC_TRY_CPPは特定のヘッダファイルが存在するか調べるためにあります。 ヘッダファイルひとつづつについて調べることもできますし、 ひとつの目的のために調べるのなら複数のヘッダファイルをまとめて 調べることもできます。

Macro: AC_TRY_CPP (includes, [action-if-true [, action-if-false]])
includesには CまたはC++の#include文(訳註: ほんとは文じゃないね)と 定義文(訳註: `#define'とか)を記述します。 他の文を記述しても構いませんが、多分意味ないでしょう。 includesのところにはshell変数、 backquote、backslashによる置換が働きます (訳註: 置換を避けたければ`['`]'で囲め、ということです)。 プリプロセッサが処理中にエラーメッセージを出さなければ、 shellコマンドaction-if-trueが実行されます。 エラーがあればaction-if-falseが実行されます。

このマクロはCPPFLAGSを使いますが、CFLAGSは使いません。 `-g'とか`-O'は多くのCプリプロセッサで無効だからです。

次のマクロはヘッダファイルに特定の定義(typedef、構造体、構造体メンバ、 関数プロトタイプ)が入っているかどうか調べます。 ヘッダファイルを直接grepせずに、AC_EGREP_HEADERを使いましょう。 システムによっては、調べたいシンボルが、あなたがgrepしている ヘッダファイルから`#include'されている他のヘッダファイルで 定義されているかもしれません。

Macro: AC_EGREP_HEADER (pattern, header-file, action-if-found [, action-if-not-found])
header-fileをCプリプロセッサに通した結果がpatternと マッチすれば、action-if-foundを実行します。 マッチしなければ、action-if-not-foundを実行します。 patternegrepの正規表現です。

ヘッダファイルで定義されたり、Cプリプロセッサで前もって定義されている Cプリプロセッサシンボルを調べる場合、 AC_EGREP_CPPを使いましょう。 以下に例題があります:

AC_EGREP_CPP(yes,
[#ifdef _AIX
  yes
#endif
], is_aix=yes, is_aix=no)

Macro: AC_EGREP_CPP (patter