5.7. 依存関係

多くの port は他の port に依存しています。 必要なものすべてがユーザのマシン上に存在することを 保証するために使用可能な、7 つの変数が用意されています。 よくあるケースのためにあらかじめ設定された依存変数に加え、 いくつかの依存関係の制御のための変数があります。

5.7.1. LIB_DEPENDS

その port が必要とする共有ライブラリを、この変数で指定します。 (訳注: libc 等、標準のライブラリは指定する必要がありません。) これは lib:dir[:target] という 組のリストです。 lib が共有ライブラリの名前、 dir が そのライブラリが見つからない場合に インストールされる port のディレクトリ、 targetが そのディレクトリで呼ばれるターゲットです。 たとえば、

LIB_DEPENDS= jpeg.9:${PORTSDIR}/graphics/jpeg:install
と指定されていた場合、まずメジャーバージョンが 9 の jpeg 共有ライブラリがインストールされているかどうかを確認します。 インストールされていない場合には、ports ツリーの graphics/jpeg サブディレクトリに移動し、 target のコンパイルとインストールを行ないます。 target の部分は、 それが DEPENDS_TARGET (デフォルトでは install) と 等しいときには省略することができます。

注意: 先頭の lib の部分は ldconfig -r | grep -wF への引数になります。 この変数には正規表現を入れないようにしてください。

この依存関係のチェックは、 extract ターゲットと install ターゲットの中で、2 回行なわれます。 (訳注: これは、その port をビルドするマシンとインストールされるマシンが違う場合、 どちらのマシンでもそのライブラリが利用できることを確認するためです)。 同様に、依存するライブラリの名前は package 中にも書き込まれていて、 pkg_add(1) 実行時にそのライブラリがユーザのシステムに存在していなければ、 自動的にインストールされます。

5.7.2. RUN_DEPENDS

この port の実行時に必要となるプログラム、 またはファイルがあるときにはこの変数で指定します。これは path:dir[:target] という組のリストです。 path がファイルまたはプログラムの名前、 dir が それが見つからない場合にインストールされる port のディレクトリ、 target が そのディレクトリで呼ばれるターゲットです。 path の最初の文字がスラッシュ (/) の場合にはファイルかディレクトリとみなし、 存在するかどうか test -e を使ってチェックします。 そうでない場合には実行可能ファイルであると考えて、 そのプログラムがユーザのサーチパス上にあるかどうか which -s を使って確認します。

たとえば Makefile に以下のように書いてあるとします。

RUN_DEPENDS=   ${LOCALBASE}/etc/innd:${PORTSDIR}/news/inn \
                wish8.0:${PORTSDIR}/x11-toolkits/tk80

まず、/usr/local/etc/innd というファイルかディレクトリが存在するか確認します。 存在しない場合には、ports ツリーの news/inn というサブディレクトリで ビルドとインストールを行ないます。 さらに、wish8.0 というプログラムがユーザのサーチパス中にあるかどうか探します。 ない場合には同じく ports ツリーの x11-toolkits/tk80 というサブディレクトリでコンパイルとインストールを行ないます。

注意: この例で、innd は実際にはプログラムです。 このように、プログラムであっても一般ユーザのサーチパスに 含まれているとは考えにくいところに置かれているものの場合には、 絶対パスで指定してください。

この依存関係は install ターゲット中でチェックされます。 また、pkg_add(1) によるインストールの際に、その package が依存するものがユーザのシステムに存在しない場合には自動的に追加インストールできるように、 依存するものの名前も package 中に記録されます。 target の部分が DEPENDS_TARGET と同じ場合には、 target の部分を省略することができます。

5.7.3. BUILD_DEPENDS

この port のビルド時に必要となるプログラム、 またはファイルがあるときにはこの変数で指定します。 RUN_DEPENDS と同様に、これは path:dir[:target] という組のリストです。たとえば、

BUILD_DEPENDS=unzip:${PORTSDIR}/archivers/unzip
と指定されていた場合、まず unzip という名前のプログラムがインストールされているかどうかを確認します。 インストールされていない場合には ports ツリーの archivers/unzip サブディレクトリに移動し、 ビルドとインストールを行ないます。

注意: ここで言う``ビルド''とは、 ファイルの展開からコンパイルまでのすべての処理を意味します。 この依存関係は、extract ターゲットの中でチェックされます。 target の部分は、 DEPENDS_TARGET と同じ場合には省略することができます。

