Chapter 15. pkginstall の枠組

Table of Contents

15.1. インストール用のプレフィックス以外の場所にあるファイルとディレクトリー
15.1.1. ディレクトリーの操作
15.1.2. ファイルの操作
15.2. 設定ファイル
15.2.1. PKG_SYSCONFDIR はどのように設定されるか
15.2.2. ソフトウェアに設定ファイルの置き場所を教える
15.2.3. インストールの過程を修正する
15.2.4. 設定ファイルの処理をしないようにする
15.3. システム起動スクリプト
15.3.1. システム起動スクリプトの処理をしないようにする
15.4. システムユーザーとグループ
15.5. システムシェル
15.5.1. シェルの登録をしないようにする
15.6. フォント
15.6.1. フォントデータベースの自動更新をしないようにする

本章では、pkginstall の枠組について説明します。 主な機能は以下のとおりです。

以下の各節では、上述の各機能について詳しく見てゆきます。

本章で説明する機能の多くは、パッケージのインストール後のターゲット (post-install) を使うだけで簡単に実現できるのではないか、 とお思いになるかもしれませんが、それは正しくありません。 このターゲットのコードは、パッケージをソースから構築した場合しか実行されないからです。 バイナリーパッケージを使う場合は、(コード自体が利用できないので) このターゲットのコードでは何もできません。したがって、上述の各機能は、 pkginstall が自動生成するインストール用スクリプトでしか実現できないのです。

15.1. インストール用のプレフィックス以外の場所にあるファイルとディレクトリー

すでにご存知のとおり、PLIST ファイルには、 パッケージに属するファイルとディレクトリーの一覧が書かれています。 この一覧では、インストール用のプレフィックス (${PREFIX}) からの相対位置を使うため、 このディレクトリー以外の場所にあるファイルを書くことはできません (絶対パス名は使えません)。この制約がある一方で、 パッケージによってはそのような場所、たとえば ${VARBASE}${PKG_SYSCONFDIR} 以下にファイルをインストールする必要があります。 これをおこなう唯一の方法は、インストール時にインストール用のスクリプトを使って インストール対象のファイルを作成することです。

汎用のインストール用スクリプトは、 任意のコードを含めることのできるシェルスクリプトです。 実行するスクリプトを並べたリストを INSTALL_FILE 変数で与えます。 この変数の値は標準では INSTALL です。 パッケージの削除用としても、同様の変数があります (DEINSTALL_FILE: 標準の値は DEINSTALL)。 これらのスクリプトでは任意のコマンドを実行できるので、 ファイルシステム中のどこであってもファイルの作成や管理をすることができます。

以上のような汎用のインストール用スクリプトを使うことはおすすめしませんが、 特殊な事例では必要となることがあります。これらを使うべきでない理由のひとつは、 インストール用スクリプト内に不必要なコードや単純に誤ったコードが入っていないことについて、 利用者がパッケージ作成者を信頼する必要があるということです。 また、以前は、同じ機能のために同様のコードがたくさん使われており、 それらに共通するエラーを修正する場合は、 同様のコードをすべて探して変更する必要がありました。

pkginstall の枠組では、これとは異なる標準化された方法を提供します。 パッケージの Makefile で設定された変数にもとづき、 インストール対象のファイルやディレクトリーを操作するための汎用のスクリプトを提供します。 以下、本節では、この用途で使う変数を説明します。

15.1.1. ディレクトリーの操作

以下の変数は、ファイルシステムの任意の場所へディレクトリーを作成するために、 設定することができます。

  • MAKE_DIRSOWN_DIRS は、 インストール用スクリプトが作成したり、 削除を試みたりする対象のディレクトリーのリストを値として持ちます。 両変数の違いは、後者はアンインストール時に (空でなかったために) 削除できなかった各ディレクトリーを削除するよう管理者に対してうながしますが、 前者はそうしないことです。

  • MAKE_DIRS_PERMSOWN_DIRS_PERMS は、インストール用スクリプトが作成したり、 削除しようとしたりする対象のディレクトリーについて記述したタプルのリストを値として持ちます。 各タプルは、ディレクトリー名、所有者、所有グループと、 数字で表したモードの値をスペースで区切ったものからなります。 たとえば以下のようになります。

    MAKE_DIRS_PERMS+=         ${VARBASE}/foo/private ${ROOT_USER} ${ROOT_GROUP} 0700
    

    両変数の違いは、PERMS のつかない変数の違いとまったく同じです。

