PKG_CREATE(1)

名称
pkg_create - ソフトウェア配布 package を作成するプログラム

書式
pkg_create [-YNOhjvyz] [-P pkgs] [-p prefix] [-f contents] [-i iscript] [-I piscript] [-k dscript] [-K pdscript] [-r rscript] [-s srcdir] [-t template] [-X excludefile] [-D displayfile] [-m mtreefile] [-o originpath] -c comment -d description -f packlist pkg-filename pkg_create [-YNhvy] -b pkg-name [pkg-filename]

解説
この pkg_create コマンドは、package 展開/情報プログラムに渡される package (訳注: FreeBSD の package system におけるパッケージを指す場合にこう表記します) を作成します。 package 作成のために入力する説明とコマンドライン引数 は本来人間が生成することを意図していませんが、 そうすることも簡単にできます。 自力でどうにかすることも可能ですが、作成にはフロントエンドツールを 用いた方がいいでしょう。 とはいうものの、入力書式の概略はこの文書に含まれています。

オプション
以下のコマンドラインオプションが提供されています:

-f packinglist
    ファイル packinglist から、もしくは packinglist が - (ダッシュ)であれば stdin から、package 用の “packing list” を取得します。

-c  [-]desc ファイル desc から、もしくは先頭が - で始まっていれば引数自身から、package の “一行説明” を取得します。 この文字列は、package が提供するもののバージョンを知る 手がかりとなるべきです。

-d  [-]desc ファイル desc から、もしくは先頭が - で始まっていれば引数自身から、package の長い説明を取得します。

-Y  質問に対してのデフォルトの回答を `Yes' とします。

-N  質問に対してのデフォルトの回答を `No' とします。

-O  `packing list Only' モードに移行します。 これは FreeBSD Ports Collection のための特別な修正であり、port がインストールされる時の `fake pkg_add' を行うために用いられます。 このような場合には、調整された最終的な packing list が どのようなものになるかを知る必要があるのです。

-v  饒舌な出力に切り替えます。

-h  tar がシンボリックリンクをたどるようにします。 この結果、リンク自身ではなくリンク先のファイルが出力されます。

-i iscript
    package のインストール前手続きとして iscript を用います。 これは実行可能なプログラム (もしくはシェルスクリプト) なら なんでも構いません。 これは package がインストールされる時に自動的に起動されます。 その際、package 名が第 1 引数として渡されます。

    注: -I オプションが指定されない場合、 本スクリプトは当該 package の pre-install および post-install の両方のスクリプトとして動作します。 package 名の後にキーワード PRE-INSTALL および POST-INSTALL をそれぞれ渡すことにより、機能を切り替えることになります。

-I piscript
    package のインストール後手続きとして piscript を用います。 これは実行可能なプログラム (もしくはシェルスクリプト) なら なんでも構いません。 これは package がインストールされる時に自動的に起動されます。 その際、package 名が第 1 引数として渡されます。

-C conflicts
    初期の package 衝突リストとして conflicts を用います。 これは、空白で区切った package 名のリストとみなされ、 packing list 中で複数の @conflicts ディレクティブを指定する手っ取り早い方法でもあります (後述の PACKING LIST 詳細 節を参照してください)。

-P pkgs
    初期の package 依存リストとして pkgs を用います。 これは空白で区切られた package の名前となります。 また、packing list (後述の PACKING LIST 詳細 セクションを参照) 内の複数の @pkgdep ディレクティブを指定する手っ取り早い方法でもあります。 pkgs リストの各引数は pkgname[:pkgorigin] という書式です。 省略可能な pkgorigin 要素は、リストからの各依存の起源を表し、 pkgname と共に @comment ディレクティブを使用して packing list 中に記録されます。

-p prefix
    package のファイルを選択する際に “基準” となる初期ディレクトリとして prefix を用います。

-k dscript
    package のアンインストール手続きとして dscript を用います。 これは実行可能なプログラム (もしくはシェルスクリプト) なら なんでも構いません。 これは package がアンインストールされる時に自動的に起動されます。 その際、package 名が第 1 引数として渡されます。

    注: -K オプションが指定されない場合、 本スクリプトは当該 package の de-install および post-deinstall の両方のスクリプトとして動作します。 package 名とともにキーワード DEINSTALL および POST-DEINSTALL をそれぞれ渡すことにより、機能を切り替えることになります。

-K pdscript
    package のアンインストール後手続きとして pdscript を用います。 これは実行可能なプログラム (もしくはシェルスクリプト) なら なんでも構いません。 これは package がアンインストールされる時に自動的に起動されます。 その際、package 名が第 1 引数として渡されます。

