次: Alternative, 前: Subdirectories, 上: 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)を強制します.