15.1.2. ファイルの操作

インストール用プレフィックス以外の場所に空でないファイルを作ることは、やりにくいことです。 なぜなら PLIST は全ファイルをインストール用プレフィックス内にあるものとして扱うからです。 この問題に対する唯一の解決策は、インストールの際に、 ファイルをいったん既知の場所 (つまり、インストール用プレフィックス内) に展開し、それを本来の場所にコピーすることです (pkginstall が生成するインストール用スクリプトがおこないます)。 以下、インストール用プレフィックス以外の場所のファイルを自動的かつ首尾一貫して扱うために使える変数について説明しますが、 ここではプレフィックス内にいったん展開したファイルのことを原本ファイル (master file) ということにします。

  • CONF_FILESREQD_FILES は、 原本ファイルとコピー先ファイルの組のリストを値として持ちます。 インストール時に、コピー先ファイルが存在しなかった場合に限って、 原本ファイルがコピー先ファイルにコピーされます。アンインストール時は、 コピー先ファイルがインストールにおいて変更されていなければ、 コピー先ファイルが削除されます。

    両変数の違いは、後者はアンインストール時に (空でなかったために) 削除できなかった各ファイルを削除するよう管理者に対してうながしますが、 前者はそうしないことです。

  • CONF_FILES_PERMSREQD_FILES_PERMS は、 原本ファイルとコピー先ファイルについて記述したタプルのリストを値として持ちます。 各タプルは、ファイル名のほか、両ファイルの所有者、所有グループと、 数字で表したパーミッションを、この順番で指定します。 たとえば以下のようになります。

    REQD_FILES_PERMS+= ${PREFIX}/share/somefile ${VARBASE}/somefile ${ROOT_USER} ${ROOT_GROUP} 0700
    

    両変数の違いは、PERMS のつかない変数の違いとまったく同じです。

15.2. 設定ファイル

(個々のパッケージの) 設定ファイルは、パッケージに固有のディレクトリー PKG_SYSCONFDIR にインストールされ、また、 インストール時には特別扱いが必要である (ほとんどのことは、pkginstall で自動化されています) という点で、特別です。主に心がける必要があることは、 設定ファイルであるとされたファイルは、インストール時に、 そのファイルがもともと存在しなかった場合に限って、 正しい場所 (PKG_SYSCONFDIR 以下のどこか) に自動的にコピーされるということです。同様にして、 設定ファイルにローカルな変更が加わっている場合には、 アンインストール時に削除されません。こうすることで、 管理者が独自に変更をおこなっても、その変更が失われることがないようにしています。

15.2.1. PKG_SYSCONFDIR はどのように設定されるか

前述のとおり、PKG_SYSCONFDIR 変数は設定ファイルのインストール先を指定します。この変数の値は、 以下の各変数をもとに設定されます。

  • PKG_SYSCONFBASE: 設定ディレクトリーのルートです。 指定しなかった場合は ${PREFIX}/etc となりますが、 利用者は好みの場所 (たとえば、 /etc, /etc/pkg など) を指すよう上書きすることもできます。 パッケージがこの変数を直接使うことはできません。

  • PKG_SYSCONFSUBDIR: PKG_SYSCONFBASE のサブディレクトリーで、 構築されたパッケージ用の設定ファイルはこの下に置かれます。 この変数は、パッケージの Makefile で定義された場合にのみ意味を持ちます (つまり、 利用者がカスタマイズすることはできません)。

    例としては、Apache のパッケージ www/apache2 をご覧ください。Apache では、設定ファイルを PKG_SYSCONFBASE のサブディレクトリー httpd/ に置いています。この変数は、パッケージの Makefile で設定します。

  • PKG_SYSCONFVAR: このパッケージの設定ディレクトリー (PKG_SYSCONFBASE と異なる場合) を保持する変数の名前を指定します。 指定しなかった場合は、PKGBASE の値となります。 また、常に PKG_SYSCONFDIR が前につきます。

  • PKG_SYSCONFDIR.${PKG_SYSCONFVAR}: PKG_SYSCONFVAR で区別されるパッケージの設定ファイルをどのディレクトリーに置くかを保持します。

