FreeBSD port 作成者のためのハンドブック
Prev | Chapter 4. `Makefile` の作成 | Next

# 4.6. 依存関係

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

## 4.6.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`) と 等しいときには省略することができます。

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

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

## 4.6.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` というサブディレクトリでコンパイルとインストールを行ないます。

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

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

## 4.6.3. `BUILD_DEPENDS`

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

    BUILD_DEPENDS=unzip:${PORTSDIR}/archivers/unzip

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

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

## 4.6.4. `FETCH_DEPENDS`

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

    FETCH_DEPENDS=ncftp2:${PORTSDIR}/net/ncftp2

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

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

## 4.6.5. `DEPENDS`

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

## 4.6.6. `USE_`*``

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

Table 4-1. `USE_`*`` 変数

変数 | 意味
--- | ---
`USE_BZIP2` | その port の tarball は `bzip2` で圧縮されています。
`USE_ZIP` | その port の tarball は `zip` で圧縮されています。
`USE_GMAKE` | その port をビルドするのに `gmake` が必要です。
`USE_PERL5` | その port をビルドしてインストールするのに Perl 5 が必要です。Perl に関連して設定可能な他の変数については Section 5.3 をご覧ください。
`USE_X_PREFIX` | その port は `PREFIX` ではなく `X11BASE` にインストールされます。 X11 に関連して設定可能な他の変数については、 Section 5.4 をご覧ください。
`USE_AUTOMAKE` | その port のビルドに GNU `automake` が使われます。`automake` に関わる他に設定可能な変数については、 Section 5.5 をご覧ください。
`USE_AUTOCONF` | その port のビルドに GNU `autoconf` が使われます。`autoconf` に関わる他に設定可能な変数については、 Section 5.5 をご覧ください。
`USE_LIBTOOL` | その port のビルドに GNU `libtool` が使われます。`libtool` に関わる他に設定可能な変数については、 Section 5.5 をご覧ください。
`GMAKE` | `gmake` が `PATH` に入っていない場合のフルパス
`USE_BISON` | その port のビルドに `bison` が使われます。
`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 が含まれていたり、いなかったりします)。

## 4.6.7. 依存関係に関する注意

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

`make clean` と入力したときには、 その port が依存する port も自動的に clean されます。 そうならないようにしたい場合には、 環境変数 `NOCLEANDEPENDS` を設定してください。

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

    BUILD_DEPENDS=   ${NONEXISTENT}:${PORTSDIR}/graphics/jpeg:extract

とすると、常に JPEG port のディレクトリに行ってソースの展開を行ないます。

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

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

巨大なアプリケーションの中には、 複数のコンフィギュレーションでビルドすることができるものがあります。 つまり、いくつもの外部ライブラリやアプリケーションの中の、 あるものが利用可能な場合に、 それを拡張機能として使用するように設定することができるということです。 それらのライブラリやアプリケーションを、 必ずしも すべてのユーザが必要としているわけではありませんので、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` です。

Prev | Home | Next
`MAINTAINER` | Up | 作業ディレクトリの指定

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