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

# 4.10. 依存関係

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

## 4.10.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.10.2. `RUN_DEPENDS`

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

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

    RUN_DEPENDS=   ${PREFIX}/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.10.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.10.4. `FETCH_DEPENDS`

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

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

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

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

## 4.10.5. `DEPENDS`

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

## 4.10.6. よくある依存関係を表す変数

その 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.10.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` に書くべきでしょう -- 少なくとも意図を明確にすることができます.

Prev | Home | Next
`MAINTAINER` | Up | オプション選択可能な依存ライブラリ

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