サブディレクトリがあるパッケージでは,トップレベルの`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.