Next: Alternative, Previous: Subdirectories, Up: Directories
GNU Inetutils
のように,パッケージ全体のサブセットをビルドしたい
だけの場合,SUBDIRS
変数を条件的に定義することがが可能です.
これがどのように動作するかを説明するため,二つのディレクトリ
src/ とopt/があると仮定しましょう.src/は常にビル
ドされますが,opt/は./configure
でビルドするかどうかを決
定したいと思います.(この例では,変数$want_opt
がyes
に設
定されているときopt/をビルドすると仮定します.)
make
と実行することで,src/は常に再帰され,opt/も
そうなるかもしれません.
しかし,make dist
では常にsrc/とopt/の両方を再帰す
べきです.つまり,現在のconfigureでは不要な場合でも,opt/は配布
されるべきです.これは,opt/Makefileは条件に依存せず作成
されるべきだということを意味します.
このようにプロジェクトを設定する方法は二つあります.Automakeの条件式
(see Conditionals)を使用したり,AutoconfのAC_SUBST
マクロ
(see Setting Output Variables)を使用したりすることが可能です.
Automakeの条件式の使用は,より好まれる解となります.これら二つの可能性
を示す前に,DIST_SUBDIRS
を紹介しましょう.
SUBDIRS
対DIST_SUBDIRS
Automakeは,SUBDIRS
とDIST_SUBDIRS
で定義される,二つのディ
レクトリ・セットを考慮します.
SUBDIRS
は,ビルドする必要があるカレント・ディレクトリのサブディ
レクトリを含んでいます(see Subdirectories).それは手動で定義する必
要があります.Automakeは,ビルドするディレクトリかどうかを判定すること
はありません.以下の二つのセクションで分かるように,ビルドするディレク
トリからいくつかのディレクトリを削除する条件を定義することが可能です.
DIST_SUBDIRS
はすべてのディレクトリを再帰する必要があるルールで
使用され,ビルドされる条件から外れていても使用されます.サブディレクト
リopt/はビルドしないのに,それを配布したいという例を思い出しま
したか?これはDIST_SUBDIRS
で行ないます.opt
は
SUBDIRS
にはありませんが,DIST_SUBDIRS
には存在する必要が
あります.
厳密にいうと,DIST_SUBDIRS
はmake dist
,make
distclean
,そしてmake maintainer-clean
で使用されます.それ以外
の再帰的なルールではSUBDIRS
が使用されます.
SUBDIRS
がAutomakeの条件文を使用し条件的に定義される場合,
Automakeは,すべての条件でSUBDIRS
がとり得る値で,
DIST_SUBDIRS
を自動的に定義します.
SUBDIRS
がAC_SUBST
変数を含む場合,Automakeはこれらの変数
がとり得る値が分からないので,DIST_SUBDIRS
は正確に定義できませ
ん.この状況では,DIST_SUBDIRS
を手動で定義する必要があります.
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
の意味は,サブディレクトリを条件的にコンフィ
グレーションしビルドしようとするユーザに誤解されていることが多くなっ
ています.ここでのコンフィグレーションとは,Makefileの作成を意
味します(入れ子状のconfigureスクリプトの呼び出しの可能性もあ
ります.これはコストのかかる処理で,条件的にしたい言い訳にしますが,
Makefileに関することだけを議論します).
上記の例ではすべて,ビルドされないディレクトリを含めて,全部の
Makefileの作成を仮定しています.単純な理由として,make
dist
でビルドされないディレクトリも配布したいことがあり(例えば,プラッ
トフォーム依存のコード),このためmake distでサブディレクトリを
再帰的にする必要があり,更にこのディレクトリをコンフィグレーションし
DIST_SUBDIRS
に存在させる必要があります.
すべてのサブディレクトリをコンフィグレーションするわけではないパッケー ジのビルドはトリッキーな作業になり,間違って不完全なtarballを生成しが ちなので,初心者にはお勧めしません.我々はこのトピックをここでは深く議 論しませんが,ちょっと危険なので,いくつかルールがあることを覚えておい て下さい.
|
コンフィグレーションされないディレクトリを再帰するのを避けるため,その
ディレクトリが確実にDIST_SUBDIRS
(とSUBDIRS
)に存在しない
ことを確かめる必要があります.例えば,AC_SUBST
を使用して
SUBDIRS
を条件的に定義していて,DIST_SUBDIRS
が明示的に定
義されていない場合,それはデフォルトで$(SUBDIRS)
になります.も
う一つの可能性として,DIST_SUBDIRS = $(SUBDIRS)
を強制します.