5.7.4. FETCH_DEPENDS

この port を取ってくるのに必要となるプログラム、 またはファイルがあるときにはこの変数で指定します。 上の二つと同様に、これは path:dir[:target] という組のリストです。たとえば、

FETCH_DEPENDS=ncftp2:${PORTSDIR}/net/ncftp2
と指定されていれば、ncftp2 という名前のプログラムを探します。 見つからない場合には、ports ツリーの net/ncftp2 サブディレクトリでビルドとインストールを行ないます。

この依存関係は fetch ターゲット中でチェックされます。 target の部分は、 DEPENDS_TARGET と同じ場合には省略することができます。

5.7.5. EXTRACT_DEPENDS

この変数には、この port の展開に必要な実行ファイルや、他のファイルを指定します。 前の変数と同じく、これは path:dir[:target] のタプルの一覧です。たとえば、

EXTRACT_DEPENDS=
	    unzip:${PORTSDIR}/archivers/unzip
は、unzip という実行形式のファイルがあるかどうか確認し、 見つからなければ、ports ツリーの archivers/unzip サブディレクトリに降りてビルドおよびインストールを行います。

依存関係は extract ターゲットにおいて確認されます。 target 部分が DEPENDS_TARGET と同じなら、省いて構いません。

注意: この変数は、展開が働いておらず (デフォルトでは gzip を仮定しています)、 項5.7.8 で説明されている USE_ZIPUSE_BZIP2 を使っても動かない場合にだけ使ってください。

5.7.6. PATCH_DEPENDS

この変数は、この port がパッチを当てる際に必要とする実行ファイルや他のファイルを指定します。 前の変数と同じく、これは path:dir[:target] のタプルの一覧です。たとえば、

 PATCH_DEPENDS=
	    ${NONEXISTENT}:${PORTSDIR}/java/jfc:extract
	   
は、ports ツリーの java/jfc サブディレクトリに移動して、 ビルドおよびインストールを行います。

依存関係は、patch ターゲットにおいて確認されます。target 部分が DEPENDS_TARGET と同じなら省略して構いません。

5.7.7. DEPENDS

上記のいずれにもあてはまらないような依存関係がある場合、 または他の port がインストールされているだけではなく ソースが展開されている必要がある場合には、この変数を使います。 これは上記の四つと違い、特に``確認''するものが ありませんので、 dir[:target] という形式のリストになります。 target の部分は DEPENDS_TARGET と同じ場合には省略することができます。

5.7.8. USE_*

多くの ports に共通の依存関係をカプセル化するために、 いくつもの変数が存在しています。

表 5-1. USE_* 変数

変数 意味
USE_BZIP2 その port の tarball は bzip2 で圧縮されています。
USE_ZIP その port の tarball は zip で圧縮されています。
USE_GMAKE その port をビルドするのに gmake が必要です。
USE_PERL5 その port をビルドしてインストールするのに perl 5 が必要です。 perl に関連して設定可能な他の変数については 項6.3 をご覧ください。
USE_X_PREFIX その port は PREFIX ではなく X11BASE にインストールされます。 X11 に関連して設定可能な他の変数については、 項6.4 をご覧ください。
USE_AUTOMAKE その port のビルドに GNU automake が使われます。automake に関わる他に設定可能な変数については、 項6.5 をご覧ください。
USE_AUTOCONF その port のビルドに GNU autoconf が使われます。autoconf に関わる他に設定可能な変数については、 項6.5 をご覧ください。
USE_LIBTOOL その port のビルドに GNU libtool が使われます。libtool に関わる他に設定可能な変数については、 項6.5 をご覧ください。
GMAKE gmakePATH に入っていない場合のフルパス
USE_BISON その port のビルドに bison が使われます。
USE_SDL その port のビルドや実行に SDL が使われます。 USE_SDL の使い方について、詳しくは 項6.13 をご覧ください。
NO_INSTALL_MANPAGES install.man ターゲットを使いません。

その ports が X Window System を必要とするのであれば、 USE_XLIB=yes を定義してください (これは USE_IMAKE が定義されていれば自動的に定義されます)。 BSD make ではなく GNU make を必要とする場合には USE_GMAKE=yes を、 GNU autoconf を実行する必要がある場合には USE_AUTOCONF=yes を、 最新の qt toolkit を使用する場合には USE_QT=yes を、 perl 言語のバージョン 5 を必要とする場合には USE_PERL5=yes を定義してください (特に最後のものは重要です。 FreeBSD のバージョンにより、基本システムに perl5 が含まれていたり、いなかったりします)。

