[ << ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Autoconfで生成されたconfigure
スクリプトは、初期化や結果出力の
ための情報を必要します。たとえば、パッケージのソースファイルは
どこにあるのかとか、どのような出力ファイルを生成すべきか、などです。
以下の節では、初期化と結果出力について説明します。
3.1 Finding configure Input | Where Autoconf should find files. | |
3.2 Creating Output Files | Creating output files. | |
3.3 Substitutions in Makefiles | Using output variables in `Makefile's. | |
3.4 Configuration Header Files | Creating a configuration header file. | |
3.5 Configuring Other Packages in Subdirectories | Configuring independent packages together. | |
3.6 Default Prefix | Changing the default installation prefix. | |
3.7 Version Numbers in configure | Version numbers in configure . |
configure
Input
configure
スクリプトは他の全てのマクロより先に、AC_INIT
マクロを呼び出さねばなりません。必ず呼び出されなければならないマクロは
AC_INIT
とAC_OUTPUT
だけです(see section 3.2 Creating Output Files)。
configure
は、指定された
ディレクトリにソースコードが実際あるかどうか、
そのファイルが存在するかどうかを調べることで判断します。
ときには、ユーザはコマンドラインオプション`--srcdir'で
間違ったディレクトリを指定するかもしれません; この判定は、
安全のためのチェックです。詳しくはSee section 10. Running configure
Scriptsを
参照してください。
手動で設定を行うパッケージや、install
プログラムを
利用するパッケージでは、AC_CONFIG_AUX_DIR
を使って、
configure
に他のshellスクリプトがどこにあるかを
知らせる必要があるかもしれません。たいていはデフォルトで
調べにいく場所で正しいのですが。
configure
スクリプトを利用することを
指定します。dirは絶対パス、または
`srcdir'からの相対パスで指定します。
デフォルトは`srcdir'または
`srcdir/..'または
`srcdir/../..'のうち、
`install-sh'が最初にみつかった場所です。
他のファイルの置き場所についてはチェックが
行われません。これはAC_PROG_INSTALL
を
使っただけで他のファイルを配布しなければ
ならなくなるのを防ぐためです。
このマクロは`install.sh'もチェックしますが、
このファイル名はobsoleteです。なぜなら、
`Makefile'がない場合、make
が組み込み
ルールを使って`install.sh'から`install'を
生成しようとするからです。
Autoconfで生成されたconfigure
スクリプトは、
最後にAC_OUTPUT
を呼び出さねばなりません。
このマクロは、`Makefile'や他のファイルを自動設定結果にしたがって
生成します。configure.in
に必ず含まれなければならない
マクロは、AC_OUTPUT
の他にはAC_INIT
だけです(see section 3.1 Finding configure
Input)。
AC_CONFIG_HEADER
、AC_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) |
extra-cmdsを指定した場合、指定された
コマンドは他の処理の後に実行されるように
`config.status'に追加されます。
init-cmdsが指定された場合、それは
shell変数、コマンド、backslashの
置き換えが行われた後、extra-cmdsの
直前に挿入されます。init-cmdsを
使うことで、configure
から
extra-cmdsに変数を引き渡すことが
できます。AC_OUTPUT_COMMANDS
マクロが
呼び出されていた場合、AC_OUTPUT_COMMANDS
に
指定されたコマンドは、AC_OUTPUT
に指定された
コマンドの直前に実行されます。
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
では、変数
MAKE
はmake
プログラムと与えられた
オプションに設定されます(が、多くの場合
コマンドラインでの変数値設定は含まれません)。
一部の古いmake
では、変数MAKE
は
設定されません。以下のマクロを使うと、そのような
古いmake
でも変数MAKE
を使うことができます。
make
が変数MAKE
を設定しているなら、
変数SET_MAKE
を空にします。
そうでない場合、SET_MAKE
を`MAKE=make'に
設定します。内部でAC_SUBST
を
SET_MAKE
を置換するように呼び出します。
このマクロを利用する場合、MAKE
を利用する
各々のMakefile.in
に以下のような行を置いてください:
@SET_MAKE@ |
配布パッケージの各サブディレクトリのうちでコンパイルやインストールが
必要なディレクトリには、`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 6.2 Setting Output Variablesを参照してください。
configure
スクリプトを用いるソフトウェアパッケージは、
`Makefile'ではなくて`Makefile.in'と一緒に配布される
必要があります; こうすれば、ユーザはコンパイルの前に必ず
configure
スクリプトを実行して、各々のシステムにあわせた
設定を行うことになります。
`Makefile'に何かを書くことに関するより多くの情報のために See section `Makefile Conventions' in The GNU Coding Standards, を参照してください。
3.3.1 Preset Output Variables | Output variables that are always set. | |
3.3.2 Build Directories | Supporting multiple concurrent compiles. | |
3.3.3 Automatic Remaking | Makefile rules for configuring. |
Autoconfマクロでいくつかの出力変数が前もって設定されています。 Autoconfマクロの一部では、追加の出力変数を設定します。これについては 各マクロの説明のところで述べられています。 出力変数の完全なリストをみるにはSee section Output Variable Indexを 参照してください。前もって設定される出力変数の意味を以下に示します。 `dir'で終る出力変数については、 See section `Variables for Installation Directories' in The GNU Coding Standards, を参照してください。
configure
によって
自動生成されました」というコメントと、
入力ファイル名を含んだコメント文字列です。
AC_OUTPUT
は、生成する`Makefile'の
先頭に、この文字列を含むコメント行を
付け加えます。他のファイルについては、
この変数を各入力ファイル先頭のコメント
領域の中で参照しましょう。たとえば、
shellスクリプトである入力ファイルの先頭は
以下のようになります:
#! /bin/sh # @configure_input@ |
また、この行を置いておくことで、ファイルを
編集するひとにconfigure
を使って
処理しないといけない、ということを
思い出させることができます。
srcdir
とおなじです。
configure
が
実行された環境で指定されていなかった場合、
AC_PROG_CC
を呼び出したときの
デフォルト値(または、呼び出さなかったら空)が
設定されます。configure
はこの変数の
値を使って、Cコンパイラの機能チェックのための
コンパイルを行います。
configure
が実行された
環境でこの変数が指定されなかった場合、
デフォルト値は空になります。
configure
はこの変数の
値を使って、Cコンパイラの機能チェック
のためのコンパイル、または
プリプロセスを行います。
configure
が
実行された環境で指定されていなかった場合、
AC_PROG_CXX
を呼び出したときの
デフォルト値(または、呼び出さなかったら空)が
設定されます。configure
はこの変数の
値を使って、C++コンパイラの機能チェックのための
コンパイルを行います。
configure
を実行するとき環境変数に設定されていなければ
AC_PROG_F77
を呼ぶときにデフォルト値が設定されます。(または、
AC_PROG_F77
を呼ばなければ空になります) configure
はFortran
77 の特徴をテストするプログラムをコンパイルするときにこの変数を使用しま
す。
AC_CONFIG_HEADER
マクロが呼び出された
場合、configure
は`@DEFS@'を
`-D'群でなく、`-DHAVE_CONFIG_H'で
置き換えます(see section 3.4 Configuration Header Files
参照)。この変数はconfigure
がテストを
行っている間は定義されません。出力ファイルを
生成するときにだけ定義されます。
既に行われてたテストの結果を参照する
場合には、See section 6.2 Setting Output Variablesを
参照してください。
configure
が実行された環境で
指定されていなかった場合、
デフォルト値の空文字列が
設定されます。
configure
はこの変数の値を
使って、Cコンパイラの機能チェックの
際のリンクを行います。
ソフトウェアパッケージを展開した単一のソースコードツリー上で、 同時に複数のアーキテクチャのためのコンパイルを行うことができます。 オブジェクトファイルは各アーキテクチャ別のディレクトリに格納されます。
このためには、make
はソースコードをみつけるために
make
変数VPATH
を使用します。GNU make
と
最近のmake
のほとんどはこの機能をサポートしています。
古いmake
はVPATH
をサポートしていません;
古いmake
を使う場合、ソースコードとオブジェクトファイルは
同じディレクトリに置かれていなければなりません。
VPATH
をサポートするために、各`Makefile.in'には
以下ような行が含まれている必要があります:
srcdir = @srcdir@ VPATH = @srcdir@ |
VPATH
を他の変数の値を使って設定しないでください(たとえば
`VPATH = $(srcdir)'のように)。一部のmake
はVPATH
の
値を設定する場合に変数置換を行います。
configure
は`Makefile'を生成する際に、
srcdir
を正しい値に設定し置換します。
make
変数$<
(VPATH
を使ってみつけたソースディレクトリ中の
ファイルのパス名)は、暗黙的ルールの中以外では使わないでください
(暗黙的ルールとは、例えば`.c'ファイルから`.o'ファイルを
生成するための手順を定義する`.c.o'のルールのことです)。
一部のmake
は明示的ルール(訳中: 暗黙的ルールでないルール)の中では、
$<
定義しません; $<
は空になります。
そのかわりに、`Makefile'に記述するコマンドラインはソースファイルを `$(srcdir)/'で始めるようにしてください。例えば:
time.info: time.texinfo $(MAKEINFO) $(srcdir)/time.texinfo |
以下に示すようなルールをトップレベルの`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 3.2 Creating Output Filesを参照。
設定ファイルにまつわる依存関係については、See section 11. Recreating a Configurationを 参照。
パッケージの移植性テストで、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'を使ってパッケージをコンパイルすることができます
(訳註: 結構意訳)。
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) |
3.4.1 Configuration Header Templates | Input for the configuration headers. | |
3.4.2 Using autoheader to Create `config.h.in' | How to create configuration 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 |
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_HEADERS
、AC_CHECK_FUNCS
、AC_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
--macrodir=dir
-m dir
AC_MACRODIR
を設定しても同じ効果が
得られます。コマンドラインオプションは環境変数の
設定より優先されます。
--version
ほとんどの場合、サブディレクトリに`Makefile'を作るには
AC_OUTPUT
を使えば十分です。
しかし、複数の独立したパッケージを制御するconfigure
スクリプトを作る場合には、AC_CONFIG_SUBDIRS
を使うことで
サブディレクトリにあるconfigure
スクリプトを呼び出すことができます。
AC_OUTPUT
マクロに、
dirに指定されたディレクトリ
にあるconfigure
を実行させます。
ディレクトリが複数の場合はdirに
ディレクトリをスペースで区切って並べます。
ディレクトリdirがみつからない場合、
エラーにはなりません。これは、
configure
大きなソースコード
ツリーのうちの実在する一部分だけを
設定できるようにするためです。
dirに`configure.in'があって
`configure'がない場合、Cygnus
ディレクトリAC_CONFIG_AUXDIR
にある
Cygnus configure
スクリプトが
使われます。
サブディレクトリにあるconfigure
スクリプトには、現在実行中の
configure
スクリプトと、
基本的には同じコマンドライン引数が
渡されます。
コマンドライン引数は必要な場合には
わずかに変更されます(例えば、
キャッシュファイルやソースファイルの
あるディレクトリへの相対パスの調整など)。
このマクロは出力変数subdirs
に、
サブディレクトリのリスト(dir ...)
を設定します。`Makefile'ルールでは
この変数を使って、どのサブディレクトリを
再帰的にmake
すればいいのか決める
ことができます。このマクロは複数回
呼び出しても構いません。
デフォルトでは、configure
はインストールのためのファイル名の
ディレクトリプレフィクスを`/usr/local'に設定します。configure
の
ユーザは、`--prefix'と`--exec-prefix'オプションを使って、
他のディレクトリプレフィクスを選択することができます。
デフォルトの設定を変更するにはふたつの方法があります:
configure
生成時と、configure
の実行時です。
一部のソフトウェアパッケージでは、デフォルトで`/usr/local'以外のところに
インストールしたい場合があるでしょう。このためには、
AC_PREFIX_DEFAULT
マクロを使ってください。
configure
スクリプトが、既にインストールされている
関係あるプログラムのインストール位置から、
インストールディレクトリプレフィクスを推測してくれると
便利なこともあるでしょう。このためには、AC_PREFIX_PROGRAM
を
呼び出しましょう。
PATH
をたぐって
探されます。もしprogramが
PATH
に書かれたディレクトリの
どこかに存在した場合、ディレクトリ
プレフィクスをprogramのある
ディレクトリの親ディレクトリに
設定します; もしなかったら、
`Makefile.in'に指定された
プレフィクスをそのままにします。
例えば、programがgcc
で、
PATH
を探した結果
`/usr/local/gnu/bin/gcc'が
見つかった場合、プレフィクスは
`/usr/local/gnu'になります。
configure
以下のマクロはconfigure
スクリプトのバージョン番号を管理します。
このマクロは使っても使わなくても構いません。
configure
を生成するのに
使われているAutoconfがversion
以前のものだった場合、エラーメッセージを
標準エラー出力に出力し、configure
を
生成しません。例えば:
AC_PREREQ(1.8) |
このマクロは、`configure.in'が、
Autoconfのバージョンアップで変化した
自明でないふるまいに依存している場合に
役立ちます。もし最近定義されたマクロが
必要なだけの場合、AC_PREREQ
マクロは
あまり使いでがありません。なぜなら、
autoconf
はAutoconfの
ユーザに、マクロがないというエラーを
出力しているはずだからです。
同様のことは、`cofigure.in'を
AC_PREREQ
が追加される以前の
Autoconfに通したときに起こります。
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 |
[ << ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |