Chapter 13. PLIST 問題

Table of Contents

13.1. RCS ID
13.2. PLIST の半自動生成
13.3. make print-PLIST の出力を細工する
13.4. PLIST における各種の置換
13.5. マニュアルページの圧縮
13.6. PLIST_SRC を使って PLIST のソースを変更する
13.7. プラットフォーム別に異なるPLIST
13.8. 複数のパッケージでディレクトリーを共有する

PLIST ファイルは、パッケージの packing list (梱包明細) です。すなわち、 パッケージを構成するファイルの一覧 (インストール先である ${PREFIX} ディレクトリーからの相対位置) と、それに加えて、いくつかの追加情報 (完全な一覧は pkg_create(1) マニュアルページを参照) が載っています。 この章では、PLISTファイル (複数の場合もあります、以下を参照してください)を扱う場合に注意が必要な、 いくつかの特別な問題について述べます。

13.1. RCS ID

あなたが書いたすべてのPLISTファイルの先頭行にRCS IDが追加されていること を確認してください。

@comment $NetBSD$
    

13.2. PLIST の半自動生成

make print-PLISTコマンドを使って、パッケージの展開後に新しくできた全ファ イルにマッチするPLISTを出力することができます。このターゲットに関するさ らなる情報は、 Section 17.17, “他の役に立つターゲット”をご覧ください。

13.3. make print-PLIST の出力を細工する

*-dirs パッケージをSection 13.8, “複数のパッケージでディレクトリーを共有する”で説明したように 使った場合、make print-PLIST で、 実際の @dirrm 行のかわりに @comment が出力されることにお気づきかもしれません。 ここでディレクトリーやファイルを指定して、 実際に近い結果を出力させることもできます。 これはパッケージの更新の際に非常に 役立ちます。

PRINT_PLIST_AWK 変数を、 print-PLIST の出力をフィルターする AWK のパターンと動作の一式に設定します。 AWK スクリプト塊を好きなように 追加することができますが、 適切にクォートするよう注意してください。

たとえば、PLIST の結果から libdata/foo ディレクトリー内のファイルをすべて消すには、 以下のようにします。

PRINT_PLIST_AWK+=       /^libdata\/foo/ { next; }
    

また、特定の (共有) ディレクトリーを参照している @dirrm 行を @comment に変換するには、以下のようにします。

PRINT_PLIST_AWK+=       /^@dirrm share\/specific/ { print "@comment " $$0; next; }
    

13.4. PLIST における各種の置換

パッケージがシステムにインストールされる際に、 PLIST 内のいくつもの変数が自動的に置換されます。 置換される変数には、以下のようなものがあります。

${MACHINE_ARCH}, ${MACHINE_GNU_ARCH}

emacs、およびperlのようないくつかのパッケージは、それらが構築されたアー キテクチャーに関する情報を、インストールするファイルのパス名に埋め込みま す。このようなケースに対応するため、実際に使われる前に、PLISTに前処理が おこなわれます。そして、シンボル ${MACHINE_ARCH}は、uname -pの出 力でおきかえられます。 ${MACHINE_GNU_ARCH}がPLISTのどこかにうめこまれてい る場合も同様の事がおこなわれます。これは、GNU autoconfで作成された configureスクリプトを持つパッケージで使われます。

昔の話

$ARCHシンボルはuname -mの出力によって置きかえられていま した。しかし、もはやサポートされていませんし、削除されています。

${OPSYS}, ${LOWER_OPSYS}, ${OS_VERSION}

いくつかのパッケージでは、OS名とバージョンをいくつかのパス名に埋め込みま す。このような場合、PLISTで以下の各変数を使用してください。

  • ${OPSYS} - uname -sの出力

  • ${LOWER_OPSYS} - 共通名の小文字表記(例: solaris)

  • ${OS_VERSION} - uname -r

デフォルトで置換される値の全一覧は、 bsd.pkg.mk を参照してください (あわせて、 PLIST_SUBST を調べてください)。

上述以外の変数を置換したい場合は、 MESSAGE_SUBST (Section 11.5, “オプションのファイル”参照) と同様に、 以下のようにして、変数とその展開方法を定義することができます。

PLIST_SUBST+=   SOMEVAR="somevalue"
    

こうすると、PLIST 内のすべての ${SOMEVAR}somevalue で置き換えられます。

PLIST_VARS 変数を使うと、 条件に応じて PLIST の項目を追加することができます。 PLIST_VARS+=foo のように値を追加して、 これに対応する PLIST.foo 変数を yes に設定します。 このように設定すると、PLIST にある ${PLIST.foo}"" に置換されるようになります (設定していない場合は "@comment " に置換されます)。 たとえば、Makefile では以下のようにします。

PLIST_VARS+=	foo
.if condition
PLIST.foo=	yes
.else
    

こうしたうえで、PLIST では以下のようにします。

@comment $NetBSD$
bin/bar
man/man1/bar.1
${PLIST.foo}bin/foo
${PLIST.foo}man/man1/foo.1
${PLIST.foo}share/bar/foo.data
${PLIST.foo}@dirrm share/bar
    

13.5. マニュアルページの圧縮

もし、(bsd.own.mkに)MANZが設定されていれば、マニュアルページは圧縮形式で インストールされます。そうでなければ展開された形式でインストールされます。 PLISTファイルでこれをサポートするために、MANZMANCOMPRESSEDの設定の有 無に従い、.gzサフィックスがマニュアルページに自動的に追加、削除され ます。このPLISTファイルに対する変更は、PLIST自身にたいしてでなく、それが コピーされる時におこなわれます。

13.6. PLIST_SRC を使って PLIST のソースを変更する

ひとつ以上のファイルを、バイナリーパッケージを構築するためにPLISTのソース として使用する時は、それらのファイル名を変数PLIST_SRCに設定してください。こ れらのファイルは、後でcat(1)によって連結されます。連結の順番は重要です。 PLIST_SRC は、標準では ${PKGDIR}/PLIST になります。

13.7. プラットフォーム別に異なるPLIST

パッケージのなかには、インストールするファイルの組合せを、対象のオペレー ティングシステムによって変えるものがあります。このような差異は、以下のファ イルを使って自動的に処理することができます。

  • PLIST.common

  • PLIST.${OPSYS}

  • PLIST.${MACHINE_ARCH}

  • PLIST.${OPSYS}-${MACHINE_ARCH}

  • PLIST.common_end

13.8. 複数のパッケージでディレクトリーを共有する

共有ディレクトリーとは、複数の (かつ関連のない) パッケージがファイルをインストールするディレクトリーのことです。 以前は、共有ディレクトリーは、条件に応じた削除のために PLIST に特殊な細工をするか、 集権的な処理用パッケージを用意する必要があったので、 問題を起こすことがありました。

現在の pkgsrc では、話は単純になっています。 各パッケージは、必要に応じて、ディレクトリーを作成してファイルをインストールします。 pkg_delete は、パッケージのアンインストール後、 空のディレクトリーが残っていればすべて削除します。

パッケージの動作のために空のディレクトリーが必要な場合は、 インストール時に通常と同じようにディレクトリーを作成するようにし、 さらに PLIST に以下のような項目を追加します。

@pkgdir path/to/empty/directory