以上の各変数をもとに、pkginstall は PKG_SYSCONFDIR の値を決めます。パッケージが設定ディレクトリーを参照するには、 この PKG_SYSCONFDIR 変数だけを使うことができます。 この値の設定に使われるアルゴリズムは、 基本的には以下のとおりです。

  1. PKG_SYSCONFDIR.${PKG_SYSCONFVAR} が設定されている場合は、 この値が使われます。

  2. 前項の変数は定義されていないが、 PKG_SYSCONFSUBDIR がパッケージの Makefile で設定されている場合は、 ${PKG_SYSCONFBASE}/${PKG_SYSCONFSUBDIR} が使われます。

  3. 以上の場合以外は、 ${PKG_SYSCONFBASE} に設定されます。

なお、${PKG_SYSCONFDIR} は自動的に OWN_DIRS に追加されることを断っておきます。この意味については、Section 15.1.1, “ディレクトリーの操作”をご覧ください。 ただし、${PKG_SYSCONFDIR} のサブディレクトリーは追加されませんので、 OWN_DIRS または MAKE_DIRS を使って作成する必要があります。

15.2.2. ソフトウェアに設定ファイルの置き場所を教える

pkgsrc (とユーザーも) が、設定ファイルを既知の場所に置くことを前提としている場合は、 設定ファイルをインストールする場所を各パッケージに教えてやる必要があります。 場合によっては、パッケージの Makefile を修正する必要があります。 この修正は、運がよければ、 コンフィギュレーションスクリプトに渡すフラグを追加する程度ですみます。 これは、GNU Autoconf が生成したファイルの場合が該当します。

CONFIGURE_ARGS+= --sysconfdir=${PKG_SYSCONFDIR}

なお、ここで指定しているのは、 パッケージが設定ファイルを探す必要のある場所であって、 設定ファイルのもともとのインストール先ではありません (困った事に、 両者ははっきり区別できませんが)。

15.2.3. インストールの過程を修正する

前述のとおり、pkginstall は設定ファイルを自動的に処理します。 つまり、パッケージ本体側では、 ${PKG_SYSCONFDIR} の内容を直接いじってはいけない ことになります。まずいことに、多くのソフトウェアのインストール用スクリプトは、 そのまま実行すると、このディレクトリーの内容に手を加えてしまいます。では、 この問題を適切に直すにはどうすればいいのでしょうか?

パッケージに対して、すべての設定ファイルを examples 階層 share/examples/${PKGBASE}/ 以下にインストールするように (ふつうは、手でパッチを当てて) 指示する必要があります。こうすると、 PLIST はこれらを登録します。 また、管理者はインストールされたままの設定ファイルを常に使うことができます。

必要な設定ファイルを適切な場所 (つまり、examples 階層の下) に置けば、 pkginstall の枠組は、このファイルを、パッケージのインストール時に ${PKG_SYSCONFDIR} 以下のファイルを更新するための原本として使うことができます。これをおこなうために、 CONF_FILES および CONF_FILES_PERMS の各変数が使われます。この各変数の書式と使い方は、 Section 15.1.2, “ファイルの操作”でご確認ください。 mail/mutt パッケージから抜粋した例を以下に掲げます。

EGDIR=        ${PREFIX}/share/doc/mutt/samples
CONF_FILES=   ${EGDIR}/Muttrc ${PKG_SYSCONFDIR}/Muttrc

なお、EGDIR 変数は当該パッケージに特有のものであって、 それ以外では意味を持たないことに注意してください。

15.2.4. 設定ファイルの処理をしないようにする

設定ファイルの自動コピーは、パッケージをインストールする前に環境変数 PKG_CONFIG を設定しておけば、 おこなうかどうかを切替えることができます。

15.3. システム起動スクリプト

システムの起動スクリプトは、OS ごとに決まった場所にインストールする必要があり、 その場所はたいていインストール用のプレフィックス以外の場所にある、という点で、 特別なファイルです。したがって、Section 15.1, “インストール用のプレフィックス以外の場所にあるファイルとディレクトリー”で説明したのと同じ方法を適用して、 同じ解決法を使うことができます。ただし、 pkginstall では起動スクリプトの処理専用の仕組みを用意しています。

システムの起動スクリプトが附属するパッケージでは、 以下のことをおこなう必要があります。

  1. スクリプトに .sh サフィックスを付け加えて、 ${FILESDIR} 内に置きます。例としては、 files ディレクトリーに cupsd.sh がある print/cups パッケージをご覧ください。

  2. スクリプト名から拡張子を抜いたものを RCD_SCRIPTS 変数に追加して、pkginstall がこのスクリプトを処理するようにします。 前出の例では以下のようになります。

    RCD_SCRIPTS+=   cupsd
    

