インストールしたシステムに必要なコンポーネントファイルを同じディレクトリ構造にまとめることから始めるのがもっとも簡単な方法です。
これを行う 2 つの方法は次のとおりです。
パッケージ化するソフトウェアがすでに tarball に入っている場合は、その tarball をサブディレクトリに解凍します。autoconf ユーティリティーを使用するオープンソースのソフトウェアパッケージの多くでは、目的のプロトタイプ領域を指すように DESTDIR 環境変数を設定すると、これが行われます。autoconf ユーティリティーは、pkg:/developer/build/autoconf パッケージで入手できます。
メイクファイル内の install ターゲットを使用します。
ソフトウェアがバイナリ、ライブラリ、およびマニュアルページで構成され、このソフトウェアを、mysoftware という名前の /opt 下のディレクトリにインストールするとします。このレイアウトにソフトウェアが表示されるディレクトリをビルド領域に作成します。次の例では、このディレクトリに proto という名前が付けられています。
proto/opt/mysoftware/lib/mylib.so.1 proto/opt/mysoftware/bin/mycmd proto/opt/mysoftware/man/man1/mycmd.1
pkgsend generate コマンドを使用して、この proto 領域のマニフェストを生成します。pkgfmt によって出力用パッケージマニフェストをパイプで連結して、そのマニフェストをより読み取りやすくします。詳細は、pkgsend(1) および pkgfmt(1) のマニュアルページを参照してください。
次の例では、proto ディレクトリは現在の作業用ディレクトリにあります。
$ pkgsend generate proto | pkgfmt > mypkg.p5m.1
出力用の mypkg.p5m.1 ファイルには次の行が含まれています。
dir path=opt owner=root group=bin mode=0755 dir path=opt/mysoftware owner=root group=bin mode=0755 dir path=opt/mysoftware/bin owner=root group=bin mode=0755 file opt/mysoftware/bin/mycmd path=opt/mysoftware/bin/mycmd owner=root \ group=bin mode=0644 dir path=opt/mysoftware/lib owner=root group=bin mode=0755 file opt/mysoftware/lib/mylib.so.1 path=opt/mysoftware/lib/mylib.so.1 \ owner=root group=bin mode=0644 dir path=opt/mysoftware/man owner=root group=bin mode=0755 dir path=opt/mysoftware/man/man1 owner=root group=bin mode=0755 file opt/mysoftware/man/man1/mycmd.1 path=opt/mysoftware/man/man1/mycmd.1 \ owner=root group=bin mode=0644
パッケージ化されるファイルのパスは、file アクションに 2 回出現します。
file という語のあとの最初の語は、proto 領域でのそのファイルの場所を表しています。
path= 属性のパスは、そのファイルがインストールされる場所を示しています。
この二重のエントリによって、proto 領域を変更しなくてもインストール場所を変更できます。この機能によって、別のオペレーティングシステムにインストールするように作られたソフトウェアを再パッケージ化する場合などに、かなりの時間を節約できる可能性があります。
pkgsend generate によってディレクトリの所有者とグループにデフォルト値が適用されていることに注意してください。/opt の場合、デフォルトは正しくありません。そのディレクトリはシステム上にすでに存在しているほかのパッケージによって配布されるので削除してください。そうすれば、/opt の属性がすでにシステム上に存在しているものと競合する場合、pkg(1) はそのパッケージをインストールしません。下記の 生成されたマニフェストに必要なメタデータを追加するでは、不要なディレクトリをプログラムで削除する方法を示しています。
ファイル名に等号 (=)、二重引用符 (")、または空白文字が含まれている場合、次の例に示すように、pkgsend は hash 属性をマニフェスト内に生成します。
$ mkdir -p proto/opt $ touch proto/opt/my\ file1 $ touch proto/opt/"my file2" $ touch proto/opt/my=file3 $ touch proto/opt/'my"file4' $ pkgsend generate proto dir group=bin mode=0755 owner=root path=opt file group=bin hash=opt/my=file3 mode=0644 owner=root path=opt/my=file3 file group=bin hash="opt/my file2" mode=0644 owner=root path="opt/my file2" file group=bin hash='opt/my"file4' mode=0644 owner=root path='opt/my"file4' file group=bin hash="opt/my file1" mode=0644 owner=root path="opt/my file1"
パッケージを発行するで説明しているように、そのパッケージが発行されると (Publish the Packageを参照)、ファイルアクション 属性の値はファイル内容の SHA-1 ハッシュになります。