サブディレクトリがあるパッケージでは,トップレベルの`Makefile.am'で
ビルドするサブディレクトリをAutomakeに伝える必要があります.これは
SUBDIRS
変数によってなされます.
SUBDIRS
変数は,さまざまな種類のビルドが行われるサブディレクトリの
リストを保持しています.生成されている`Makefile'内の多くのターゲッ
ト(例えばall
)は,ローカルと指定されたすべてのサブディレクトリの両
方で実行されます.SUBDIRS
でリストアップされているディレクトリには,
`Makefile.am'を含んでいる必要がないことに注意してください.(コンフィ
ギュレーションの後の)`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/'の両方を再帰すべ
きです.つまり,現在のコンフィグレーションでは不要な場合でも,
`opt/'は配布されるべきです.これは,`opt/Makefile'は条件に依存
せず作成されるべきだということを意味します.
(5)
このようにプロジェクトを設定する方法は二つあります.Automakeの条件式
(see section 条件文)を使用したり,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
を手動で定義する必要があります.
Go to the first, previous, next, last section, table of contents.