以上のことをおこなえば、pkginstall は各スクリプトに対して、 以下の手順を自動的におこないます。

  1. files ディレクトリー以下の各ファイルに対して、 FILES_SUBST 変数で示されている置換をすべて適用します。

  2. スクリプトを、files ディレクトリーから examples 階層 ${PREFIX}/share/examples/rc.d/ にコピーします。 なお、この原本ファイルは、PLIST に明示的に登録する必要があります。

  3. 起動スクリプトを examples 階層からシステム全体の起動スクリプト用ディレクトリーにコピーするためのコードを、 インストール用スクリプトに追加します。

15.3.1. システム起動スクリプトの処理をしないようにする

設定ファイルの自動コピーは、パッケージをインストールする前に環境変数 PKG_RCD_SCRIPTS を設定しておけば、 おこなうかどうかを切替えることができます。なお、起動スクリプトは常に examples 階層 ${PREFIX}/share/examples/rc.d/ にコピーされますが、これはこの変数値の影響を受けません。

15.4. システムユーザーとグループ

パッケージのインストール時に、特別なユーザーやグループを作成する必要がある場合、 pkginstall の枠組を使って作成することができます。

PKG_USERS 変数にユーザーのエントリーを追加すると、 ユーザーを作ることができます。各エントリーは、 以下のような書式となります。

user:group

ユーザーごとに変数を設定して、 ユーザーの属性をさらに詳しく指定することができます。 PKG_UID.user は、 ユーザーの数字の UID です。 PKG_GECOS.user は、 ユーザーの説明またはコメントです。 PKG_HOME.user は、 ユーザーのホームディレクトリーで、指定しなかった場合は /nonexistent となります。 PKG_SHELL.user は、 ユーザーのシェルで、指定しなかった場合は /sbin/nologin となります。

同様にして、PKG_GROUPS 変数にグループのエントリーを追加すると、 グループを作ることができます。こちらの書式は以下のようになります。

group

PKG_GID.group を定義すると、グループの数字の GID を設定することができます。

もっと前の段階でユーザーやグループを作る必要がある場合は、 どの相の直後にユーザーやグループを作るかを表すために、 USERGROUP_PHASEconfigure または build に設定することができます。 こうした場合は、作られるユーザーやグループの数字の UID や GID は、 自動的に最終的なインストール用スクリプトにハードコードされます。

15.5. システムシェル

パッケージがシステムシェルをインストールする場合は、管理者の手間を減らせるよう、 インストールしたシェルをシェルデータベース /etc/shells に登録するようにします。この登録は、どのシステム上でもバイナリーパッケージが機能するようにするため、 インストール用スクリプトでおこなう必要があります。pkginstall では、 このことを簡単に実現できる方法を用意しています。

パッケージがシェルインタープリターを提供する場合は、 PKG_SHELL 変数を、そのシェルの絶対ファイル名に設定する必要があります。 こうすると、インストール用スクリプトに、シェル登録処理用のフックを追加します。 shells/zsh から抜粋した例を以下に掲げますので、ご覧ください。

PKG_SHELL=      ${PREFIX}/bin/zsh

15.5.1. シェルの登録をしないようにする

シェルインタープリターの自動登録は、管理者が PKG_REGISTER_SHELLS 環境変数を NO に設定すれば、無効化することができます。

15.6. フォント

X11 フォントをインストールするパッケージでは、 各フォントディレクトリー内のフォントの索引であるデータベースファイルを更新することが必要になります。 この更新は、pkginstall の枠組内で簡単におこなうことができます。

パッケージが X11 フォントをインストールする時には、 フォントをインストールするディレクトリーを、 FONTS_DIRS.type 変数に列挙する必要があります。この type は、ttf, type1, x11 のいずれかです。 こうすると、指定した各ディレクトリーのフォントデータベースファイルを更新するコマンドを実行するフックが、 インストール用スクリプトに追加されます。 利便のため、このディレクトリーのパスが相対パスで指定した場合は、 パッケージのインストール用プレフィックスからの相対位置として扱われるようになっています。fonts/dbz-ttf から抜粋した例を以下に掲げますので、ご覧ください。

FONTS_DIRS.ttf= ${PREFIX}/lib/X11/fonts/TTF

15.6.1. フォントデータベースの自動更新をしないようにする

フォントデータベースの自動更新は、管理者が PKG_UPDATE_FONTS_DB 環境変数を NO に設定すれば、無効化することができます。