5.7.9. 依存関係に関する注意

上で述べたように、依存する ports が必要になったときに呼ばれるデフォルトのターゲットは DEPENDS_TARGET で、そのデフォルトは install です。 これはユーザが使用する変数であり、 port の Makefile で定義するものではありません。 もし、その port が特別な方法で依存関係を扱う必要がある場合には、 DEPENDS_TARGET を再定義するのではなく *_DEPENDS 変数の :target 部分を使用してください。

make clean と入力したときには、 その port が依存する port も自動的に clean されます。 そうならないようにしたい場合には、 環境変数 NOCLEANDEPENDS を設定してください。KDE, GNOME や Mozilla のように、再ビルドするのに時間がかかる port に依存している場合は特に望ましいかもしれません。

無条件に他の port に依存させるには、 BUILD_DEPENDSRUN_DEPENDS の最初のフィールドに ${NONEXISTENT} という変数を指定してください。 これは、他の port のソースが必要なときのみ使用してください。 ターゲットも指定することで、 コンパイルの時間を節約できる場合もあります。 たとえば

BUILD_DEPENDS=   ${NONEXISTENT}:${PORTSDIR}/graphics/jpeg:extract
とすると、常に jpeg port のディレクトリに行ってソースの展開を行ないます。

あなたがやりたいことが他の方法ではできない場合以外には DEPENDS を使わないでください。 これは常に他の port の作成を行ない (さらにデフォルトでは インストールも行ない)、package まで作成します。 この動作が本当に所望のものでしたら、 それを BUILD_DEPENDSRUN_DEPENDS に書くべきでしょう — 少なくとも意図を明確にすることができます。

5.7.10. オプション選択可能な依存ライブラリ

巨大なアプリケーションの中には、 複数のコンフィギュレーションでビルドすることができるものがあります。 つまり、いくつもの外部ライブラリやアプリケーションの中の、 あるものが利用可能な場合に、 それを拡張機能として使用するように設定することができるということです。 それらのライブラリやアプリケーションを、 必ずしも すべてのユーザが必要としているわけではありませんので、ports システムではどのコンフィギュレーションがビルドされるべきかを port 作者が決めるために使えるフックを用意しています。 これらを適切にサポートすることにより、ユーザをハッピーにしたり、 port 1 つ分のコストで 2 つまたはそれ以上の port を提供するのと同様の効率化を行なうことが可能です。

これらのフックのうちで最も簡単に使えるものは WITHOUT_X11 でしょう。 その port が X Window System のサポートありと、 サポートなしの設定でビルドできるのであれば、 通常は X Window System サポートありでビルドするべきでしょう。 ビルド時に WITHOUT_X11 が定義されていれば、 その時は X Window System サポートなしのバージョンが ビルドされるべきです。

GNOME 環境の様々なパーツも、そのようなノブ (フック) を持っていますが、それらは幾分使いにくいものです。 Makefile 中で その目的に使用される変数は WANT_*HAVE_* になります。 そのアプリケーションが、 以下に示されている依存ライブラリの一つについて、 サポートあり、なしの両方でビルドできる場合、 Makefile には WANT_PKG をセットする必要があります。 そして、ビルド時に HAVE_PKG が定義されていれば PKG を使うバージョンがビルドされることになります。

現在、このような形でサポートされている WANT_* 変数は、 WANT_GLIB, WANT_GTK, WANT_ESOUND, WANT_IMLIB, そして WANT_GNOME です。

5.7.11. 致命的な依存の循環

重要項目: Ports ツリーに循環する依存性を持ち込まないでください!

Ports の構築技術は循環依存性を許容していません。 循環依存させてしまうと、たちまちどこかの誰かがインストールしている FreeBSD を駄目にしてしまい、その数はまたたく間に増えて行きます。 この問題は見付けるのが非常に難しいです。 問題がありそうな場合は、その変更を行う前に cd /usr/ports; make index を実行するようにしてください。 この処理は古いマシンではかなり遅いかもしれませんが、 (あなたも含めて) 多くの人がその処理を行って嘆くことにならずに済ませられるでしょう。

FreeBSD ports システムに関する質問は、(英語で) <ports@FreeBSD.org> へ、
この文書の原文に関するお問い合わせは、(英語で) <doc@FreeBSD.org> までお願いします。