5.7. 依存関係
戻る | 第5章 `Makefile` の作成 | 次へ

## 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` を仮定しています)、 「`USE_`*``」 で説明されている `USE_ZIP` や `USE_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` に関連して設定可能な他の変数については 「`perl` の利用」 をご覧ください。
`USE_X_PREFIX` | その port は `PREFIX` ではなく `X11BASE` にインストールされます。 X11 に関連して設定可能な他の変数については、 「X11 の利用」 をご覧ください。
`USE_AUTOMAKE` | その port のビルドに GNU `automake` が使われます。`automake` に関わる他に設定可能な変数については、 「`automake`, `autoconf` および `libtool` の利用」 をご覧ください。
`USE_AUTOCONF` | その port のビルドに GNU `autoconf` が使われます。`autoconf` に関わる他に設定可能な変数については、 「`automake`, `autoconf` および `libtool` の利用」 をご覧ください。
`USE_LIBTOOL` | その port のビルドに GNU `libtool` が使われます。`libtool` に関わる他に設定可能な変数については、 「`automake`, `autoconf` および `libtool` の利用」 をご覧ください。
`GMAKE` | `gmake` が `PATH` に入っていない場合のフルパス
`USE_BISON` | その port のビルドに `bison` が使われます。
`USE_SDL` | その port のビルドや実行に `SDL` が使われます。 `USE_SDL` の使い方について、詳しくは 「SDL の利用」 をご覧ください。
`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_DEPENDS` や `RUN_DEPENDS` の最初のフィールドに `${NONEXISTENT}` という変数を指定してください。 これは、他の port のソースが必要なときのみ使用してください。 ターゲットも指定することで、 コンパイルの時間を節約できる場合もあります。 たとえば

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

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

あなたがやりたいことが他の方法ではできない場合以外には `DEPENDS` を使わないでください。 これは常に他の port の作成を行ない (さらにデフォルトでは インストールも行ない)、package まで作成します。 この動作が本当に所望のものでしたら、 それを `BUILD_DEPENDS` と `RUN_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` を実行するようにしてください。 この処理は古いマシンではかなり遅いかもしれませんが、 (あなたも含めて) 多くの人がその処理を行って嘆くことにならずに済ませられるでしょう。

戻る | 上に戻る | 次へ
5.6. `COMMENT` | ホーム | 5.8. 作業ディレクトリの指定

本文書、および他の文書は ftp://ftp.FreeBSD.org/pub/FreeBSD/doc/ からダウンロードできます。

FreeBSD に関する質問がある場合には、 ドキュメント を読んだ上で <questions@FreeBSD.org> まで (英語で) 連絡してください。
本文書に関する質問については、 <doc@FreeBSD.org> まで電子メールを (英語で) 送ってください。