-r rscript
    package の “requirements” 手続きとして rscript を用います。 これは実行可能なプログラム (もしくはシェルスクリプト) なら なんでも構いません。 これはインストール時、アンインストール時に自動的に起動され、 インストール、アンインストールを継続するべきかどうかを決定するのに 用いられます。 インストールとアンインストールを区別するために、キーワード INSTALL と DEINSTALL がそれぞれ、package 名と共に渡されます。

-s srcdir
    package 作成中に srcdir は、 @cwd の値に優先します。

-t template
    mktemp(3) への入力として template を用います。 これはデフォルトでは /tmp/instmp.XXXXXX という文字列ですが、 /tmp ディレクトリの容量が制限されているような状況では 変更する必要があるかもしれません。 mktemp(3) が一意の ID を用いるために必要な `X' の文字をいくつか残しておく ことを忘れないでください。

-X excludefile
    最終的に package を作成する際に、 excludefile を tar に -exclude-from 引数として渡します。 このオプションを使うにあたっての詳しい情報は、 tar のマニュアルページ (もしくは --help 引数を付けて tar を実行) を参照してください。

-D displayfile
    package をインストールした後にファイルを (連結して標準出力へ) 表示します。 「ほとんど free なソフトウェア」などにおいて、 法的な通知のようなものなどに便利でしょう。

-m mtreefile
    package がインストールされる前に、mtreefile を入力として mtree(8) を実行します。mtree は mtree -u -f mtreefile -d -e -p prefix として起動されます (ただし prefix は @cwd ディレクティブにより名付けられた最初のディレクトリの名前)。

-o originpath
    originpath を、 FreeBSD Ports Collection 中で package が作成された場所として記録します。 この書式は、 MASTERCATEGORY/PORTDIR であるべきです。

-j  package の tarball を圧縮するために、 bzip2(1) ユーティリティを gzip(1) の代りに使用します。 最終的なアーカイブの書式が、認識可能なサフィックスによって pkg-filename で明示的に指定されている場合、本オプションは無効であることに注意してください。 現在 pkg_create は、次のサフィックスを認識します: .tbz, .tgz, .tar 。

-y  互換性のための、 -j の同義語です。

-z  package の tarball を圧縮するために、 gzip(1) ユーティリティを使用します。

-b pkg-name
    pkg-name という名前でローカルにインストールされた package から、 package ファイルを作成します。 pkg-filename が指定されない場合、最終的なアーカイブはカレントディレクトリに作成され、 pkg-name に対して伸長用の適切なサフィックスが付いた名前となります。

PACKING LIST 詳細
“packing list” の書式 ( -f を参照) は単純で、package に含めるファイル名を一行につきひとつずつ 並べたものにすぎません。 どこにインストールされるかわからない package に対して絶対パスを 用いるのは一般的に悪い方法なので、 どこにインストールされることを想定しているのか、 そしてどんな ownership と mode を伴ってインストールされるべきなのか (こちらはオプション) を指定する方法が用意されています。 これは packing list 内に一連の特殊コマンドを 埋め込むことで実現されています。以下に簡単に示します:
@cwd directory
    内部のディレクトリポインタが directory を指すようにします。以降のファイル名はこのディレクトリへの相対パス であるとみなされます。 注: @cd はこのコマンドの別名です。
@srcdir directory
    「作成時のみ」の内部ディレクトリポインタを directory に設定します。 package 作成時に @cwd に優先すると言えますが、展開時にはこれはあてはまりません。
@exec command
    展開処理の一環として command を実行します。 command が以下の文字列を含んでいた場合、その場で置換されます。 以下の例では @cwd が /usr/local と設定されていて、最後に展開されたファイルが bin/emacs だったとしています。
    %F  最後に展開されたファイル名に置換されます。この例では bin/emacs となります。
    %D  @cwd で設定されたカレントディレクトリプレフィックスに置換されます。 この例では /usr/local になります。
    %B  完全な (フルパスの) ファイル名の “basename” へ置換されます。 これはカレントディレクトリプレフィックスに最後の filespec を 加え、末尾のファイル名部分を除いたものです。 この例では、 /usr/local/bin になります。
    %f  完全な (フルパスを含む) ファイル名の “filename” 部分へ置換されます。 %B と対応していて、この例では emacs となります。
@unexec command
    アンインストール処理の一環として command を実行します。特別な % 文字列の置換は @exec と同様です。 このコマンドは @exec のように package を加える際に実行されるのではなく、package が 削除されるときに実行されます。 これは、package を加えるときに作られたリンクや他の 付随ファイル (package の内容一覧に記されているファイルは自動的に 削除されるので除く) を削除するのに便利です。 アンインストールスクリプトよりも @unexec を用いる方が有利な点は、どこにインストールされているかわからない ( -p を参照) ファイルの場所を得るのに “特殊文字列置換” を用いることが 可能なことです。
@mode mode
    この後で展開されるすべてのファイルのデフォルトの許可属性を mode に設定します。 書式は chmod コマンドで用いられているものと同じです (というよりも、そのまま 渡されています)。 引数無しで用いると、デフォルトの (展開) 許可属性に戻します。
@option option
    内部用 package オプションを設定します。 現在二つのオプションのみがサポートされています。 ひとつは extract-in-place で、これは pkg_add コマンドに package の tarball を staging area に展開せずに、目的の階層に直接展開するよう指示します (これは主に配布物や他の特殊な package などに用いられます)。 もうひとつは preserve で、存在するファイルを別の所に保存しておくよう pkg_add に指示します (これらは pkg_delete の時に復活しますが、自分の責任で行ってください)。
@owner user
    この後で展開されるすべてのファイルのデフォルトの ownership を user に設定します。 引数無しで用いると、デフォルトの (展開) ownership に戻します。
@group group
    この後で展開されるすべてのファイルのデフォルトの group ownership を group に設定します。 引数無しで用いると、デフォルトの (展開) group ownership に戻します。
@comment string
    packing list 内にコメントを埋め込みます。 誰かが後で間違えてしまうかもしれない特に厄介な部分を説明しようとする 場合に便利です。
@ignore
    特殊な目的に使われるファイルなどのため、展開時に次のファイルを 無視する (どこにもコピーしない) ように、内部で用いられます。
@ignore_inst
    @ignore と同様ですが、次のファイルを無視するのは一評価サイクルだけ 遅らせられます。 このおかげでこのディレクティブを packinglist ファイル内で用いることが可能になるので、インストーラが 無視するような、インストールスクリプトなどのための特殊な データファイルを、配布物内に入れることができるようになります。
@name name
    package の名前を設定します。 これは必須項目であり、通常先頭に置かれます。 この名前は package が提供するファイルの名前とは異なる可能性があり、 後でアンインストールする時のために package の記録を残しておくのに使われます。 名前が指定されなかった場合には、 pkg_create は package 名から推定し、自動的に設定することに注意してください。
@dirrm name
    ディレクトリ name がアンインストール時に削除されるよう宣言します。デフォルトでは、 package のインストール時に作成されたディレクトリは アンインストール時には削除されませんが、このディレクティブは明示的な ディレクトリ削除方法を提供します。 このディレクティブは package リストの最後で用いるようにしてください。 一つ以上の @dirrm ディレクティブが指定された場合、指定された順番に削除されます。 name は空きディレクトリでなければ削除されません。
@mtree name
    name を、インストール時に用いられる mtree(8) への入力ファイルとして宣言します (上述の -m を参照)。最初にひとつだけ @mtree ディレクティブを指定することが推奨されます。
@display name
    name を、インストール時に表示されるファイルとして宣言します (上述の -D を参照)。
@pkgdep pkgname
    package pkgname に依存することを宣言します。 package pkgname はこの package がインストールされる前にインストールされていなければ ならず、またこの package は package pkgname がアンインストールされる前にアンインストールされなければなりません。 package が複数の package に依存する場合には、複数の @pkgdep ディレクティブが用いられます。
@conflicts pkgcflname
    pkgcflname package との衝突を宣言します。 これは、ふたつの package が同じファイルへの参照を持ち、 同一システムに共存できないことが理由です。

環境変数
環境変数 PKG_TMPDIR で、 pkg_create が作業用ファイルの生成を試みるディレクトリの名前を指定します。 PKG_TMPDIR が設定されていない場合、 TMPDIR で指定されたディレクトリが使用されます。 PKG_TMPDIR 、 TMPDIR ともに設定されていない場合は、組み込みのデフォルトディレクトリが 使用されます。

関連ファイル
/var/tmp
    環境変数 PKG_TMPDIR 、 TMPDIR がともに設定されていない場合の作業用ディレクトリ。
/tmp
    /var/tmp が存在しない場合の、その次の選択肢。
/usr/tmp
    /tmp が適切でない場合の、最後の選択肢。

関連項目
pkg_add(1), pkg_delete(1), pkg_info(1), pkg_version(1), sysconf(3)

歴史
pkg_create コマンドは FreeBSD で最初に登場しました。

作者
Jordan Hubbard

協力者
John Kohl <jtk@rational.com>

バグ
package が展開される際にハードリンクを保存しておくために、 配布物のファイル間でのハードリンクは @cwd ディレクティブで括られていなければなりません。 その上、実行時の引数の長さの制限 (これは sysconf(_SC_ARG_MAX) により返される値に依存します) のために、それらのハードリンクは単一の tar 実行内で行われなければなりません。

バグは他にもあるはずです。