Go to the first, previous, next, last section, table of contents.


トップレベルの`Makefile.am'

サブディレクトリの再帰

サブディレクトリがあるパッケージでは,トップレベルの`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_optyesに設定されているとき `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 distmake 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_SUBDIRSmake distmake distclean,そしてmake maintainer-cleanで使用されます.すべてのそ の他の再帰的なターゲットはSUBDIRSを使用します.

Automakeは,すべての条件で取り得るSUBDIRSの値から,自動的に DIST_SUBDIRSを定義します.

SUBDIRSAC_SUBST変数を含んでいる場合,Automakeはこれらの 変数の取り得る値を知らないので,DIST_SUBDIRS は正しく定義されませ ん.この状況では,DIST_SUBDIRSを手動で定義する必要があります.


Go to the first, previous, next, last section, table of contents.