NetBSD パッケージシステムにおける
ワイルドカードの取り扱いについて
Hubert Feyrer <hubertf@NetBSD.org>、 2000 年 1 月

概要: この文書では、まず NetBSD パッケージシステムにおいて 依存関係がどのように機能してきたかを振り返り、ワイルドカードを使った 依存関係を持つバイナリーパッケージのインストールのために ワイルドカードが使われる方法と、パッケージの衝突の処理を説明し、 さらに、 pkg_* ツールが導入されてからの変更点の概要を述べます。

1) これまでのあらすじ

まずは、 *BSD Packages/Ports システムにおいて、依存関係がどのように 処理されてきたかを説明させてください。 RUN/BUILD_DEPENDS は別にすると、 依存関係の仕組みは、パッケージの Makefile での次のような指定によって 働きます:

	DEPENDS+=	foo-1.2:../../somecat/foo
これは二つのことを指定します:

  1. このパッケージが依存している "foo" のバージョン。このパッケージを インストールするためには、 foo-1.2 がなければなりません。
  2. 必要なバージョンがインストールされていない場合、先にそちらを パッケージシステムを使って構築するため、一旦そちらの処理に移行します。
インストールの際、必要な "foo" のバージョンがインストールされているか 調べるのに "pkg_info -e" が使われます。もしインストールされていれば、 何も問題はなく、 pkgsrc からの構築でも pkg_add を使ったバイナリーパッケージの インストールでも、インストール作業を続けます。

もし必要なバージョンがインストールされていなければ、構築システムは、 依存関係がすべて解決するまで、依存しているパッケージのインストールのため、 それ用のディレクトリーに移行します。 バイナリーパッケージのインストールの場合は、 pkg_add は foo-1.2.tgz というバイナリーパッケージがあることを前提とし、それをインストールします。

2) ワイルドカード依存関係

このように必要な "foo" のバージョンを特定のものに固定すると、 保守が厄介になります。また、多くの場合、特定のバージョンが必要なのではなく、 いくつかのバージョンのうちのどれか (あるいは任意のバージョン) が インストールされていればよかったりします。 そこで、次のような依存関係の設定ができました。

	DEPENDS+=	foo-*:../../somecat/foo
これは、 "foo" の "任意の" バージョンを表します。構築システムは、 "pkg_info -e 'foo-*'" を使って "foo" のいずれかのバージョンが インストールされているか調べます。インストール済のパッケージをすべて調べ、も し "foo" がインストールされていれば、どのバージョンであろうと受け入れるのです。 もしインストールされていなければ、構築システムは、 pkgsrc から バージョン不問で探し出し、これのインストールに移行します。

バイナリーパッケージでは、この扱いはより複雑です。各バイナリーパッケージは、 "foo" パッケージの "任意の" バージョンに依存していることを知っており、 構築システムと同様に、それを見つけるためのチェックをします。 もし条件を満たすバージョンがインストール済ならば問題ありません。 そうでない場合、 "foo" パッケージの "任意の" バージョンのインストール という要求を (自動的に) 満たすうえで、問題が起こります。 バイナリーパッケージの形態では移行すべきディレクトリーが与えられず、 また、ソースからの再構築というオプションがないためです。

そこで、 pkg_add では、すべての利用可能な (バイナリー) パッケージをスキャンし、 そのなかで (求められている条件 "foo-*" に合致するものから) 最新のものを インストールします。このスキャンは、ワイルドカードの仕組みへの対応のために 必要なことです。依存しているバージョンに、 foo<1.0 のような制約 (``dewey depend'') がある場合は、 1.0 より前のバージョンで利用可能な バイナリーパッケージのなかから最新のものを探してインストールします。 こうやって必要な依存関係を満たすのです。

バイナリーパッケージは、ローカルディスクからだけでなく FTP 経由でも インストールできますが、上で説明した "ディレクトリースキャン" はこの場合も 行なわれます。この、遠隔ディレクトリーのスキャンは、 NetBSD パッケージシステムのワイルドカードを完全に有用なものにする上で、 最後まで欠けていた部分でした。

3) 処理についてのメモ

バイナリーパッケージ─ "kde" のように、 "a-1.0" というパッケージが "b-1.*" に依存し、さらにそれが "c-*" を必要としているなどとします─ を FTP 経由でインストールする場合、 必要な (ネットワークの) 動作は、おおざっぱに言えば次のようになります:

"…の残りの処理" での操作では、同じコネクション (FTP その他何でも) を再利用して行なうことができます。にもかかわらず、 pkg_add のプロセスが、 さらなるパッケージの追加のために、同じ FTP サイトに別のコネクションを 張ってしまうと、次のような結果を生みます。

これは、 3 個の pkg_add のプロセスすべてで同じ FTP セッションを使うことで 回避されます。 ftp(1) を走らせている共通プロセスは、 stdin と stdout 用に ふたつのパイプをオープンし、これらをその後の pkg_add コマンド (環境変数からファイル記述子を得ます) に渡します。 このコネクションの維持によって、複数のバイナリーパッケージの取得と インストールに、通常はただひとつのコネクションが使われます。

4) さらに依存関係について

NetBSD パッケージシステムで使われるワイルドカードは、シェルのグラブの スーパーセットになっています。現在、次のものに対応しています:

たとえば、 "pkg_info -e 'foo>=1.3'" は "foo" パッケージの 1.3 以降の バージョンが該当します。 これらのワイルドカードは、インストールされたパッケージの検出や、 依存するバイナリーパッケージの探索に使われるだけではありません。 ワイルドカードはまた、パッケージの衝突の検出にも使うことができます (実際使われています) 。 これは、ファイル名や機能の重複などにより 同時にインストールすべきではない二つのパッケージを使う事態を回避するためです。

ワイルドカードの別の用途として、 pkg_info や pkg_delete に バージョンなしのパッケージ名だけが与えられた場合、自動的に "-*" を 補完してインストール済みのパッケージを調べるというものがあります。 これにより、若干のキーストロークの節約ができ、さらに重要なことには、 どのバージョンがシステムにインストールされているかを知っておく必要が なくなります。

5) その他、 NetBSD パッケージシステムでの変更点

1997 年中ごろに NetBSD に pkg_* が FreeBSD からとり入れられて以来、 ツールの拡張のためにいくつかの変更が加わりました。興味深いものを いくつか掲げます:

下記は NetBSD パッケージシステムに関して名前を挙げるに値する人たちです。 彼らのおかげで今日のシステムがあるのです:


さらなる情報:


(c) Copyright 20000110 Hubert Feyrer <hubertf@NetBSD.org>
$NetBSD: pkg-wildcards.html,v 1.1 2007/06/09 11:34:49 dsieger Exp $