[ << ] [ >> ]           [Top] [Contents] [Index] [ ? ]

6. 最上位の`Makefile.am'


6.1 サブディレクトリの再帰

サブディレクトリがあるパッケージでは,最上位の`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'ルールは,ビルドルールの逆の順序で実行されます.


6.2 サブディレクトリの条件

GNU Inetutilsのように,パッケージ全体のサブセットをビルドしたい だけの場合,SUBDIRS変数を条件的に定義することがが可能です.

これがどのように動作するかを説明するため,二つのディレクトリ `src/' と`opt/'があると仮定しましょう.`src/'は常にビル ドされますが,`opt/'は./configureでビルドするかどうかを決 定したいと思います.(この例では,変数$want_optyesに設 定されているとき`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の条件式の使用は,より好まれる解となります.


6.2.1 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を自動的に定義します.


6.2.2 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に定義する必要があるということです.


6.2.3 DIST_SUBDIRSが使用される方法

上記の例のように,DIST_SUBDIRSは,条件によってビルドされないま まであっても,すべてのディレクトリで再帰的に必要なルールとして使用され ます.

厳密にいうと,DIST_SUBDIRSmake distmake distclean,そしてmake maintainer-cleanで使用されます.すべての その他の再帰的なルールはSUBDIRSを使用します.

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

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


[ << ] [ >> ]           [Top] [Contents] [Index] [ ? ]

This document was generated by Akihiro Sagawa on February, 25 2004 using texi2html