次: , 前: Subdirectories, 上: Directories


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

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

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

6.2.1 SUBDIRSDIST_SUBDIRS

Automakeは,SUBDIRSDIST_SUBDIRSで定義される,二つのディ レクトリ・セットを考慮します.

SUBDIRSは,ビルドする必要があるカレント・ディレクトリのサブディ レクトリを含んでいます(see Subdirectories).それは手動で定義する必 要があります.Automakeは,ビルドするディレクトリかどうかを判定すること はありません.以下の二つのセクションで分かるように,ビルドするディレク トリからいくつかのディレクトリを削除する条件を定義することが可能です.

DIST_SUBDIRSはすべてのディレクトリを再帰する必要があるルールで 使用され,ビルドされる条件から外れていても使用されます.サブディレクト リopt/はビルドしないのに,それを配布したいという例を思い出しま したか?これはDIST_SUBDIRSで行ないます.optSUBDIRSにはありませんが,DIST_SUBDIRSには存在する必要が あります.

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

SUBDIRSがAutomakeの条件文を使用し条件的に定義される場合, Automakeは,すべての条件でSUBDIRSがとり得る値で, DIST_SUBDIRSを自動的に定義します.

SUBDIRSAC_SUBST変数を含む場合,Automakeはこれらの変数 がとり得る値が分からないので,DIST_SUBDIRSは正確に定義できませ ん.この状況では,DIST_SUBDIRS を手動で定義する必要があります.

6.2.2 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.3 AC_SUBSTを用いたサブディレクトリの条件式

もう一つの可能な方法は,AC_SUBSTを使用して,./configureMAYBE_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.4 コンフィグレーションされないサブディレクトリ

DIST_SUBDIRSの意味は,サブディレクトリを条件的にコンフィ グレーションしビルドしようとするユーザに誤解されていることが多くなっ ています.ここでのコンフィグレーションとは,Makefileの作成を意 味します(入れ子状のconfigureスクリプトの呼び出しの可能性もあ ります.これはコストのかかる処理で,条件的にしたい言い訳にしますが, Makefileに関することだけを議論します).

上記の例ではすべて,ビルドされないディレクトリを含めて,全部の Makefileの作成を仮定しています.単純な理由として,make distでビルドされないディレクトリも配布したいことがあり(例えば,プラッ トフォーム依存のコード),このためmake distでサブディレクトリを 再帰的にする必要があり,更にこのディレクトリをコンフィグレーションし DIST_SUBDIRSに存在させる必要があります.

すべてのサブディレクトリをコンフィグレーションするわけではないパッケー ジのビルドはトリッキーな作業になり,間違って不完全なtarballを生成しが ちなので,初心者にはお勧めしません.我々はこのトピックをここでは深く議 論しませんが,ちょっと危険なので,いくつかルールがあることを覚えておい て下さい.

  • SUBDIRSは常にDIST_SUBDIRSのサブセット(下位集合)にすべきです.

    DIST_SUBDIRSには無いディレクトリをSUBDIRSに書くことには ちょっとだけ意味があります.前者はディレクトリのリストを伝える方法で, 後者はビルドすべきものです.

  • DIST_SUBDIRSSUBDIRSにリストアップされるディレクトリは,すべてコンフィグレーションすべきです.

    すなわち,Makefileが存在する必要があり,そうしなければ,再帰的 なmakeルールでディレクトリを処理することができません.

  • コンフィグレーションされるディレクトリはすべてDIST_SUBDIRSにリストアップする必要があります.

    cleanルールで生成されたMakefileを削除するようにするためです. DIST_SUBDIRSが変数として,コンフィグレーションされるすべてのディ レクトリをリストアップしていることを確認するのが王道です.

コンフィグレーションされないディレクトリを再帰するのを避けるため,その ディレクトリが確実にDIST_SUBDIRS(とSUBDIRS)に存在しない ことを確かめる必要があります.例えば,AC_SUBSTを使用して SUBDIRSを条件的に定義していて,DIST_SUBDIRSが明示的に定 義されていない場合,それはデフォルトで$(SUBDIRS)になります.も う一つの可能性として,DIST_SUBDIRS = $(SUBDIRS)を強制します.