[ << ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
サブディレクトリがあるパッケージでは,最上位の`Makefile.am'でビル
ドするサブディレクトリをAutomakeに伝える必要があります.これは
SUBDIRS
変数によってなされます.
SUBDIRS
変数は,さまざまな種類のビルドが行われるサブディレクトリ
のリストを保持しています.生成されている`Makefile'内の多くのター
ゲットに対するルールは(例えばall
),ローカルと指定されたすべての
サブディレクトリの両方で実行されます.SUBDIRS
でリストアップされ
ているディレクトリには,`Makefile.am'を含んでいる必要がないことに
注意してください.(configure後の)`Makefile'だけが必要です.こうす
ることで,(gettext
のような)Automakeを使用しないパッケージからラ
イブラリを含めることが可能になります.
サブディレクトリを使用しているパッケージでは,最上位の `Makefile.am'は非常に短いことが多くなっています.例えば,GNU Hello 配布物の`Makefile.am'は以下のようになっています.
EXTRA_DIST = BUGS ChangeLog.O README-alpha SUBDIRS = doc intl po src tests |
Automakeがmake
をサブディレクトリで呼び出すとき,MAKE
変数
の値を使用します.それは,変数AM_MAKEFLAGS
の値をmake
の呼
び出しに渡します.これで,常にmake
に渡す必要があるフラグを
`Makefile.am'で設定することが可能になります.
SUBDIRS
で記述されているディレクトリは,現在のディレクトリの直接
の子ディレクトリにする必要があります.例えば,SUBDIRS
に
`src/subdir'を書くことはできません.代わりに,SUBDIRS =
subdir
を`src/Makefile.am'に書くべきです.この方法で任意の深さの
パッケージ構成で,Automakeを使用することがが可能になります.
デフォルトで,Automakeは最初の深さ(`postfix')で動作する
`Makefile'を生成します.しかし,この順序を変更することは可能です.
SUBDIRS
に`.'を書くことでこうすることが可能です.例えば,
`.'を最初に書くことで,ディレクトリの`prefix'の順序になりま
す.すべての`clean'ルールは,ビルドルールの逆の順序で実行されます.
GNU Inetutils
のように,パッケージ全体のサブセットをビルドしたい
だけの場合,SUBDIRS
変数を条件的に定義することがが可能です.
これがどのように動作するかを説明するため,二つのディレクトリ
`src/' と`opt/'があると仮定しましょう.`src/'は常にビル
ドされますが,`opt/'は./configure
でビルドするかどうかを決
定したいと思います.(この例では,変数$want_opt
がyes
に設
定されているとき`opt/'をビルドすると仮定します.)
make
と実行することで,`src/'は常に再帰され,`opt/'も
そうなるかもしれません.
しかし,make dist
では常に`src/'と`opt/'の両方を再帰す
べきです.つまり,現在のconfigureでは不要な場合でも,`opt/'は配布
されるべきです.これは,`opt/Makefile'は条件に依存せず作成される
べきだということを意味します.(3)
このようにプロジェクトを設定する方法は二つあります.Automakeの条件式
(see section 20. 条件文)を使用したり,AutoconfのAC_SUBST
マクロ
(see section `Setting Output Variables' in The Autoconf Manual)を使用したりすることが可能です.
Automakeの条件式の使用は,より好まれる解となります.
AM_CONDITIONAL
を用いた条件付サブディレクトリ `configure'でそれぞれのディレクトリの`Makefile'を出力し, `opt/'をビルドするかどうかの条件を定義すべきです.
... AM_CONDITIONAL([COND_OPT], [test "$want_opt" = yes]) AC_CONFIG_FILES([Makefile src/Makefile opt/Makefile]) ... |
SUBDIRS
は,最上位の`Makefile.am'で,以下のように定義するこ
とが可能です.
if COND_OPT MAYBE_OPT = opt endif SUBDIRS = src $(MAYBE_OPT) |
御覧のように,make
を実行することで,`src/'と,おそらく
`opt/'に再帰していくでしょう.
見ることはできませんが,make dist
はmake all
とは異なり,
SUBDIRS
変数を使用しないので,make dist
を実行することで,
`src/'と`opt/'の両方に再帰的に行ないます.それは
DIST_SUBDIRS
変数を使用します.
この場合,AutomakeはMAYBE_OPT
が条件によってはopt
を含むこ
とを知っているので,DIST_SUBDIRS = src opt
を自動的に定義します.
AC_SUBST
を用いたサブディレクトリの条件式
もう一つの考えは,AC_SUBST
を使用して,`./configure'で
MAYBE_OPT
を定義することです.
... if test "$want_opt" = yes; then MAYBE_OPT=opt else MAYBE_OPT= fi AC_SUBST([MAYBE_OPT]) AC_CONFIG_FILES([Makefile src/Makefile opt/Makefile]) ... |
この状況では,最上位の`Makefile.am'は以下のようになるでしょう.
SUBDIRS = src $(MAYBE_OPT) DIST_SUBDIRS = src opt |
欠点は,AutomakeがMAYBE_OPT
の変数が何かを推測することが不可能な
ので,DIST_SUBDIRS
に定義する必要があるということです.
DIST_SUBDIRS
が使用される方法
上記の例のように,DIST_SUBDIRS
は,条件によってビルドされないま
まであっても,すべてのディレクトリで再帰的に必要なルールとして使用され
ます.
厳密にいうと,DIST_SUBDIRS
はmake dist
,make
distclean
,そしてmake maintainer-clean
で使用されます.すべての
その他の再帰的なルールはSUBDIRS
を使用します.
Automakeは,すべての条件で取り得るSUBDIRS
の値から,自動的に
DIST_SUBDIRS
を定義します.
SUBDIRS
がAC_SUBST
変数を含んでいる場合,Automakeはこれら
の変数の取り得る値を知らないので,DIST_SUBDIRS
は正しく定義され
ません.この状況では,DIST_SUBDIRS
を手動で定義する必要がありま
す.
[ << ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |