Copyright © 1994-2007 The NetBSD Foundation, Inc
$NetBSD: pkgsrc.xml,v 1.26 2007/09/18 08:17:21 rillig Exp $
Abstract
pkgsrc は、Unix 風のオペレーティングシステム向けの、 集中管理型パッケージ管理システムです。この手引きでは、 pkgsrc の利用者向けと開発者向けの情報を掲載しています。 バイナリーおよびソースパッケージのインストール、 バイナリーおよびソースパッケージの作成から、 基盤についての高度な概観までを網羅しています。
Table of Contents
CFLAGS
を無視するパッケージがあるのはなぜ?Makefile
におけるプログラミングmk.conf
から利用者が設定可能な変数を捕まえる方法List of Tables
Table of Contents
Unix ベースのシステム向けの自由に使えるソフトウェアは数多くあり、 それらはたいていソースコード形式で提供されています。 このようなソフトウェアを使うためには、あらかじめ、ローカルシステム用の設定、 コンパイルおよびインストールをしておく必要がありますが、NetBSD パッケージコレクション (pkgsrc) はまさにこの作業をおこなってくれます。 このほか、pkgsrc にはバイナリーパッケージを扱うための基本的なコマンドがあるので、 各利用者が時間をかけて自分でパッケージを構築する必要はありません。
pkgsrc には現在、 以下のものをはじめ数千個のパッケージがあります。
www/apache
- Apache
web サーバー
www/firefox
- Firefox
web ブラウザー
meta-pkgs/gnome
- GNOME
デスクトップ環境
meta-pkgs/kde3
- K
デスクトップ環境
……などなど。
pkgsrc には、各対応プラットフォームについて、 pthreads や X11 のようなプラットフォームによって異なる依存関係や、 IPv6 対応のような拡張機能の処理が組み込まれています。
pkgsrc が提供する重要な機能は、以下のようなものです
ソフトウェアのソースからの構築のほか、バイナリーパッケージの作成および インストールが容易にできるようになります。ソースと最新のパッチを マスターサイトかミラーダウンロードサイトから取得し、チェックサムを検証してから、 あなたのシステムで構築をおこないます。 バイナリーのみ配布されているソフトウェアも、ネイティブプラットフォームと NetBSD でエミュレートされたプラットフォームの双方で利用可能です。
バイナリー、ライブラリー、マニュアルページ、その他の文書など、 すべてのパッケージは首尾一貫したディレクトリーツリーにインストールされます。
パッケージの依存関係は、パッケージ更新時も含め、 自動的に解決されます。更新の際には、 さまざまなパッケージの設定ファイルが自動的に処理され、 ローカルな変更点は保持されます。
NetBSD と同様、 pkgsrc は移植性を意図して設計されており、 高い移植性を持つコードでできています。これにより、 新しいプラットフォームへの移植は、きわめて迅速な開発が可能です。 この移植性はまた、 pkgsrc を 全プラットフォームの間で一貫したものにしています。
膨大な数のパッケージに対する、インストール先、 受け入れ可能なソフトウェアライセンス、国際版の暗号が必要か、 および構築時オプションは、 すべて単一の設定ファイルで管理されます。
完全なソース (ソフトウェアの配布ファイルは含みません) は、 BSD ライセンスの下で自由に使用できますので、必要に応じて pkgsrc の拡張や改造ができます。そのままでローカルパッケージやパッチに 対応しているので、あなたの環境に合わせて設定することができます。
pkgsrc では、以下の思想が基礎となっています。
“正しいもののみが動くべき。”
— これは、パッケージにバグがある場合に、
パッケージをただインストールして、それがうまく動くよう祈るよりも、
バグを見つけて、そのことを訴えるほうがよいということです。
pkgsrc には、そのようなバグを見つけるために、
静的な分析ツール (pkgtools/pkglint
)、構築時の検査 (シェルスクリプトの移植性)や、
インストール後の検査 (インストールされたファイル、
共有ライブラリーの参照、スクリプトインタープリター) といった、
多数の検査が用意されています。
“動くものは、どこででも動くべき” — NetBSD が多くのハードウェアアーキテクチャーに移植されているのと同様に、 pkgsrc は多くのオペレーティングシステムに移植されています。 すべてのプラットフォームでパッケージが同じように動くように注意が払われています。
pkgsrc には、 これらのオペレーティングシステム用のソース配布およびバイナリー配布の両形態があります。 必要なソースまたはバイナリーを取ってくれば、 すぐに pkgsrc で作業を始めることができます。
pkgsrc は FreeBSD の ports システムから派生したもので、 はじめは NetBSD 専用として開発されていました。その後、 pkgsrc は大きく成長し、現在では以下のプラットフォームに対応しています。
Table 1.1. pkgsrc が対応しているプラットフォーム
プラットフォーム | 対応した日 |
---|---|
NetBSD | 1997 年 8 月 |
Solaris | 1999 年 3 月 |
Linux | 1999 年 6 月 |
Darwin (Mac OS X) | 2001 年 10 月 |
FreeBSD | 2002 年 11 月 |
OpenBSD | 2002 年 11 月 |
IRIX | 2002 年 12 月 |
BSD/OS | 2003 年 12 月 |
AIX | 2003 年 12 月 |
Interix (Microsoft Windows Services for Unix) | 2004 年 3 月 |
DragonFlyBSD | 2004 年 10 月 |
OSF/1 | 2004 年 11 月 |
HP-UX | 2007 年 4 月 |
Haiku | 2010 年 9 月 |
このドキュメントは三部に別れています。第一部は pkgsrc 利用者向けの手引きで、パッケー ジコレクションの一つのパッケージを使う方法を、コンパイル済みのバイナリー パッケージのインストールと、自分自身でコピーしたNetBSDパッケージシステムか ら構築する方法の両方で説明します。第二部の pkgsrc 開発者向けの手引き は、他 のNetBSDユーザーがその構築の詳細について知らなくても簡単にパッケージを構築 できるようにするために、パッケージを用意する方法を説明します。第三部の pkgsrc 基盤の内部 は、pkgsrc がどのように実装されているかを理解したい方のためのものです。
ここまでですでに“ポート(ports)”、 “パッケージ(packages)”などについて何度も触れています。 ここで、このドキュメント中に使われている用語を説明します。
ファイルのセットで、pkgsrc を使用したソフトウェアを構築
するのに必要なことが記述された構築手順書です。パッケージは、伝統的に
/usr/pkgsrc
の下に置かれます。
“pkgsrc” の旧名です。これは NetBSD オペレーティングシステムの一部分ですが、 NetBSD 以外のオペレーティングシステムでも NetBSD 同様に使えるようにすることができます。 パッケージの構築 (コンパイル)、インストール、および削除を扱います。
この用語は、ソフトウェアの作者が、彼の仕事を配布するため
に提供しているファイルのことを指しています。NetBSDで構築するのに必要な全
ての変更は、対応するパッケージに反映されます。通常distfileは、圧縮された
tarアーカイブ形式ですが、他の形式でも使用できます。distfileは通常は
/usr/pkgsrc/distfiles
の下に保存されます。
これはFreeBSDやOpenBSDの人たちが、 私たちがパッケージ(package)と呼んでいるものを表 すために使われている用語です。NetBSDでは“ポート(port)”は、異なるアーキ テクチャーを参照する用語となります。
pkgsrc を使ってdistfileより作成されたバイナリーのセット
で、ひとつの.tgz
ファイルに集められています。これはリコンパイルなしに同じ
マシンアーキテクチャーのマシンにインストールすることができます。パッケー
ジは通常は/usr/pkgsrc/packages
に生成され、それ
は
ftp.NetBSD.orgにもアーカイブされています。
時々、これは、特にコンパイル済みのパッケージの文脈で、単に“パッケージ” と表されることもあります。
対応するパッケージが、distfileにあるファイルから作成した、インストールさ れるべきソフトウェアのひとまとまりです。
pkgsrc 利用者とは、pkgsrc で提供されているパッケージを使う人たちです。 ふつうはシステム管理者のことです。パッケージを構成するソフトウェアを使う人たち (“末端利用者” ということがあります) については、 the pkgsrc guide では対象としません。
pkgsrc 利用者には二通りあります: 一方は、 構築済みバイナリーパッケージをインストールしたいだけの人たちです。 もう一方は、pkgsrc のパッケージをソースから構築する人たちで、 こちらは、そのままインストールすることが目的の場合と、 バイナリーパッケージ自体を構築することが目的の場合があります。 pkgsrc 利用者にとって必要なことはすべて、Part I, “pkgsrc 利用者向けの手引き” に書いてあるはずです。
パッケージメンテナーは、Part II, “pkgsrc 開発者向けの手引き” で説明されているようにパッケージを作成する人です。
mk/
ディレクトリー以下にある各ファイルに携わる人たちです。
Part III, “pkgsrc 基盤の内部” を通しで読む必要があるのは、この人たちだけのはずです
(基盤開発者以外の人が興味を持つこともあるでしょうが)。
Table of Contents
CFLAGS
を無視するパッケージがあるのはなぜ?Table of Contents
ファイルをダウンロードして展開する前に、
ファイルを展開する場所を決めておく必要があります。
pkgsrc を root ユーザーとして使う場合、pkgsrc は通常は
/usr/pkgsrc
にインストールされます。
ソースおよびバイナリーパッケージは、
ファイルシステム中のどこでも好きな場所にインストールしてかまいませんが、
シェルその他のプログラムにとって特別な意味を持つスペースなどの文字は、
パス名に含めてはいけません。
アルファベット、数字、下線とダッシュだけを使うのが安全な方法です。
pkgsrc のファイルをダウンロードする前に、
current 枝と stable
(安定版) 枝のどちらを使うのかを決めます。
後者は、current 枝から四半期ごとに分岐するもので、
セキュリティー上の更新に限って修正されます。
stable 枝の名前は、年と四半期を組み合わせたもので、たとえば
2009Q1
となります。
次に、pkgsrc をどの方法で ダウンロードするかを決めます。方法としては、tarファイル、 CVS経由があります。ここでは両方とも説明します。
pkgsrc のあらゆるファイルの一次配布元は ftp://ftp.NetBSD.org/pub/pkgsrc/ です。 目的別に多数のサブディレクトリーがありますが、 それについては Appendix C, pkgsrc FTP サーバーのディレクトリー配置 で詳しく説明しています。
current 枝の tar ファイルは、
current
ディレクトリー内にあり、ファイル名は pkgsrc.tar.gz
です。
このファイルは、毎日、自動生成されます。
安定版の 2009Q1 枝の tar ファイルは、
pkgsrc-2009Q1
ディレクトリー内にあり、ファイル名は同じく pkgsrc-2009Q1.tar.gz
です。
安定版 pkgsrc の tarball をダウンロードするには、以下のコマンドを実行します。
$
ftp ftp://ftp.NetBSD.org/pub/pkgsrc/
pkgsrc-20xxQy
/pkgsrc-20xxQy
.tar.gz
ここで、pkgsrc-20xxQy
は、
ダウンロードする安定版の枝名にします。たとえば、
“pkgsrc-2009Q1” になります。
ダウンロードしたら、以下のようにして展開します。
$
tar -xzf
pkgsrc-20xxQy
.tar.gz -C /usr
こうすると、/usr/
に
pkgsrc/
ディレクトリーが作られ、
/usr/pkgsrc/
以下に全パッケージのソースが置かれます。
pkgsrc-current をダウンロードするには、以下のコマンドを実行します。
$
ftp ftp://ftp.NetBSD.org/pub/pkgsrc/current/pkgsrc.tar.gz
pkgsrc の stable 枝名を指定して取得するためには、以下のコマンドを実行します。
$
cd /usr && cvs -q -z3 -d anoncvs@anoncvs.NetBSD.org:/cvsroot checkout -r
pkgsrc-20xxQy
-P pkgsrc
ここで、pkgsrc-20xxQy
は、
チェックアウトする stable 枝名にします。たとえば “pkgsrc-2009Q1” になります。
こうすると、/usr/
ディレクトリーに
pkgsrc/
ディレクトリーが作られ、
/usr/pkgsrc/
以下に全パッケージのソースが置かれます。
pkgsrc current を取得するには、以下のコマンドを実行します。
$
cd /usr && cvs -q -z3 -d anoncvs@anoncvs.NetBSD.org:/cvsroot checkout -P pkgsrc
利用可能な CVS ミラーサイト一覧から、もっとも速いものを選んで使ってください。
rsh
のエラーメッセージが出た場合は、たとえば以下のようにして、環境変数 CVS_RSH を設定する必要があります。
$
cd /usr && env CVS_RSH=ssh cvs -q -z3 -d anoncvs@anoncvs.NetBSD.org:/cvsroot checkout -P pkgsrc
CVS_RSH=ssh の設定を今後も有効なままにする方法は、お使いのコマンドシェルのドキュメンテーションをご覧ください。
Bourne シェルの場合は、この設定を以下のとおりユーザーの .profile
に、
またはより大域的に /etc/profile
に書くことができます。
# set CVS remote shell command CVS_RSH=ssh export CVS_RSH
CVS は、標準状態では、多くの人の望む挙動をしてくれません。
しかし、
以下の内容の .cvsrc
というファイルをホームディレクトリーに置いておけば、
標準での挙動を変えることができます。このファイルを置いておけば、
あなたの悩みや、余計なバグ報告もなくなるでしょうから、
そうすることを強くおすすめします。
このファイルに関する説明は、
CVS のドキュメンテーションにあります。
# recommended CVS configuration file from the pkgsrc guide cvs -q -z3 checkout -P update -dP diff -upN rdiff -u release -d
pkgsrc を最新の状態に保つ方法としては、CVS をおすすめします (最初に tar ファイルを使ってインストールした場合でも、更新には CVS を使えます)。 CVS を使えば、tar ファイルをあらためてダウンロードした場合にくらべ、 帯域やハードディスクの負荷を減らすことができます。
tar ファイルを使って更新する場合は、まず、 これまで使っていた pkgsrc ディレクトリーを完全に削除する必要があります。 さもないと、それまでの間に pkgsrc から削除されたファイルがローカルディスクに残ったままになり、 不整合が生じてしまいます。 これまで使っていたファイルを消す場合、pkgsrc のファイルに独自に施した変更が、 更新後にすべて失われてしまいます。 このため、CVS を使った更新を強くおすすめします。
なお、distfile とバイナリーパッケージは、標準ではいずれも
pkgsrc ツリー内に置かれますので、pkgsrc ツリーを更新する前に退避させておくことを忘れないでください。
DISTDIR
と PACKAGES
を設定して、標準のディレクトリーとは別の場所を
pkgsrc が使うような構成にすることもできます。
詳細はChapter 5, pkgsrc を設定するをご覧ください。
tar ファイルを使って pkgsrc を更新するためには、 初回の入手時と同様に、tar ファイルをダウンロードします。 次に、pkgsrc ディレクトリーに独自の変更を何も加えていないことを確認します。 pkgsrc ディレクトリーを削除してから、新しい tar ファイルを展開します。これで完了です。
CVS を使って pkgsrc を更新するためには、pkgsrc
ディレクトリーへ移動して cvs を実行します:
$
cd /usr/pkgsrc && cvs update -dP
rsh
がエラーメッセージを出す場合は、前述の新規取得時と同様に、環境変数 CVS_RSH を設定する必要があります。たとえば以下のようにします。
$
cd /usr/pkgsrc && env CVS_RSH=ssh cvs up -dP
pkgsrc の更新時、CVS プログラムはそれまで使っていた枝をそのまま追いつづけます。 しかし、何らかの理由で stable 枝から current 枝に移りたい場合は、 “update” キーワードの後に “-A” オプションを追加して current に移ることができます。 current 枝から stable 枝に戻るには、 “-rpkgsrc-2009Q3” オプションを追加します。
Table of Contents
Section 4.1, “バイナリーパッケージを使う”をご覧ください。
ブートストラップキットは、以下のようにして簡単にソースからインストールすることができます。
#
env CVS_RSH=ssh cvs -d anoncvs@anoncvs.NetBSD.org:/cvsroot checkout pkgsrc
#
cd pkgsrc/bootstrap
#
./bootstrap
bootstrap を実行する前に、上で例示した方法以外で
pkgsrc を取得する方法については、Chapter 2, どこからpkgsrcを得て、どうやって最新に保つかを参照してください。
上で例示した bootstrap コマンドでは、
prefix (プログラムのインストール先) をデフォルトの
/usr/pkg
とし、
パッケージデータベースのディレクトリー (pkgsrc 内部の記録用) を
/var/db/pkg
とします。
これらをコマンドライン引数で設定することもできます。
bootstrap は bmake ツールをインストールします。 pkgsrc で構築をおこなう際には、この bmake を使ってください。 たとえばこの手引きにおいて “make” は bmake に読み替えてください。
いくつかのプラットフォームについては、以下のことを知っておくとよいでしょう。
対応は、 Darwin 5.x 以上に対しておこなわれています。 始める前に、Apple Developer Connection から Mac OS X Developer Tools をダウンロードしてインストールする必要があります。詳細は http://developer.apple.com/macosx/ をご覧ください。また、X11 Window System を使うパッケージを構築したい場合は、 X11 (Developer Tools に附属するオプションパッケージ) をインストールしておくことも必要です。
確認および対応は、 FreeBSD 4.7 および 5.0 に対しておこなわれています。 これら以外のバージョンでも動くかもしれません。
ブートストラップキットのインストールに際しては、 FreeBSD のユーザーランドのツールと衝突することがないように注意を払ってください。以下のような複数の事項があります。
FreeBSD の ports は、 /var/db/pkg
以下にパッケージデータベースを置きます。このため、
ブートストラップスクリプトの --pkgdbdir オプションで、
別の場所 (たとえば /usr/pkgdb
)
を指定することをおすすめします。
FreeBSD ports のツールを使う予定がない場合は、混同を避けるために、 それらを移動してしまってもいいかもしれません。たとえば以下のようにします。
#
cd /usr/sbin
#
mv pkg_add pkg_add.orig
#
mv pkg_create pkg_create.orig
#
mv pkg_delete pkg_delete.orig
#
mv pkg_info pkg_info.orig
ブートストラップスクリプトを使った際、
mk.conf
ファイルの例は
/etc/mk.conf.example
ファイルに置かれます。
Interix は Windows NT カーネルの POSIX 準拠のサブシステムで、 Cygwin よりも密接にカーネルと統合された Unix 風の環境を提供します。 Interix は Windows Services for Unix パッケージの一部であり、 ライセンスされた Windows 2000, XP (XP Home は含まず), 2003 のコピー用として、 無料で使うことができます。SFU は、http://www.microsoft.com/windows/sfu/ からダウンロードできます。
確認は、Services for Unix 3.5 に対しておこなわれています。 3.0 や 3.1 でも動作するかもしれませんが、公式には対応していません。 (3.0/3.1 の主な違いは、 pthreads がないことですが、このほかにも libc に欠けているものがあるかもしれません。)
Services for Unix Applications (別名 SUA) は、Windows Server 2003 R2 (5.2), Windows Vista および Windows Server 2008 (6.0), Windows 7 および Windows Server 2008 R2 (6.1) に統合されている構成要素です。本稿執筆時点において、 SUA の Interix 6.0 (32 ビット) および 6.1 (64 ビット) サブシステムで確認がおこなわれています。 これら以外のバージョンでも動作するかもしれません。 Interix 5.x サブシステムで、pkgsrc を使った確認はまだおこなわれていません。
pkgsrc を使うためには、Windows Services for Unix 3.5 の配布物のうち、 最低限、以下のパッケージをインストールする必要があります。
Utilities -> Base Utilities
Interix GNU Components -> (all)
Remote Connectivity
Interix SDK
Interix 上で pkgsrc を使う場合、Utilities 以下の "UNIX Perl" はインストールしないでください。これは共有モジュールに対応していない Perl 5.6 で、 /usr/local にインストールされますが、混乱を起こすだけです。これのかわりに、 pkgsrc (またはバイナリーパッケージ) の Perl 5.8 をインストールします。
Remote Connectivity 以下の "Windows Remote Shell Service" のインストールは必須ではありませんが、inetd を動作させるために Remote Connectivity そのものはインストールすることをおすすめします。
インストール中に、Interix のプログラムに対して setuid を有効にするかどうか、 また、パス名の大文字と小文字を標準で区別するかどうかを尋ねられるかもしれません。 setuid は有効にするようにし、また大文字と小文字はかならず区別するようにします。 (大文字と小文字を区別しないと、 perl をはじめ多くのプログラムが構築できなくなります。)
註: 最近の Windows サービスパックでは、 バイナリーを実行する方法を (データ実行防止機能を使ったものに) 変更します。 pkgsrc その他の gcc でコンパイルされたバイナリーを信頼して使うためには、 POSIX.EXE, PSXDLL.DLL, PSXRUN.EXE, PSXSS.EXE (899522 またはこれより新しいもの) を含んだホットフィックスをインストールする必要があります。 ホットフィックスは Microsoft からサポート窓口を通じて提供されていますが、 Debian Interix Port が、ほとんどの Interix ホットフィックスを個人的に使えるように http://www.debian-interix.net/hotfixes/ に用意しています。
Interix を使えるようにするためには、上述のホットフィックスのほか、 Data Execution Prevention を完全に無効化する必要があるかもしれません。 これが必要となるのは、ある種の CPU を使っている場合だけです。 上述のホットフィックスのいずれかひとつをインストールした後にも gcc その他のアプリケーションが依然として繰り返し segfault する場合には、 Windows ブートドライブ上の適切な "boot.ini" 行に、 以下のオプションを追加することができます: /NoExecute=AlwaysOff (警告: これは DEP を完全に無効化するものであり、 Administrators グループのユーザーとしてアプリケーションをよく実行する場合には、 セキュリティー上の危険となる可能性があります。)
SFU がすでにインストールされており、その設定を変更して pkgsrc が動作するようにしたい場合は、以下のことに気をつけてください。
UNIX Perl をアンインストールするため、Add/Remove Programs を使い、Microsoft Windows Services for UNIX を選んで Change をクリックします。インストーラーで Add or Remove を選んでから Utilities->UNIX Perl のチェックを外します。
ファイルシステムの大文字と小文字の区別を有効にするため、REGEDIT.EXE を実行して 以下のレジストリーキーを変更します。
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\kernel
DWORD 値 "obcaseinsensitive" を 0 に設定した後、リブートします。
setuid バイナリーを有効にするため (これは必須ではありません)、REGEDIT.EXE を実行して 以下のレジストリーキーを変更します。
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Services for UNIX
DWORD 値 "EnableSetuidBinaries" を 1 に設定した後、リブートします。
パッケージの管理者 (pkgsrc の "su" ユーザーと "pkg_add" を実行するユーザーのいずれかまたは両方) は、ローカルの Administrators グループに所属している必要があります。bootstrap を実行するユーザーも同様です。これは、通常の pkgsrc が "root" を要求するのにくらべ、若干緩い条件です。
パッケージの管理者は umask を 002 に設定するようにします。そうしておかないと、 自動的に "make install" が文句をいうようになります。こう設定することで、 /var/db/pkg 以下に書かれるディレクトリーに Administrators グループが確実に書き込み可能とできます。
http://www.interopsystems.com/ にある人気のある Interix バイナリーパッケージは、 古いバージョンの pkgsrc の pkg_* ツールを使います。 理想的には、これらは pkgsrc と混用しないほうがよいものです。 これらを pkgsrc のパッケージと同時に使う場合は、かならず、 それぞれのバイナリーパッケージに応じて適切な pkg_* ツールを使うようにしてください。
DOS 型のコンソールウィンドウ (csh および ksh のスタートアップショートカットから起動されるものを含む) 用の TERM の設定は "interix" です。 たいていのシステムには、そのような termcap/terminfo エントリーがありませんが、 ほとんどの場合、以下のような .termcap エントリーを用意すれば十分です。
interix:kP=\E[S:kN=\E[T:kH=\E[U:dc@:DC@:tc=pcansi:
Interix は、完全な Unix 風のプラットフォームの とっつきやすく柔軟な代替品としては十分なものですが、Interix を最大限に活用したい場合は、若干の制約があることを知っておくとよいでしょう。
X11:
Interix には標準的な X11R6 クライアントライブラリー一式が附属しており、 X11 にもとづくアプリケーションを実行することができますが、 X サーバーは附属しません。X サーバーの選択肢としては、 StarNet X-Win32, Hummingbird Exceed (Interix 用に調整された Interop X Server というものを、Interop Systems が提供しています) や、 Cygwin に含まれるフリーの X11 サーバーがあります。
X11 アクセラレーション:
Interix は、Win32 アプリケーションとは完全に別の NT サブシステム内で動いているため、現在のところ、アクセラレーションのための X11 プロトコルの各種拡張 (MIT-SHM や DGA など) には対応していません。 ローカルの X サーバーを使った対話的なアプリケーションのほとんどは、 そこそこ速く動きますが、フルモーションビデオなど画像に特化したアプリケーションを動かすには、 思ったよりも速い CPU が必要になるかもしれません。
オーディオ:
Interix は、オーディオ出力にネイティブで対応していません。
オーディオに対応するため、pkgsrc では Interix 上で esound
クライアントサーバー型オーディオシステムを使っています。
他のほとんどのプラットフォームとは異なり、
audio/esound
パッケージには、
esd サーバーが含まれません。
Interix ホストを経由してオーディオを出力するには、
emulators/cygwin_esound
パッケージもあわせてインストールする必要があります。
CD/DVD, USB, SCSI:
現在のところ、Interix はデバイスへの直接のアクセスに対応していませんので、 CD/DVD ドライブ、USB デバイス、SCSI デバイスを、 ファイルシステム経由以外の方法で使うことはできません。このため、 Interix を使って、直接 CD/DVD を焼くことなどはできません。
テープドライブ:
CD-ROM や SCSI デバイスと同様の制約があるため、 Interix ではテープドライブに直接アクセスすることもできません。ただし、 Cygwin を介して使うことで (Cygwin の esound サーバーを介してオーディオを使えるように) テープドライブにアクセスできるようにするための作業がおこなわれています。
一般的に、Windows システム上に "root" ユーザーを用意することは必須ではありません。 ユーザーがローカルの Administrators グループに属してさえいれば、それで十分です。 ただし、現在のところ、パッケージのなかには "root" という名前のユーザーが特権ユーザーであることを前提にしているものがあります。 そのようなパッケージのために、"root" という名前のユーザーを作ってもかまいませんが、 ローカルの Administrators グループ (または、お使いの言語でこれに対応するもの) に属させるようにしてください。
pkg_add は、$PKG_DBDIR
内のディレクトリーを、モード 0775 ではなく
0755 で作成します。この問題を回避するため、当面は、ローカルの
Administrator (または、お使いの言語でこれに対応するもの)
としてパッケージをインストールするか、
各パッケージのインストール後に以下のコマンドを実行してください。
#
chmod -R g+w $PKG_DBDIR
機能する C コンパイラー、つまり、 gcc または SGI の MIPS
および MIPSpro コンパイラー (cc/c89) が必要です。 CC
環境変数を、
使用するコンパイラーに応じて設定してください。
MIPSpro コンパイラースイートのライセンスがない場合は、http://freeware.sgi.com/
から gcc の tar 配布ファイルをダウンロードすることができます。
IRIX 6.5.17 以上が必要です。 このバージョンの IRIX で if_indextoname(3), if_nametoindex(3) などへの対応がおこなわれたからです。
現在のところ、pkgsrc は同時には一つの ABI にしか対応しません。つまり、 古い 32 ビット ABI、新しい 32 ビット ABI、64 ビット ABI を切り替えることはできません。 最初に "abi=n32" を使って始めた場合は、 すべてのパッケージがこれを使って構築されることになります。
このため、環境変数または mk.conf
の
CFLAGS
が衝突しないようにしてください。
特に、 n32 オブジェクトファイルに lib64 を、また、その逆の組合せを、
リンクしないようにしてください。
/etc/compiler.defaults
を確認してください。
pkgsrc ツリーの実体を別ホストから NFS を使ってマウントしている場合は、必ず
WRKOBJDIR
をローカルのディレクトリーに設定しておいてください。
IRIX のリンカーは、ネットワーク経由でマウントされたファイルシステム越しにリンクするときに
問題を起こすことが時々あるからです。
事前準備の過程では、imake(1) などのプログラムにすべて正しいオプションが設定されるはずですが、
ローカルの設定に依存するオプションを設定したい場合があるかもしれません。
詳細は、pkgsrc/mk/defaults/mk.conf
をご覧ください。
そしてもちろん、お使いのコンパイラーのマニュアルページもご覧ください。
SGI の MIPSPro コンパイラーを使っている場合は、
mk.conf
で
PKGSRC_COMPILER= mipspro
を設定してください。これを設定しないと、
pkgsrc は gcc を使っていることを仮定するので、コンパイラーに不適切なフラグを渡すことがあります。
なお、標準状態では、bootstrap は適切な mk.conf.example
を作成するはずです。
gcc と MIPSPro コンパイラーチェインの両方をインストールしているが、
必ず MIPSPro を使うようにしたい場合は、PATH
に gcc の場所 (ありがちなのは
/usr/freeware/bin
) を含めないでください。さらに (重要)、
'--preserve-path' フラグを bootstrap に渡してください。
Linux のなかには、libtermcap と libcurses (libncurses) のいずれかを必要とするものがあります (たとえば Debian GNU/Linux など)。そのようなディストリビューションでは libncurses-dev パッケージ (または相当品) をインストールすれば問題なくなるはずです。
pkgsrc は gcc (GNU Compiler Collection) と icc (Intel C++ Compiler) のどちらにも対応しています。gcc が標準で使われます。 icc は i386 上の icc 8.0 と 8.1 で確認がおこなわれています。
icc を使って bootstrap をおこなうには、以下のようにします (icc は標準のディレクトリーにインストールされているものとします)。
env CC=/opt/intel_cc_80/bin/icc LDFLAGS=-static-libcxa \ ac_cv___attribute__=yes ./bootstrap
icc 8.1 では、引数の -static-libcxa を `-i-static' にする必要があります。
icc は __attribute__ に対応していますが、GNU configure のテストではネストした関数を使っており、 icc はネストした関数に対応していません。__attribute__ を #undef してしまうと、 Linux の多くのヘッダーファイルが __attribute__ なしでは正しくコンパイルできず、 壊れてしまうという副作用があります。このため、テストは、コンパイラーが __attribute__ に対応しているとしたもので上書きする必要があります。
bootstrap した後に、mk.conf
で
PKGSRC_COMPILER
を設定します。
PKGSRC_COMPILER= icc
icc がインストールされるディレクトリーは標準では
/opt/intel_cc_80
であり、pkgsrc
でもこのディレクトリーを標準としています。これ以外のディレクトリーに
icc をインストールしている場合は、mk.conf
で
ICCBASE
を設定してください。
ICCBASE= /opt/icc
pkgsrc は、icc が提供する実行時ライブラリーを静的リンクするので、 作られたバイナリーはその共有ライブラリーがインストールされていないシステムでも 動かすことができます。
ただし、libtool は、C++ の共有ライブラリーをリンクして記録する時に実行された (ライブラリーごとに -Bstatic や -Bdynamic オプションの指定がまちまちな) ld(1) コマンドをもとにライブラリーの一覧を展開します このことから、libtool でリンクされた C++ の共有ライブラリーは、libtool が修正されない限り、 icc のライブラリーに対して実行時依存性を持った状態になります。
確認および対応は、 OpenBSD 3.0 および 3.2 に対しておこなわれています。
ブートストラップキットのインストールに際しては、 OpenBSD のユーザーランドのツールと衝突することがないように注意を払ってください。以下のような複数の事項があります。
OpenBSD の ports は、 /var/db/pkg
以下にパッケージデータベースを置きます。このため、
ブートストラップスクリプトの --pkgdbdir オプションで、
別の場所 (たとえば /usr/pkgdb
)
を指定することをおすすめします。
OpenBSD ports のツールを使う予定がない場合は、混同を避けるために、 それらを移動してしまってもいいかもしれません。たとえば以下のようにします。
#
cd /usr/sbin
#
mv pkg_add pkg_add.orig
#
mv pkg_create pkg_create.orig
#
mv pkg_delete pkg_delete.orig
#
mv pkg_info pkg_info.orig
ブートストラップスクリプトを使った際、
mk.conf
ファイルの例は
/etc/mk.conf.example
ファイルに置かれます。
OpenBSD の make プログラムは
mk.conf
も使います。
このファイル中の pkgsrc 特有の記述を以下のように括ることで、
回避することができます。
.ifdef BSD_PKG_MK # pkgsrc の記述。たとえば defaults/mk.conf の挿入など .else # OpenBSD の記述 .endif
対応は x86 と sparc それぞれの Solaris 2.6 から 9 までに対しておこなわれています。 機能する C コンパイラーが必要です。 gcc 2.95.3 および Sun WorkShop 5 の両者で確認がおこなわれています。
Solaris 8 でのブートストラップ過程およびパッケージの構築では、 以下の各パッケージが必要になります。
SUNWsprot
SUNWarc
SUNWbtool
SUNWtoo
SUNWlibm
なお、2006 年 6 月現在、Solaris 上では GNU binutils はサポートされていません。
どのコンパイラーを使うにせよ、コンパイラーツールと
$prefix を、必ず PATH
に含めてください。
これは、/usr/ccs/{bin,lib}
や、たとえば /usr/pkg/{bin,sbin}
などです。
どのパッケージの構築にも同じ gcc だけを使うようにすると、 話が簡単になります。
外部から導入した gcc を使うのはブートストラップの時だけにして、
その後は gcc を
lang/gcc
から構築するかバイナリーパッケージをインストールして、
ブートストラップで使った gcc は削除することをおすすめします。
gcc のバイナリーパッケージは、http://www.sunfreeware.com/ から辿れます。
少なくとも、以下の各パッケージを (WorkShop 5.0 から) インストールしておく必要があります。
SPROcc - Sun WorkShop Compiler C 5.0
SPROcpl - Sun WorkShop Compiler C++ 5.0
SPROild - Sun WorkShop Incremental Linker
SPROlang - Sun WorkShop Compilers common components
mk.conf
で、以下の変数を設定します。
CC= cc CXX= CC CPP= cc -E CXXCPP= CC -E
C プリプロセッサーを使って
C のソースコード以外のものを処理するパッケージのなかには、
この CPP
の設定では問題が起きるものがあるかもしれません。
64 ビットパッケージを構築する場合に必要なことは、
mk.conf
ファイルに以下の行を追加するだけです。
PKGSRC_COMPILER= sunpro ABI= 64
この設定は、SPARC アーキテクチャーについてのみ確認がおこなわれています。 Intel および AMD マシンでは、 必要な作業がまだ残っています。
libtool を使っていると、時々、/bin/ksh
がセグメンテーションフォールトを起こしてクラッシュすることがあります。
回避策は、たとえば shells/bash
をインストールして、
以下の各行を mk.conf
に追加するなどして、
別のシェルを configure スクリプト用に使うことです。
CONFIG_SHELL= ${LOCALBASE}/bin/bash WRAPPER_SHELL= ${LOCALBASE}/bin/bash
こうしてから、devel/libtool-base
パッケージを構築しなおします。
Table of Contents
基本的に、pkgsrc には二通りの使い方があります。 一つ目の使い方は、パッケージ用のツールだけをインストールして、 他の人が用意したバイナリーパッケージを使うものです。 これは、pkgsrc のうち “pkg” に相当します。 二つ目の使い方は、pkgsrc の “src” もインストールするものです。 こうすると、自分でパッケージを構築することができますし、 他の人が用意したバイナリーパッケージを使うこともできます。
ftp.NetBSD.org サーバーとそのミラーサイトには、バイナリーパッケージを揃えて置いてあり、 すぐにインストールして使える状態になっています。このバイナリーパッケージは、 以下のような、標準のディレクトリーの設定を使って構築されています。
LOCALBASE
は /usr/pkg
で、ここにほとんどのファイルがインストールされます。
設定ファイルは /usr/pkg/etc
です。
VARBASE
は /var
で、インストール後に変更することのあるファイルはここにインストールされます。
何らかの理由 (root 権限がないなど) でこの各ディレクトリーが使えない場合は、 このバイナリーパッケージを使うことはできないので、 パッケージ用ツールを自分で構築する必要があります。これについてはSection 3.2, “pkgsrc を使う準備をする”に説明があります。
バイナリーパッケージをインストールするためには、
まず、バイナリーパッケージがどこで入手できるか知っている必要があります。
最初に調べる場所は、pkgsrc の主たる FTP サーバーの /pub/pkgsrc/packages
ディレクトリーです。
このディレクトリーには、複数のプラットフォーム用の バイナリーパッケージがあります。 最初に、お使いのオペレーティングシステムのディレクトリーを選んでください。 (バージョン番号がついているディレクトリーは、 歴史的な理由で残っているだけですので、無視してください。) 次に、ハードウェアアーキテクチャーを選び、 その次に、OS のバージョンと pkgsrc の“バージョン”の組合せを選びます。
多くの場合、このディレクトリーには、
パッケージ管理ツールが入った bootstrap.tar.gz
というファイルがあります。このファイルがない場合は、
お使いのオペレーティングシステムにパッケージ管理ツールがもともとあるのでしょう。
このファイルをダウンロードして /
ディレクトリーに展開します。
展開すると、/usr/pkg
(この下には、
バイナリーパッケージ管理用のツールがある) および /var/db/pkg
(インストールされたパッケージのデータベース用) の各ディレクトリーが作られます。
前節で説明したディレクトリーには、
All
というサブディレクトリーがあり、
当該プラットフォーム向けのバイナリーパッケージがすべて置かれています。
ただし、FTP または CDROM (利用しているメディアによって異なります)
経由での配布ができないパッケージは、
除かれています。
パッケージを FTP または HTTP サーバーから直接インストールするには、 Bourne シェルと互換のシェルで、以下のコマンドを実行します (最初に su して root になっておくことを忘れずに)。
#
PATH="/usr/pkg/sbin:$PATH"
#
PKG_PATH="ftp://ftp.NetBSD.org/pub/pkgsrc/packages/
OPSYS
/ARCH
/VERSIONS
/All"#
export PATH PKG_PATH
CDROM, DVD または NFS でマウントされた置き場所からインストールする場合などは、
URL のかわりに、ローカルのパスを使うこともできます。
複数の置き場所からパッケージをインストールしたい場合は、
それらをセミコロンで区切って PKG_PATH
に設定することができます。
以上の準備ができれば、 パッケージのインストールは非常に簡単です。
#
pkg_add openoffice2
#
pkg_add kde-3.5.7
#
pkg_add ap2-php5-*
なお、インストールしようとするパッケージを実行するために必要となるパッケージも、 すべて一緒にインストールされますが、 この必要なパッケージも同じ置き場所に用意されていると仮定されます (訳註: 必要なパッケージがすべて揃うように PKG_PATH を設定する必要があるということ)。
パッケージをインストールすると、脆弱性のあるパッケージがインストールされることもありえます。 このため、pkg_admin audit を定期的に (特に、パッケージを新たにインストールした後には) 実行して、 脆弱性の影響がある構成となっているかどうかを確認するようにしてください。
パッケージをインストールした後に、PATH
に
/usr/pkg/bin
と /usr/pkg/sbin
が含まれている事を確
認してください。これで、インストールされたプログラムを実際に使い始めること
ができます。
パッケージをアンインストールする方法は、そのパッケージを、
ソースコードからインストールしたかバイナリーパッケージからインストールしたかにかかわらず同じです。
どちらの方法でインストールされたかは、pkg_delete コマンドは一切関知しません。
パッケージの削除は、pkg_delete
package-name
を実行するだけでおこなうことができます。
パッケージ名はバージョン番号をつけてもつけなくてもかまいません。
一連のパッケージをアンインストールするために、
たとえば *emacs*
のようにワイルドカードを使うこともできます。
この場合、ワイルドカードが
pkg_delete
に渡る前にシェルに展開されないようにするため、
ワイルドカードはかならずクォートするようにします。
-r
オプションは非常に強力です。これを使うと、
指定したパッケージに依存しているパッケージをすべて削除してから、
指定したパッケージそのものを削除します。たとえば、
#
pkg_delete -r jpeg
は、jpeg および jpeg を使うすべてのパッケージを削除します。これにより、 jpeg パッケージをアップグレードすることが可能になります。
NetBSD セキュリティーオフィサーとパッケージグループでは、 pkgsrc に含まれる (あるいは含まれていた) パッケージの既知の脆弱性のリストを 保守しています。このリストは、 NetBSD FTP サイトの ftp://ftp.NetBSD.org/pub/pkgsrc/distfiles/vulnerabilities から入手できます
pkg_admin fetch-pkg-vulnerabilities を使うと、 このリストを自動的にダウンロードし、 システムにインストールされているパッケージすべてについて セキュリティー検証をすることができます。
このセキュリティー検証は、ふたつの部分からできています。 ひとつめの段階は pkg_admin fetch-pkg-vulnerabilities で、 NetBSD FTP サイトから 脆弱性のリストをダウンロードするものです。 ふたつめは pkg_admin audit で、インストールされているパッケージに脆弱性が ないかどうか検証するものです。脆弱性のあるパッケージがあった場合、 次のように出力してくれます:
Package samba-2.0.9 has a local-root-shell vulnerability, see http://www.samba.org/samba/whatsnew/macroexploit.html
vulnerabilities ファイルを毎日ダウンロードして、常に最新の状態にしておきたいという方もいらっしゃることでしょう。 root ユーザーの crontab(5) エントリーを適切に書いておけば、そういうこともできます。 たとえば、
# vulnerabilities ファイルをダウンロード 0 3 * * * /usr/sbin/pkg_admin fetch-pkg-vulnerabilities >/dev/null 2>&1
というエントリーを書けば、毎日午前 3 時に vulnerability リストを更新することになります。
この例は一日一回ですが、もっと頻繁に更新することもできます。
さらに、パッケージの検証を daily security script でおこないたい方もいらっしゃるでしょう。
これは、以下のような行を /etc/security.local
に書いておけば実現できます。
/usr/sbin/pkg_admin audit
インストール済パッケージが最新かどうかを確認するには、
pkgtools/lintpkgsrc
をインストールして、
lintpkgsrc に “-i” を付けて実行します。たとえば以下のようになります。
%
lintpkgsrc -i
... Version mismatch: 'tcsh' 6.09.00 vs 6.10.00
このようになった場合、パッケージを更新し、そのパッケージに依存しているパッケージをすべて再構築するために、 make update を使うことができます。
pkg_add(1) マニュアルページで警告されている、自分自身で作ったものでないバイナリー パッケージをインストールすることが孕む危険性、無思慮にこのようなファイルを インストールすることにより、あなたのシステムにセキュリティーホールが生じる 事についてよく注意してください。
もちろん、パッケージ、パッケージの構築用のコンパイラー、 その他、呼び出されるすべてのツールのソースコードを完全に読んで理解したわけではない場合は、 ソースからインストールしたパッケージにもすべて、 同じ警告があてはまります。
pkgsrc を入手すると、 pkgsrc
ディレクトリーには、
カテゴリー別に整理されたパッケージ一式が含まれます。
オンラインでパッケージの索引を見られますし、また、 pkgsrc
ディレクトリーで make readme してローカルで README.html
を作って、 www/lynx
や www/firefox
などの好みの
web ブラウザーで見られるようにすることもできます。
パッケージのインストール先のプレフィックスは、
デフォルトでは /usr/pkg
です。これを変えたい場合は、
mk.conf
で LOCALBASE
を設定してください。一つのシステム内で複数の
LOCALBASE
を定義して使い分けるようなことはしないでください
(chroot 環境内は除く)。
以下、本章では、パッケージがすでに pkgsrc に含まれていると仮定 しています。もし、そうでなければ、Part II, “pkgsrc 開発者向けの手引き”で、 パッケージを新たに作る方法をご覧ください。
ソースからパッケージを構築するためには、機能する C コンパイラーが必要です。NetBSD の場合は、 “comp” および “text” 配布物一式をインストールしておく必要があります。X11関連のパッケージを 構築する場合は、さらに“xbase”および“xcomp” 配布物一式も必要です。
パッケージを構築するうえで最初にすることは、配布ファイル (未変更のソース) のダウンロードです。配布ファイルがまだダウンロードされていない場合、 pkgsrc は自動的に配布ファイルを取得します。
distfiles
ディレクトリー
に必要なファイルが
すでに存在していれば、インターネットに接続する必要はありません。
CD-ROMなどにdistfilesがある場合には、CD-ROMを /cdrom
にmountし、
DISTDIR=/cdrom/pkgsrc/distfiles
を mk.conf
に加えて、使うことができます。
標準状態では、人気のあるパッケージを置いているサーバー
(たとえば SourceForge.net のミラー) に過大な負荷をかけないようにするため、
配布サイトのリストの順序はランダムに入れ換えられます。
このため、別の distfile を取得する必要が生ずるたびに、
すべてのミラーからの取得を、新たな (ランダムな) 順序で試みます。
この機能は、MASTER_SORT_RANDOM=NO
を設定して止めることができます (PKG_DEVELOPER
が設定されている場合は、すでに無効化されています)。
主要な配布サイトをあなたのところに近いサイトで上書きす
ることができます。
変数をひとつかふたつ設定すると、
マスターサイトにアクセスする順序を変えることができます。
MASTER_SORT
には、
ドメインの接尾辞を空白で区切ったリストが含まれます。
MASTER_SORT_REGEX
はこれより柔軟なもので、
正規表現を空白で区切ったリストが含まれます。
これは MASTER_SORT
より高い優先度を持ちます。
pkgsrc/mk/defaults/mk.conf
の例を参照してください。これにより、帯域幅
と時間が節約できるかもしれません。
これらの設定は、シェルの環境変数でも変更できますし、その設定を今後も有効に
したければ、
mk.conf
ファイルにその定義を書き加えておくこともできます。
パッケージが他のパッケージ(例えば meta-pkgs/kde3
など)
に依存している場合、
ダウンロードとコンパイルを交互に繰り返すことがあります。
最初に必要なすべてのソースを確実にダウンロードするには、
次のコマンドを使用します:
%
make fetch-list | sh
このコマンドは必要なファイルを取ってきてdistfiles
ディレクトリー
に保存するためのシェルコマンドを出力、実行します。必要なファイルを手動で
ダウンロードするという方法もあります。
ソフトウェアがダウンロードされると、パッチが適用された上で、 コンパイルされます。それにかかる時間はあなたのコンピューターによりますし、 そのソフトウェアが依存している他のパッケージの数とそれらのコンパイルに かかる時間にもよります。
bootstrap または pkgsrc を NetBSD 以外のシステムで使う場合は、 この手引きで例示されている “make” ではなく pkgsrc の bmake コマンドを使ってください。
たとえば、パッケージの各構成要素を構築するには、シェルプロンプトで
%
cd misc/figlet
%
make
とします。
次は新たにコンパイルされたプログラムを、 実際にあなたのシステムにインストールします。 インストールしようとしているパッケージのディレクトリーにいる間に
%
make install
と入力してください。
パッケージをシステムにインストールするには root 権限が必要なことがあります。 ただし、pkgsrc には必要な時のみ su する機能があり、 実際のインストール時にのみ root になることができます。
そのソフトウェアは今まさにインストールされ、 使用できるようにセットアップされたことになります。 もうこれ以上コンパイル後の作業ファイルは必要とされないので、
%
make clean
と入力し作業ディレクトリー内のファイルを削除してしまってもかまいません。 もし、プログラムをコンパイルするときに、 依存関係により他のパッケージがコンパイル/インストールされたならば、 それらも次のコマンドにより、きちんと削除することができます。
%
make clean-depends
figlet ユーティリティーを例にあげると、Appendix B, 構築のログのように構築することに より、システムにインストールすることができます。
プログラムはパッケージツリーのデフォルトルート- /usr/pkg
にインストール
されます。もし、このディレクトリーが趣味にあわないのであれば、環境変数
LOCALBASE
を設定してください。この値はパッケージツリーのルートとして使用さ
れます。例えば、/usr/local
を使う場合、
LOCALBASE=/usr/local
と設定してください。
なお、これにはパッケージ専用のディレクトリーを使い、他のプログ
ラムと共有させないようにします(つまり、 LOCALBASE=/usr
などとしてはいけませ
ん)。また、LOCALBASE
ツリー内には、独自のファイルやディレクトリー
(src/
,
obj/
, pkgsrc/
のようなもの)は一切追加しないようにしてください。これは、パッ
ケージシステムがインストールするプログラムなどのファイルが、そこにインストー
ルされているかもしれない別のファイルと衝突することがないようにするためです。
いくつかのパッケージは、構築時にいくつかのコンフィギュレーションオプション
を変えるためにmk.conf
を参照します。デフォルトの設定項目については、
pkgsrc/mk/defaults/mk.conf
をのぞいてみてください。LOCALBASE
といっ
た環境変数は、pkgsrc使用時に毎回使えるようにmk.conf
で設定しておくこと
ができます。
時々、 パッケージの構築やインストールの際に、“水面下”で何が起きているかを 見たいことがあります。これは、デバッグのためなのかもしれませんし、好奇心が 高じたものかもしれません。このような用途に使うための変数がいくつも用意され ています。
自分で作った(次章参照)、手動でpkgsrc/packagesに置いた、またはリモートFTPサー
バーに置かれたバイナリーパッケージをインストール
したい場合は、"bin-install"ターゲットを使うことができます。このターゲットは、
- もし可能ならば - pkg_add(1)を使ってバイナリーパッケージをインストールするほ
か、make packageをおこないます。検索先リモートFTPサーバーのリストは
BINPKG_SITES
変数に保持され、デフォルトはftp.NetBSD.orgです。pkg_add(1)に与え
るべきフラグはすべて、BIN_INSTALL_FLAGS
変数で保持することができます。詳細は
pkgsrc/mk/defaults/mk.conf
をご覧ください。
最後に警告: 標準でないLOCALBASE
の設定をしたシステムの場合は、
各パッケージのインストール前にこれらを設定するようにしてください。複数のディ
レクトリーを同じ目的用に分散して使うことはできないからです。そのようなこと
をすると、pkgsrcはインストール済みのパッケージを正しく検出することができず、
無惨に失敗することになるでしょう。また、コンパイル済バイナリーパッケージは、
通常はデフォルトのLOCALBASE
である
/usr/pkg
を使って構築されているので、標準で
ないLOCALBASE
を使っている場合は、とにかくコンパイル済バイナリーパッケージを
インストールしてはいけません。
Table of Contents
pkgsrc システム全体の設定は、ひとつのファイル (通常は
mk.conf
) でおこなわれます。pkgsrc
がこのファイルをどのディレクトリーから探すかは、
インストールの時に決まります。NetBSD で、ベースシステムの
make(1) を使う場合は、/etc/
ディレクトリーとなります。これ以外の場合はすべて、
${PREFIX}/etc/
が標準の場所となり、これは
bootstrap プログラムに指示したバイナリーパッケージのインストール先に依存します。
bootstrap の実行中に、設定ファイルの例が作成されます。
このファイルを使うには、
${PREFIX}/etc
ディレクトリーを作って、
その中にこのファイルをコピーする必要があります。
この設定ファイルの書式は、通常の BSD 形式の
Makefile
の書式です。pkgsrc 全体の設定は、
このファイルで変数を設定することでおこなわれます。なお、
ここではあらゆる種類の変数を定義することができ、また、
特別なエラーの検査 (たとえば、綴りの誤り) はおこなわれないので、
設定が有効かどうか調べるには、
いろいろ試す必要があるということに注意してください。
本節では、pkgsrc の全パッケージに影響する変数をいくつか掲げます。
ユーザーが設定可能な変数の完全な一覧は、
mk/defaults/mk.conf
にあり、
各変数の目的もコメントで説明されています。
LOCALBASE
:
パッケージをどこにインストールするか。標準では
/usr/pkg
になります。異なる LOCALBASE
をもつバイナリーパッケージを混在させないでください。
CROSSBASE
:
“cross” カテゴリーのパッケージをどこにインストールするか。
標準では
${LOCALBASE}/cross
になります。
X11BASE
:
当該システムで X11 がどこにインストールされているか。標準では
/usr/X11R6
になります。
DISTDIR
: pkgsrc のパッケージ構築用にダウンロードしたままの状態の
ソース配布物をどこに置くか。標準では
${PKGSRCDIR}/distfiles
になります。
PKG_DBDIR
: インストールされたパッケージに関する
データベースをどこに置くか。標準では
/var/db/pkg
になります。
MASTER_SITE_OVERRIDE
:
設定した場合、その値でパッケージの
MASTER_SITES
が上書きされます。
MASTER_SITE_BACKUP
:
配布ファイルおよびパッチファイルが、ローカルにも、
${MASTER_SITES}
や
${PATCH_SITES}
にもなかった場合のための予備の場所 (複数可)。
標準では
ftp://ftp.NetBSD.org/pub/pkgsrc/distfiles/${DIST_SUBDIR}/
と
ftp://ftp.freebsd.org/pub/FreeBSD/distfiles/${DIST_SUBDIR}/
になります。
BINPKG_SITES
:
バイナリーパッケージの配布サイトのリストです。rel
および
arch
は、それぞれ OS
リリース (“2.0” など) およびアーキテクチャー
(“mipsel” など) で置き換えられます。
ACCEPTABLE_LICENSES
:
受け入れ可能なライセンスのリストです。ライセンス名は、大文字・小文字を区別します。
このリストにないライセンスが適用されるパッケージを構築しようとするたびに、
エラーメッセージが表示されます。
簡便な変更でライセンスを受け入れるようにできる場合は、
エラーメッセージでこの値の変更方法の説明も表示されます。
XXX
PACKAGES
: バイナリーパッケージ用のディレクトリーの最上層。
標準では
${PKGSRCDIR}/packages
になります。
WRKOBJDIR
:
設定した場合、この値を最上層として、
別に分離された作業ディレクトリーが作られて
${WRKDIR}
(前述) からシンボリックリンクされます。
これは、複数のアーキテクチャー用のパッケージを構築する際に便利です。
さらに、${PKGSRCDIR}
を NFS マウントして、
${WRKOBJDIR}
は各アーキテクチャーのローカルに置くということができます。(なお、
PKGSRCDIR
は利用者が設定するようなものではないことを断っておきます
—これは pkgsrc ツリーのルートを参照する内部的な定義です。
ここでいう pkgsrc ツリーは、多くの文脈がありえます。)
LOCALPATCHES
:
pkgsrc に含まれていないローカルなパッチ用のディレクトリーです。
さらなる情報は、Section 11.3, “patches/*”
をご覧ください。
PKGMAKECONF
: パッケージの
BSD 形式の Makefile が使用する mk.conf
ファイルの場所です。この変数が設定されていない場合は、
/usr/src
以下の構築用の設定を見ることのないようにするために、
MAKECONF
が
/dev/null
に設定されます。
DEPENDS_TARGET
:
標準では、依存するパッケージはインストールされるだけで、
バイナリーパッケージの作成まではおこなわれません。
この変数を package
に設定して、
依存パッケージのインストール後にバイナリーパッケージを自動的に作成することができます。
ほとんどのパッケージは、WRKDIR
のサブディレクトリーへのインストールに対応しています。そのようにインストールをすれば、
本番のファイルシステムに手を加えずにパッケージを構築することができます。
DESTDIR への対応には、以下の二通りの形態があります。
基本的な (basic) DESTDIR 対応。 パッケージのインストールや、バイナリーパッケージ作成は、 通常と同じく root で実行します。
完全な (full) DESTDIR 対応。 完全な構築、インストール、バイナリーパッケージ作成を、 通常ユーザー権限でおこなうことができます。root 権限が必要なのは、 パッケージを追加するときだけです。
現在では、標準状態で DESTDIR へ対応するようになっています。
USE_DESTDIR=no
を設定すれば
以前のような DESTDIR を使わない挙動に戻すことができますが、この設定は廃止予定ですので、
パッケージを DESTDIR 対応にするほうが望ましいでしょう。
DESTDIR への対応によって、各種ターゲットの挙動が少し変わります。
パッケージを構築してからインストールする場合は、
package-install
を使ってください。package
および install
の各ターゲットは、何もしてくれません。
package-install
は、
DEPENDS_TARGET
にすることができます。
bin-install
は、インストール用に root のパスワードを尋ねてきますが、
その後に失敗し、
package-install
があらためてパスワードを尋ねてきます。
基本的な DESTDIR 対応を使う場合、make
clean
は root で実行する必要があります。
foo/bar
パッケージに対して、
DESTDIR に完全に対応できているかどうか、以下のコマンドでテストすることができます。
$
id uid=1000(myusername) gid=100(users) groups=100(users),0(wheel)$
mkdir $HOME/packages$
cd $PKGSRCDIR/foo/bar
DESTDIR
に完全に対応しているか確認します。
root 権限は必要ないはずです。
$
make USE_DESTDIR=yes install
root 権限なしでパッケージを作ってみます。
$
make USE_DESTDIR=yes PACKAGES=$HOME/packages package
以下のコマンドでは、 su(1) を使って root 権限を得られることが必要です。
$
make USE_DESTDIR=yes PACKAGES=$HOME/packages package-install
あとは、通常のユーザーで以下のコマンドを実行します。
$
make clean
pkgsrc は、標準では GCC を使ってパッケージを構築します。 これは /etc/mk.conf で以下の変数を設定して変えることができます。
PKGSRC_COMPILER
:パッケージ構築時に使われる一連のコンパイラーを指定する値を並べたものです。 以下の値を使うことができます。
distcc
:
分散 C/C++ コンパイラー (連鎖可能)
ccache
:
コンパイラーキャッシュ (連鎖可能)
gcc
:
GNU C/C++ コンパイラー
mipspro
:
Silicon Graphics, Inc. MIPSpro (n32/n64)
mipspro
:
Silicon Graphics, Inc. MIPSpro (o32)
sunpro
:
Sun Microsystems, Inc. WorkShip/Forte/Sun ONE Studio
標準では
“gcc
” になります。
PKGSRC_COMPILER
の設定には、適切なコンパイラー本体とともに、
ccache
と
distcc
のいずれかまたは両方を併用することができます。
たとえば “ccache gcc
” のようにします。
この変数の設定では、コンパイラー本体を示す値を最後に置くようにします。
なお、コンパイラー本体はただ一つだけ掲げるようにします (たとえば、
“sunpro gcc
” などとすることはできません)。
GCC_REQD
:パッケージの構築用として、最低限必要な GCC のバージョンを指定します。システム附属の GCC がこの条件を満たさない場合、pkgsrc はそのかわりに使うため、 GCC のパッケージを構築してインストールします。
CFLAGS
変数を設定したい場合は、
=
演算子は使わずに、
かならず +=
演算子を使ってください。
CFLAGS+= -your -flags
CFLAGS=
のようにする (つまり、“+”を付けない) と、
独自のフラグを追加する必要があるパッケージで問題を起こすことがあります。
CPU に特化した最適化に関心がある場合は、
devel/cpuflags
パッケージを見ておくとよいでしょう。
configure および build の各段階において、リンカーにフラグを渡したい場合、
二通りの方法を使うことができます。すなわち、
LDFLAGS
または LIBS
のいずれかを設定します。
両者の違いは、LIBS
はコマンドラインに付け加えられますが、
LDFLAGS
はそれより早く現れます。
LDFLAGS
はあらかじめ読み込まれ、
USE_IMAKE
の設定や
mk/x11.buildlink3.mk
のインクルードの有無に応じた
ELF マシン向けの rpath の設定が追加されます。
CFLAGS
と同様に、この設定を上書きしたいわけでなければ、
+=
演算子を使います。
LDFLAGS+= -your -linkerflags
XXX
PKG_DEVELOPER
:
パッケージ開発者向けに、いくつかの正当性検査を実行します。
パッチが曖昧さゼロで適用できることを確認する
check-shlibs を実行して、 すべてのバイナリーパッケージが共有ライブラリーを見つけられることを確認する。
PKG_DEBUG_LEVEL
:
パッケージの構築およびインストールの際に表示される、
デバッグ用出力の水準です。標準の値は 0 です。この場合、コマンドは
(通常の、標準状態で、静粛な操作で) 実行されるだけで、表示されません。
値が 1 の場合、すべてのシェルコマンドを実行前に表示します。
値が 2 の場合、すべてのシェルコマンドを実行前に表示するほか、
実際に実行される経過を set
-x により表示します。
パッケージのなかには、構築時にオプションがあるものがあります。 通常は、数通りの依存性からいずれかを選択、大きな依存性を伴うオプション対応の有効化、 実験的な機能の有効化などです。
パッケージがどんなオプションに対応しているか (対応している場合)、 また、どのオプション同士が排他的かを調べるには、make show-options を実行します。結果は、たとえば以下のようになります。
The following options are supported by this package: ssl Enable SSL support. Exactly one of the following gecko options is required: firefox Use firefox as gecko rendering engine. mozilla Use mozilla as gecko rendering engine. At most one of the following database options may be selected: mysql Enable support for MySQL database. pgsql Enable support for PostgreSQL database. These options are enabled by default: firefox These options are currently enabled: mozilla ssl
以下の変数を mk.conf
で定義して、
パッケージに対してどのオプションを有効にするかを選んでおくことができます:
PKG_DEFAULT_OPTIONS
は、対応している全パッケージを対象に、
オプションを選択または無効化するために使うことができます。
PKG_OPTIONS.
は、特定のパッケージ pkgbase
pkgbase
を対象に、
オプションを選択または無効化するために使うことができます。
この両変数で列挙された各変数が選択され、“-”
が先頭についた変数は無効化されます。いくつか例を示します。
$
grep "PKG.*OPTION"mk.conf
PKG_DEFAULT_OPTIONS= -arts -dvdread -esound PKG_OPTIONS.kdebase= debug -sasl PKG_OPTIONS.apache= suexec
ここで重要なことは、 パッケージのメンテナーがこの方法を使って標準状態のオプションを提示している場合、 そのオプションを選択したくなければ明示的に削除する必要があるということです。 よくわからない場合は、make show-options を使ってオプションの設定状況を調べることができます。
以下の各設定は、以下に掲げた順に適用されます。 このため、あるオプションは、 それが最後に選択または無効化された設定に従って選択または無効化されます。
パッケージのメンテナーが提示した、 標準状態のオプション
旧式の変数 (後述) の設定から導かれるオプション
PKG_DEFAULT_OPTIONS
PKG_OPTIONS.
pkgbase
互いに排他的なオプション群からは、 最後に選択されたオプションが使われ、それ以外のオプションは自動的に無効化されます。 オプション群のあるオプションが明示的に無効化された場合は、 その前に選択されたオプションがあれば、それが使われます。 必須のオプション群からどのオプションも選択されなかった場合は、 エラーとなり、パッケージの構築は失敗します。
このオプションの枠組が導入される前は、
構築オプションは mk.conf
で各オプションごとの変数 (たいていは
USE_
という名前)
を設定することで選択していました。
利用者が現在のオプションの枠組に容易に移行できるようにするため、
このような旧式の変数は、適切なオプションの設定
(FOO
PKG_OPTIONS.
)
に自動的に変換されます。利用者に対しては、
pkgbase
mk.conf
を更新してオプションの枠組を直接使うよう促す警告が表示されます。
旧式の変数への対応は、いずれ打ち切られる予定です。
Table of Contents
パッケージを構築しインストールしたら、 pkg_add(1) を使って別のシステムにインストールすることができるバイナリーパッ ケージを作ることができます。 こうすると、複数のホストで同じパッケージを構築するような、 CPU時間の無駄をなくすことができます。 また、あなたのバイナリーパッケージを配布して、 他の人が簡単にインストールできるようにすることもできます。
バイナリーパッケージを作るには、pkgsrc の適切なディレクトリーへ移動したうえで、 make package を実行します。
#
cd misc/figlet
#
make package
これにより、パッケージが構築、インストール(もし、まだ済んでいなけれ
ば)され、インストールされたパッケージからバイナリーパッケージが構築
されます。これはpkg_*ツールを使い操作できます。
バイナリーパッケージは/usr/pkgsrc/packages
以下に、gzipされたtarファイルとして作成されます。
上記のmisc/figlet
の例の続きは、Section B.2, “figlet のパッケージング”を参照して下さい。
このようなバイナリーパッケージを提出する方法については、このドキュメント の後のChapter 21, 提出およびコミットを参照してください。
Section 17.17, “他の役に立つターゲット”を参照してください。
Table of Contents
同じパッケージが動くマシンが複数ある場合、 それぞれのマシンでソースからパッケージを構築するのは、時間の無駄です。 バイナリーパッケージ一式を作る方法が二通りあります。 古いバルクビルドシステムと、新しい (2007 年からの) 分散バルクビルド (parallel bulk build, pbulk) システムです。本章では、 構築したパッケージが有用なものにできるよう、 この二通りのバルクビルドの設定方法を説明します。
バルクビルドを最後までおこなうには、数日、あるいは数週間かかることもあります。 このため、始める前に、その準備について考えたほうがよいでしょう。 少なくとも、以下の点に注意を払ってください。
バイナリーパッケージを ftp.NetBSD.org にアップロードしたい場合、バイナリーパッケージに関する以下の条件を、 かならず満たすようにします。
ftp.NetBSD.org に置かれるパッケージは、 NetBSD 開発者が、信頼のおけるマシン (つまり、あなたが root 権限を持っており、かつ、 あなただけが root 権限を持つマシン) で構築したものである必要があります。
ftp.NetBSD.org には、安定版の枝 (たとえば 2009Q1 など) から作成されたものだけを置くようにします。これは、利用者が一見しただけで、 置かれているパッケージがどれだけ古いものかわかるようにするためです。
パッケージは root で構築する必要があります。 パッケージのなかには、実行時に set-uid バイナリーを必要とするものがあり、 今のところ、そのようなパッケージを特権ユーザー以外で作成すると、うまく動作しないからです。
バルクビルドによって、お使いのシステムが壊されることのないようにしてください。
バルクビルドの大半は、root 権限で動くので、少なくとも chroot 環境か、
(お使いのオペレーティングシステムに応じた) 何らかの制限環境で実行するようにします。
個々のパッケージが、ファイルを
LOCALBASE
以外の場所にインストールしようとしたり、
/etc
にあるファイルを編集しようとしたりする事例が、
いくつもあります。
さらに、バルクビルドでは、その過程において、
/usr/pkg
(あるいは
LOCALBASE
で設定された場所)
にパッケージをインストールしたりアンインストールしたりするので、
構築中は、どのパッケージも必要ない (アンインストールされても困らない)
ようにしておいてください。
完全なバルクビルドには、大量のディスク容量が必要です。 ディスクスペースの一部は読み取り専用でもかまいませんが、 書き込みが必要なものもあります。 ディスクスペースの一部はリモートファイルシステム (NFS など) でもかまいませんが、 ローカルとしたほうがよいものもあります。 ディスクスペースの一部は一時ファイルシステムでもかまいませんが、 突然リブートしても平気な (恒久的な) ファイルシステムが必要なものもあります。
10 GB: distfile 用 (要読み書き、リモート可、一時可)
10 GB: バイナリーパッケージ用 (要読み書き、リモート可、要恒久)
400 MB: pkgsrc ツリー用 (読み取り専用可、リモート可、要恒久)
5 GB: LOCALBASE
用 (要読み書き、ローカル推奨、pbulk では一時可、旧形式では要恒久)
5 GB: ログファイル用 (要読み書き、リモート可、要恒久ファイルシステム)
5 GB: 一時ファイル用 (要読み書き、ローカル推奨、一時ファイルシステム可)
バルクビルドには、二つの方式があります。 旧方式のバルクビルドと、新方式の “pbulk” です。 後者の方式をおすすめします。
build.conf
ファイルは、
バルクビルドの主たる設定ファイルです。pkgsrc ツリーを最新に保つ方法、
distfile のダウンロード方法、パッケージの構築方法や、
報告の作成方法を設定することができます。註釈つきの設定例が
pkgsrc/mk/bulk/build.conf-example
にあります。
これを使うには、build.conf-example
を
build.conf
にコピーし、
このファイル中のコメントに従って編集します。
mk.conf
mk.conf
で以下の変数を設定するとよいでしょう。デフォルト設定についての詳細
はpkgsrc/mk/defaults/mk.conf
を見てください。
ACCEPTABLE_LICENSES
はローカルポリシーに適合するようにしておきます。
この例では SKIP_LICENSE_CHECK=yes
としており、
ライセンスの検査を一切おこないません。
PACKAGES?= ${_PKGSRCDIR}/packages/${MACHINE_ARCH} WRKOBJDIR?= /usr/tmp/pkgsrc # build here instead of in pkgsrc BSDSRCDIR= /usr/src BSDXSRCDIR= /usr/xsrc # for x11/xservers OBJHOSTNAME?= yes # use work.`hostname` FAILOVER_FETCH= yes # insist on the correct checksum PKG_DEVELOPER?= yes SKIP_LICENSE_CHECK= yes
バルクビルド用として、特に有用なオプションが、
mk/bulk/bsd.bulk-pkg.mk
の冒頭にいくつかあります。そのなかでも最も有用な部類のものを、
ここで簡単に説明します。
遅いマシンを使っている場合は、
USE_BULK_BROKEN_CHECK
を
“no” に設定するとよいでしょう。
読み出し専用の pkgsrc ツリーを使ってバルクビルドをする場合は、
ログファイルが作られるディレクトリーとして BULKFILESDIR
を設定する必要があります。そうしないと、
pkgsrc ディレクトリー内にログファイルが作られます。
このほか、重要な変数として
BULK_PREREQ
があります。
これは、他のパッケージを構築する際には常に使える状態になっているべきパッケージを
並べたリストです。
その他、いくつかのオプションが、 pkgsrc の基盤内に散在しています。
ALLOW_VULNERABLE_PACKAGES
は yes
に設定するようにします。
バルクビルドの目的はバイナリーパッケージを作ることであり、
脆弱性の有無は重要ではありません。
この変数を設定しておかないと、バルクビルドにおいて、
脆弱性のあるパッケージを構築しようとしなくなるため、
構築でエラーがあっても検出できなくなってしまいます。
CHECK_FILES
(pkgsrc/mk/check/check-files.mk
) を
“yes” に設定すると、インストールされた一連のファイルが
PLIST
と一致することを確認することができます。
CHECK_INTERPRETER
(pkgsrc/mk/check/check-interpreter.mk
) を
“yes” に設定すると、インストールされた
“#!” で始まるスクリプトが、
指定されたインタープリターを見つけられることを確認することができます。
PKGSRC_RUN_TEST
を
“yes
” に設定して、
各パッケージのインストール前に自己診断を実行することができます。
なお、パッケージのなかには“良質の”乱数を大量に使うものがあるので、
バルクビルドを実行しているマシンが、
完全なアイドル状態にはならないようにする必要があります。
さもないと、一部の診断プログラムが、
新しい乱数データが使えるようになるのを待つ間、
ハングしているかのように見えるようになります。
バルクビルドでは、ビルド前の段階の最後に、サイト独自の作業を行なうよう設定
することができます。/usr/pkgsrc/mk/bulk
に
pre-build.local
ファイルがあると、ビ
ルド前の段階の最後に、このファイルが(sh(1)スクリプトとして)実行されます。
pre-build.local
の使い方の例としては、このファイルに
echo "I do not have enough disk space to build this pig." \ > misc/openoffice/$BROKENF
のような内容を書いておいて、3 GB近くのディスク容量が必要な個々のパッケージ の構築をしないようにする、というものがあります。
/usr/pkg
はバルクビルド開始時に完全に削除されるので、ログインシェルが別の場
所にあることを確認してください。ログインシェルを/usr/local/bin
に移して(それ
に合わせて passwd ファイルも修正して)おくか、/etc/rc.local
でpkg_add(1)を使っ
て(再)インストールするようにしておきます。これでリブート後もログインできま
す(パッケージが削除されてもシェルのプロセスは死なず、シェルを新たに起動でき
なくなるだけです)。また、1.5より前のNetBSDを使っていたり、何らかの
理由でpkgsrc版のsshを使いたい場合は、rc.local
でsshdが起動する前にsshをイン
ストールするようにしておきます:
(cd /usr/pkgsrc/security/ssh && make bulk-install) if [ -f /usr/pkg/etc/rc.d/sshd ]; then /usr/pkg/etc/rc.d/sshd fi
こうしておかないと、バルクビルド終了後や、あるいはマシンがリブートやクラッ シュした場合にsshでログインできなくなります。警告しておきましたよ! :)
すでにインストールされているどのパッケージも必要ない状態にしてください。
バルクビルドの過程で、すべてのパッケージ、
設定ファイルと、さらに、
/var
, /home
その他の場所にあるファイルがいくつか削除されます。
なので、システムに悪影響を与えるおそれのある権限で、
バルクビルドを実行しないでください。
その他、
構築の妨げになりうるもの(/usr/local
にインストールされているライブラリーなど)
もすべて削除しておいてください。root になって、以下のようにタイプします:
#
cd /usr/pkgsrc
#
sh mk/bulk/build
何らかの理由で前回の構築が完了していない場合(電源断、システムパニックなど) は、以下を実行すると、その続きをすることができます:
#
sh mk/bulk/build restart
バルクビルドが終わると、その要約がメールで届きます。また、build.conf
ファイルのFTP
で指定したディレクトリーに、構築ログがあります。
バルクビルドは三つの段階からなります:
スクリプトがpkgsrcツリーを(anon)cvsで更新します。そして、壊れている distfileをすべて一掃し、インストールされているパッケージをすべて削 除します。
これは基本的に、 “make bulk-package”を、パッケージの構築順 序を最適化しておこなうものです。他のパッケージに依存しないパッケー ジが最初に構築され、多くの依存関係を持つパッケージは後に構築されま す。
報告を作成し、build.conf
で指定されたディレクトリーに
broken.html
という名前で置きます。あわせて、この報告の簡略版が
構築管理者にメールで送られます。
構築中、壊れているパッケージの一覧が/usr/pkgsrc/.broken
(OBJMACHINE
が設定されている場合は
.../.broken.${MACHINE}
)
に作られ、構築が壊れているものの個々の
構築ログは、各パッケージのディレクトリーに置かれます。これらのファイルは、
壊れているパッケージを再度構築しようとするような無駄をなくすために、bulk-ター
ゲットが構築が壊れていることを記録するのに使われます。また、壊れているパッ
ケージを後でデバッグするためにも使えます。
現在、 NetBSD 2.0/i386 ではおおむね以下の容量が必要です:
10 GB - distfile (NFSでも可)
8 GB - 全バイナリー一式 (NFSでも可)
5 GB - コンパイル用の一時領域 (ローカルディスクを推奨)
各パッケージは、バイナリーパッケージ作成直後にアンインストールされた上、 ソースも削除されます。このため、莫大なディスク容量は必要ありません。後 になって、このパッケージがまた必要となった場合は、再度構築することなく pkg_add(1) でインストールされるので、 無駄な再コンパイルの繰り返しは発生しません。
バルクビルドによってパッケージを全部消される(マシンがパッケージのコンパイル 以外に無用なものになってしまう)のが嫌な場合は、chroot環境下でパッケージをバ ルクビルドすることもできます。
最初にすることは、chrootされた砂場を、
たとえば/usr/sandbox
に用意することです。
これは null マウントを使って、または手動でおこなうことができます。
pkgsrc/mk/bulk/mksandbox
というシェルスクリプトがあり、
null マウントを使った砂場の環境を用意してくれます。このスクリプトは、
砂場の環境のルートに sandbox
というスクリプトも作ります。
これは、sandbox mount コマンドで null マウントをした状態にしたり、
sandbox umount
コマンドでアンマウントした状態にしたりすることができるものです。
砂場の環境を手動で用意するには、
NetBSDのインストール配布物をすべて展開するか、/usr/src/etc
で
make distribution DESTDIR=/usr/sandboxを実行した後、以下のものを用意して
適切に設定された状態にします。
カーネル
#
cp /netbsd /usr/sandbox
/dev/*
#
cd /usr/sandbox/dev ; sh MAKEDEV all
/etc/resolv.conf
(security/smtpd
およびメール用):
#
cp /etc/resolv.conf /usr/sandbox/etc
動作する(!)ようなメールの設定 (hostname, sendmail.cf):
#
cp /etc/mail/sendmail.cf /usr/sandbox/etc/mail
/etc/localtime
(security/smtpd
用):
#
ln -sf /usr/share/zoneinfo/UTC /usr/sandbox/etc/localtime
/usr/src
(たとえば
sysutils/aperture
用のシステムソース):
#
ln -s ../disk1/cvs .
#
ln -s cvs/src-2.0 src
/var/db/pkg
を作成する(デフォルトのインストールには含まれません):
#
mkdir /usr/sandbox/var/db/pkg
/usr/pkg
を作成する(デフォルトのインストールには含まれません):
#
mkdir /usr/sandbox/usr/pkg
cvs を使って、/usr/sandbox/usr/pkgsrc
内にpkgsrcをチェックアウトする:
#
cd /usr/sandbox/usr
#
cvs -d anoncvs@anoncvs.NetBSD.org:/cvsroot checkout -d -P pkgsrc
この pkgsrc ツリーを、開発用の pkgsrc ツリーにマウントしたりリンクしたりしてはいけません。 そういうことをすると問題を起こしがちだからです。
/usr/sandbox/usr/pkgsrc/packages
と
.../distfiles
が、適切な場所を指すようにする。
これらは NFS や nullfs でマウントしておくと便利かもしれません。
mk.conf
を編集する。Section 7.3.1.2, “mk.conf
”参照。
mk/bulk/build.conf
を必要に合わせて調整する。
chroot砂場の用意ができれば、 以下の手順で構築を開始できます:
#
cd /usr/sandbox/usr/pkgsrc
#
sh mk/bulk/do-sandbox-build
このコマンドは、砂場内に移動して、構築を開始するものです。構築が終わ
ると、構築の結果がメールで送信されます。できあがったバイナリーパッケージは、
/usr/sandbox/usr/pkgsrc/packages
(の指す/マウントされた先/元)に置かれます。
pkgsrc/mk/bulk/build
スクリプトは、
pkgsrc の全パッケージの一式の構築のほか、
pkgsrc に含まれるパッケージの部分集合の構築にも使うことができます。
mk.conf
で SPECIFIC_PKGS
を定義すると、
SITE_SPECIFIC_PKGS
HOST_SPECIFIC_PKGS
GROUP_SPECIFIC_PKGS
USER_SPECIFIC_PKGS
の各変数で構築対象のパッケージを定義できるようになります。 構築対象として定義されたパッケージの依存関係によって必要となるパッケージも、 バルクビルドのコードが構築対象に追加します。
この使い方のひとつに、
サイトで必要なバイナリーパッケージをすべて用意するために、
SPECIFIC_PKGS
を使ったバルクビルドを
chroot 環境で定期的に実行するというものがあります。
こうすれば、不要なパッケージまで構築するような余計な負荷はかかりません。
本節では、pkgsrc 開発者がバルクビルドで構築したバイナリーパッケージを ftp.NetBSD.org へアップロードする方法を説明します。
アップロードしようとしているバイナリーパッケージの
チェックサムファイルを自動生成したい場合は、
mk/bulk/build.conf
で
MKSUMS=yes
を忘れずに設定してください。
チェックサムファイルに PGP 署名をしたい場合
(そうすることを強くおすすめします)は、
mk/bulk/build.conf
で
SIGN_AS=username@NetBSD.org
を忘れずに設定してください。
こうしておくと、ファイルをアップロードする前には常に、そのファイルに署名するため、
GPG パスワードの入力を促すようになります。
次に、mk/bulk/build.conf
ファイルで
RSYNC_DST
が適切に設定された状態にします。
つまり、この変数値を以下のような形式に調節します。
RSYNC_DST=ftp.NetBSD.org:/pub/pkgsrc/packages/NetBSD/arch/a.b.c-20xxQy/upload
このなかの "20xxQy" (枝), "a.b.c" (OS のバージョン), "arch" を、適切な値にしてください。 ftp.NetBSD.org でのログイン名がローカルのログイン名と異なる場合は、 そのログイン名を直接指定します。たとえば、 筆者のローカルアカウントは "feyrer" ですが、ログイン名は "hubertf" なので、以下のようにします。
RSYNC_DST=hubertf@ftp.NetBSD.org:/pub/pkgsrc/packages/NetBSD/arch/a.b.c-20xxQy/upload
ここでは、アップロードの最中はディレクトリーを公開しないようにするため、
独立した upload
ディレクトリーにアップロードします。
そうするために、ftp.NetBSD.org で以下のコマンドを実行しておきます。
nbftp% mkdir -p -m 750 /pub/pkgsrc/packages/NetBSD/arch/a.b.c-20xxQy/upload
バイナリーパッケージをアップロードする前に、以下のような ssh の認証が必要となります。以下の例は、砂場内における root アカウント用の一時的な鍵を使うようにする方法です。 (同じ鍵を常時使うことはしないものとします)。
#
chroot /usr/sandbox
chroot-#
rm $HOME/.ssh/id-dsa*
chroot-#
ssh-keygen -t rsa
chroot-#
cat $HOME/.ssh/id-rsa.pub
ここで出力した id-rsa.pub
の内容を、
ftp.NetBSD.org の ~/.ssh/authorized_keys
ファイルに追加します。パッケージのアップロードが終わったら、
この鍵は削除してください。
次に、ssh でうまく接続できることを確認します。
chroot-#
ssh ftp.NetBSD.org date
ここでは、適宜 "-l yourNetBSDlogin" を使ってください。
すべて順調にいけば、 砂場から抜けて、アップロードを始めることができます。
chroot-#
exit
#
cd /usr/sandbox/usr/pkgsrc
#
sh mk/bulk/do-sandbox-upload
アップロードにはそれなりに時間がかかるかもしれません。 FTP サーバーで ls(1) や du(1) して、アップロードの過程を見てください。 アップロード用スクリプトは、制限つきのパッケージはアップロードしないように 処理してくれます。
アップロードが終わった後に、最初にすることは、ssh でアクセスして以下のようにすることです。
nbftp% vi ~/.ssh/authorized_keys
Gdd:x!
アップロード用に事前に追加しておいた鍵はすべて削除してください。
最後に、アップロードしたパッケージを
upload
ディレクトリーの外に出して、
公開された状態にします。
nbftp%cd /pub/pkgsrc/packages/NetBSD/arch/a.b.c-20xxQy
nbftp%mv upload/* .
nbftp%rmdir upload
nbftp%chgrp -R netbsd .
nbftp%find . -type d | xargs chmod 775
pbulk 方式のバルクビルドの実行の概要は、以下のとおりです。
最初に、まっさらな pkgsrc ツリー内で pbulk 基盤を構築する。
次に、この pbulk 基盤を使って、まっさらの pkgsrc ディレクトリーから個々のパッケージを構築する。
最初に、pbulk 基盤を作るための pkgsrc 基盤を作る必要があります。プラットフォームが何であっても (NetBSD であっても)、専用のディレクトリーを用意してそこに対して bootstrap をしてください。このディレクトリーは /usr/pbulk
または $HOME/pbulk
としましょう。bootstrap すると、バルクビルドに必要なツールがインストールされます。
$cd /usr/pkgsrc
$./bootstrap/bootstrap --prefix=/usr/pbulk --varbase=/usr/pbulk/var --workdir=/tmp/pbulk-bootstrap
$rm -rf /tmp/pbulk-bootstrap
これで、pbulk 基盤のための基本的な環境がインストールされましたが、いくつかのツールはまだありません。ここで、pkgsrc の設定ファイル /usr/pbulk/etc/mk.conf
を pbulk 向けに編集しましょう。ここでの典型的な設定内容は以下のとおりです。
, より多くの整合性確認をするためPKG_DEVELOPER
=yes
, WRKOBJDIR
=/tmp/pbulk-outer/usr/pkgsrc
にいかなる変更も加わらないようにするため
, ダウンロードされた distfile (pbluk 基盤および構築するパッケージ用) を、すべて、ただひとつのデイレクトリーに置くようにするためDISTDIR
=/distfiles
, 普及しているフリー/オープンソースライセンスのうち許容できるものを追加するためACCEPTABLE_LICENSES
+=...
, ライセンスの検査を省略するためSKIP_LICENSE_CHECK
=yes
これで、pbulk 基盤の残りの部分を構築する準備ができました。
$cd pkgtools/pbulk
$/usr/pbulk/bin/bmake install
$rm -rf /tmp/pbulk-outer
これで、pbulk 基盤が構築・インストールされました。この基盤を設定したうえで、さらなる準備が必要です。そうした後に、実際のバルクビルドを始めることができるようになります。
pkgsrcのバルクビルド完了後、できあがったバイナリーパッケージからCD-ROMを作っ
て、他のマシンへのインストール用に使うことができます。
pkgtools/cdpack
パッケージに、そのようなISO 9660イメージ作成用の簡単
なツールがあります。cdpackは、依存関係が一枚のCD内で完結するように、パッ
ケージを複数枚のCD-ROMに編集してくれます。
cdpackの完全なドキュメンテーションはcdpack(1)マニュアルページにあります。
以下の短い例では、
バイナリーパッケージが/usr/pkgsrc/packages/All
に置いてあり、ISO 9660イメー
ジ用の十分なディスク容量が/u2
にあるものとします。
#
mkdir /u2/images
#
pkg_add /usr/pkgsrc/packages/All/cdpack
#
cdpack /usr/pkgsrc/packages/All /u2/images
各CDに共通ファイル(COPYRIGHT
, README
, など)を含めたい場合は、そのファイルを
含むディレクトリーを作る必要があります。たとえば以下のようにします。
#
mkdir /tmp/common
#
echo "This is a README" > /tmp/common/README
#
echo "Another file" > /tmp/common/COPYING
#
mkdir /tmp/common/bin
#
echo "#!/bin/sh" > /tmp/common/bin/myscript
#
echo "echo Hello world" >> /tmp/common/bin/myscript
#
chmod 755 /tmp/common/bin/myscript
ここで、以下のようにしてイメージを作成します。
#
cdpack -x /tmp/common /usr/pkgsrc/packages/All /u2/images
こうすると、各イメージのルートディレクトリーにREADME
, COPYING
および
bin/myscript
が含まれるようになります。
Table of Contents
pkgsrc を使ってインストールされたファイルは、ベースシステムの
/usr
ディレクトリー以下と似た配置で体系化されていますが、
細かい点がいくらか異なっています。これは、pkgsrc がもともと FreeBSD
から派生したものであり、FreeBSD のファイルシステム階層に準じていたからです。
その後は NetBSD の影響を大きく受けています。
ただし、pkgsrc をどのオペレーティングシステムで使っているかにかかわらず、
pkgsrc の配置は同じになると思っていただいて結構です。
pkgsrc 用のルートディレクトリーは、主に四つあり、いずれも
bootstrap/bootstrap
スクリプトで設定可能です。
pkgsrc を root としてインストールした場合の、
標準の場所は以下のとおりです。
LOCALBASE= /usr/pkg PKG_SYSCONFBASE= /usr/pkg/etc VARBASE= /var PKG_DBDIR= /var/db/pkg
非特権モード (pkgsrc を root 以外のユーザーとしてインストールした場合) での、標準の場所は以下のとおりです。
LOCALBASE= ${HOME}/pkg PKG_SYSCONFBASE= ${HOME}/pkg/etc VARBASE= ${HOME}/pkg/var PKG_DBDIR= ${HOME}/pkg/var/db/pkg
この四つのディレクトリーの使用目的とその内容は、 以下で説明します。
LOCALBASE
は、ベースシステムの
/usr
ディレクトリーに対応します。
ファイルがインストールされる場所として“主たる”ディレクトリーであり、
bin
,
include
, lib
,
share
,
sbin
などのよく知られたサブディレクトリーがあります。
VARBASE
は、ベースシステムの
/var
に対応します。
一部のプログラム (特に、ゲームとネットワークデーモン) は、
通常の操作時に、このディレクトリーへの書き込み権限を持っている必要があります。
PKG_SYSCONFDIR
は、ベースシステムの
/etc
に対応します。
pkgsrc 自体の設定ファイル mk.conf
のほか、
個々のパッケージの設定ファイルを含みます。
pkgsrc を通常にインストールした場合、${LOCALBASE}
以下には以下のディレクトリーが存在します。
bin
エンドユーザーが直接使うことを前提とした、 実行形式のプログラムを含みます。
emul
特に NetBSD 用の、 他の各種オペレーティングシステムのエミュレーション層用のファイルを含みます。
etc
(${PKG_SYSCONFDIR}
の通常の場所)設定ファイルを含みます。
include
C および C++ プログラミング言語用のヘッダーを含みます。
info
各種パッケージの GNU info ファイルを含みます。
lib
静的共有ライブラリーを含みます。
libdata
インストール後に変更されることがないデータファイルを含みます。
変更されることのあるデータファイルは
${VARBASE}
以下に置かれます。
libexec
補助プログラムやネットワークデーモンなど、 エンドユーザーが直接使うことを前提としないプログラムを含みます。
libexec/cgi-bin
web サーバーが CGI スクリプトとして実行することを前提としたプログラムを含みます。
man
(${PKGMANDIR}
の通常の値)マニュアルページ形式の短いドキュメンテーションを含みます。
sbin
スーパーユーザーだけが使うことを前提としたプログラムを含みます。
share
インストール後に変更されることがないプラットフォーム独立のデータファイルを含みます。
share/doc
パッケージに附属するドキュメンテーションファイルを含みます。
share/examples
パッケージに附属する例ファイルを含みます。
設定ファイルの原本も、インストール時にここに保存されたうえで
${PKG_SYSCONFDIR}
へコピーされます。
share/examples/rc.d
rc.d スクリプトファイルの原本を含みます。
var
(${VARBASE}
の通常の場所)インストール後に変更されることのあるファイルを含みます。
Table of Contents
CFLAGS
を無視するパッケージがあるのはなぜ?この節では、pkgsrc の特別な事柄に関する助言、技巧や要領のうち、 前章までに適当な掲載場所がなかったものを掲載しています。 ここでは、pkgsrc 利用者向けの情報と pkgsrc 開発者向けの情報を、どちらも掲載します。
pkgsrc の利用者向けに、以下のようなメーリングリストがあります。
pkgsrc-users: pkgsrc 関連の話題のほとんどをプラットフォームにかかわらず扱う汎用目的のメーリングリストです。 たとえば、pkgsrc の設定に関する助けの要請、 予期しない構築失敗、個々のパッケージの使用、 インストールした pkgsrc の更新、pkgsrc リリース枝に関する質問などです。 ここには、一般的なお知らせや、pkgsrc 利用者コミュニティーに影響のある変更 (たとえば、大規模な基盤の変更、新機能、パッケージ削除など) の提案も投稿されることがあります。
pkgsrc-bulk: pkgsrc のバルクビルドの結果が送付され、 その議論がおこなわれるメーリングリストです。
pkgsrc-changes: pkgsrc のすべての変更についての commit メッセージが流れるメーリングリストです。 毎日、 24 時間分のすべての commit メッセージをまとめて送る、 ダイジェスト版もあります。
参加するためには以下のようにして下さい。
%
echo subscribelistname
| mail majordomo@NetBSD.org
以上の各メーリングリストのアーカイブは http://mail-index.NetBSD.org/ から辿れます。
pkgviews は buildlink に密接に統合されています。
pkgviews の利用者向けの手引きは
pkgsrc/mk/buildlink3/PKGVIEWS_UG
にあります。
pkgsrc/pkgtools
ディレクトリー以下には、
pkgsrc の利用者および開発者それぞれにとって便利なユーティリティーがいくつもあります。
この節の目的は、このユーティリティーの存在と、
どんな場合に有用かを知っていただくことだけであり、
各パッケージの附属ドキュメントを引き写すことではありません。
pkgsrc が使用するユーティリティー (必要に応じて自動的にインストールされます):
pkgtools/x11-links
:
buildlink が使用するシンボリックリンクです。
OS ツールの拡張 (必要に応じて自動的にインストールされます):
pkgtools/digest
:
各種チェックサム(SHA1 など) を計算します。
pkgtools/libnbcompat
:
pkgsrc ツール用の互換ライブラリーです。
pkgtools/mtree
: BSD 以外のシステムにはネイティブの
mtree がないため、これがインストールされます。
pkgtools/pkg_install
:
/usr/sbin/pkg_install
を最新版に置き換えます。または、
pkg_install のないオペレーティングシステム用です。
pkgsrc が使用するユーティリティー (自動ではインストールされません):
pkgtools/pkg_tarup
:
インストールされているパッケージをもとに、
バイナリーパッケージを作成します。 make replace
が古いパッケージを保存するのに使います。
pkgtools/dfdisk
:
distfile を複数の場所から
fetch できる機能を pkgsrc に追加します。現在のところ、
以下の方法に対応しています: 複数の CD-ROM および FTP/HTTP
のネットワーク接続。
pkgtools/xpkgwedge
: X11 パッケージの場所を変えます
(標準で有効となります)。
devel/cpuflags
: お使いの CPU とコンパイラー用にコードを最適化するための
コンパイラーのフラグを考えてくれます。
インストールしたパッケージの追跡や最新への追従用などのユーティリティー:
pkgtools/pkg_chk
: インストールされているパッケージのバージョンが
pkgsrc の最新バージョンと異なるものを報告します。
pkgtools/pkgdep
: パッケージ更新計画の策定を支援するため、
パッケージの依存関係のグラフを作成します。
pkgtools/pkgdepgraph
: pkgtools/pkgdep
の出力をもとに
(graphviz を使って) 図表を作成します。
pkgtools/pkglint
: pkglint(1) プログラムは
pkgsrc の個々のパッケージに誤りがないか検査します。
pkgtools/lintpkgsrc
: lintpkgsrc(1) プログラムは
pkgsrc システム全体に対して各種の検査をおこないます。
pkgtools/pkgsurvey
:
インストール済みのパッケージを報告します。
個々のパッケージの保守や作成をする人のためのユーティリティー:
pkgtools/pkgdiff
: パッケージ用のパッチの作成や保守を自動化します
(pkgdiff, pkgvi, mkpatches, ...
が含まれます)。
pkgtools/rpm2pkg
,
pkgtools/url2pkg
: pkgsrc
への変換の補助ツールです。
pkgtools/gensolpkg
: pkgsrc を Solaris
パッケージに変換します。
pkgsrc を保守する人のためのユーティリティー (あるいは、もっと地味な pkg ユーティリティー)
pkgtools/pkg_comp
: chroot
領域でパッケージを構築します。
pkgtools/libkver
: chroot 環境でのクロス構築用に、
カーネルのバージョンを誤魔化します。
pkgsrc を root 以外のユーザーで使いたい場合は、いくつかの変数を設定すれば、
そのような環境で pkgsrc が動くようにすることができます。
最低限、UNPRIVILEGED
を “yes”
に設定することが必要です。こうすると非特権モードに切り替わり、
関連のある複数の変数が設定されて、
root 以外のユーザーがパッケージをインストールできるようになります。
標準状態の非特権モードでは不十分な場合は、
他の変数を調節するとよいでしょう。たとえば、
ユーザーやグループの自動検出により正しくない (あるいは使いたくない)
値が検出される場合は、それぞれ、
UNPRIVILEGED_USER
や
UNPRIVILEGED_GROUP
を設定すれば変更することができます。
なお、ブートストラップについては、bootstrap
スクリプトに “--ignore-user-check” フラグを与えると、
標準で使われるインストール先が
~/pkg
以下の複数のディレクトリーになるため、
非 root 用の構成にしやすくなることを覚えておいてください。このディレクトリーは、
他のディレクトリーの配置が細かく調節可能であるのと同様に、
スクリプトに “--prefix”
フラグを与えて上書きすることができます。
標準では、pkgsrc の転送再開機能は有効になっていませんが、
mk.conf
にオプション
PKG_RESUME_TRANSFERS=YES
を追加すれば、
この機能を有効にすることができます。こうすると、fetch している最中に、
不完全な distfile があった場合、pkgsrc はそのファイルの残りの部分を取得しようとします。
また、
FETCH_CMD
変数を変更すれば、
標準である ftp(1) 以外のプログラムを使うこともできます。
この変数値を ftp, fetch, wget または curl にすると、指定したプログラムを使うことができます。
このほか、変数値を manual にすると、取得をしないようにすることができます。
変数値を custom にすると、システム標準の設定を使わないようになり、
取得プログラムに対する依存性も追わないようになります。
この場合は、FETCH_CMD
, FETCH_BEFORE_ARGS
,
FETCH_RESUME_ARGS
, FETCH_OUTPUT_ARGS
,
FETCH_AFTER_ARGS
の各変数を設定する必要があります。
たとえば、
ダウンロードに wget
を使いたい場合は、以下のような設定が必要です。
FETCH_USING= wget
システム附属の X11 (/usr/X11R6
,
/usr/openwin
, ...) ではなく pkgsrc の
modular X.org を使いたい場合は、mk.conf
に以下の行を追加する必要があります。
X11_TYPE=modular
DragonFly オペレーティングシステムは、標準で、 この pkgsrc の modular X.org の X11 の実装を使います。
もし、あなたが防火壁の内側にいて、インターネットのホストに直接接続できない (つまりNATを使っていない)場合、適切なプロキシーホストを指定することができます。 これはURL形式の環境変数で指定します。例えば、Amdahlドメインにおいては、 “orpheus.amdahl.com” というマシンは防火壁のひとつで、プロキシーポート番号として、 80番のポートを使用します。この場合、proxy環境変数は以下のようになります。
ftp_proxy=ftp://orpheus.amdahl.com:80/ http_proxy=http://orpheus.amdahl.com:80/
distfileの取得にどのユーティリティーを使っているかによります。
bsd.pkg.mk
は、以下のリストのなかで利用可能なコマンドのうち、
最初のものをFETCH_CMD
に割り当てます:
${LOCALBASE}/bin/ftp
/usr/bin/ftp
NetBSD のデフォルトのインストールでは、/usr/bin/ftp
となり、これは自動的に、
最初はパッシブ接続を試みます。そして、サーバーがパッシブ接続を拒否した場合
は、アクティブ接続に切り替わります。これ以外のツールの場合は、
mk.conf
に以下の設定を追加してください。
PASSIVE_FETCH=1
これを設定すると、
/usr/bin/ftp
はアクティブ転送への切り替えをおこなわなくなります。
make fetchを実行できない職場や大学において、 一回のバッチ処理で、すべてのdistfileをダウンロードしたいと思うことがあるかもしれません。ftp.NetBSD.org に distfile が置かれていますが、 このディレクトリーをまるごとダウンロードするのは不適切です。
現時点では、make fetch-listを
/usr/pkgsrc
またはそのサブディレクトリーで実行し、
その結果のリストを職場や学校のマシンに持ってきて、使用してくださいとしかいえません。
NetBSD と互換な ftp(1) (tnftpなど)が使えない場合は、
URLを指定して取得ができるコマンドを
FETCH_CMD
に指定することを忘れないでください:
自宅で:
%
cd /usr/pkgsrc
%
make fetch-list FETCH_CMD=wget DISTDIR=/tmp/distfiles >/tmp/fetch.sh
%
scp /tmp/fetch.sh work:/tmp
職場で:
%
sh /tmp/fetch.sh
実行後、 /tmp/distfiles
を
tar で固めて自宅に持って帰ります。
NetBSD で動いているマシンがあって、すべてのdistfile (そのマシンのアーキテクチャー向けではないものも含む)を取得したい場合は、 上述のmake fetch-listの方法を使うか、 以下のようにしてdistfileを直接取得することができます。
%
make mirror-distfiles
NO_{SRC,BIN}_ON_{FTP,CDROM}
も無視したい場合は、
以下のようにしてすべてのものを取得することができます。
%
make fetch NO_SKIP=yes
pkgtools/pkg_install
パッケージのコンパイル時に、makeが
/usr/share/tmac/tmac.andoc
の作り方がわからないというエラーを出します。これは、そのマシンに
NetBSD の基本配布物の“text”セット(nroffなど)
がインストールされていないことを意味しています。マニュアルページの整形ができるようにするため、
“text”セットをインストールしてください。
このpkgtools/pkg_install
パッケージの事例は、
環境変数かmk.conf
のどちらかで
NOMAN=YES
を設定して回避することもできます。
NetBSD のインストール時にコンパイラー一式comp.tgz
をインストールしなかったからです。comp.tgz
を入手し、
/
で展開してインストールしてください:
#
cd /
#
tar --unlink -zxvpf .../comp.tgz
comp.tgz
は NetBSD のどのリリースにも含まれていますので、
あなたがインストールしたリリース (uname
-rで調べられます) に合ったものを入手してください。
パッケージのインストールをroot以外のユーザーで実行し、
root権限が必要なところではpkgsrcの su(1) 機能を使う場合、
必要なパッケージをインストールするたびに
rootのパスワードを打つのは面倒かもしれません。これを避けるために、
パスワードを一定時間保持してくれるsudoパッケージを使うことができます。
sudoを使うには、sudoを(バイナリーパッケージ、またはsecurity/sudo
のいずれかから)
インストールしてから、mk.conf
の、
LOCALBASE
変数の定義より
後の部分に、以下の内容を書いておきます。
.if exists(${LOCALBASE}/bin/sudo) SU_CMD= ${LOCALBASE}/bin/sudo /bin/sh -c .endif
システム管理者は、設定ファイルがインストールされる場所を選ぶことができます。
標準の設定では、設定ファイルはすべて ${PREFIX}/etc
またはそのサブディレクトリー以下にインストールされます。
設定ファイルのインストール先は、あなたの都合 (たとえば、
NFS でエクスポートされた読み込み専用の PREFIX
で、パッケージの設定をマシン毎にする必要がある場合)
にあわせて調整することができます。
標準の設定を変えるために、(mk.conf
で) PKG_SYSCONFBASE
変数を、
好みの設定用ディレクトリーを指すように変えることができます。
一般的な設定例としては、/etc
や
/etc/pkg
などがあります。
さらに、PKG_SYSCONFDIR.${PKG_SYSCONFVAR}
変数を設定することで、パッケージ毎に設定用ディレクトリーを変更することができます。
PKG_SYSCONFVAR
の値は、通常は変更対象のパッケージ名に合わせたもの、
つまり、PKGBASE
の値にします。
なお、この設定を変更した後は、影響を受けるパッケージをすべて再構築し、 再インストールする必要があります。
サードパーティーのソフトウェアにはしばしばバグがあること、
そして、バグのなかにはマシンをアタッカーの攻撃に対して脆弱な状態にするものもあることに、
どうか注意してください。そのような攻撃にさらされることを減らすために、NetBSD
パッケージチームでは、pkgsrc化されたことのあるパッケージに関する既知の攻撃のデータベースを保守しています。
このデータベースを自動的にダウンロードして、
システムにインストールされている全パッケージのセキュリティー監査をおこなうことができます。
これをおこなうには、以下の二つのツール (pkgtools/pkg_install
パッケージの一部としてインストールされます) を使います。
pkg_admin fetch-pkg-vulnerabilities: セキュリティー脆弱性情報のリストの ダウンロードを簡単にできるようにするものです。この脆弱性情報のリストは、 pkgsrc セキュリティーチームが最新の状態に保っており、 NetBSD ftpサーバーで配布されています。
pkg_admin audit: マシンの監査を簡単にできるようにするもので、 既知の各脆弱性の確認をします。 脆弱性のあるパッケージがインストールされていた場合、そのことを標準出力に出力します。 この出力には、脆弱性の種類の説明と詳細情報のURLが含まれます。
これらのツールを使うよう強くおすすめします。
“pkg_install” をインストールした後に、
パッケージのメッセージを読んでください。このメッセージは pkg_info -D
pkg_install
を実行すれば表示できます。
このパッケージをインストールすると、pkgsrc は各パッケージの構築前にこのパッケージを使ってセキュリティーのチェックをするようになります。 このチェックを制御する方法についてはSection 5.2, “構築の過程に影響を及ぼす変数”をご覧ください。
mk.conf
で
CFLAGS
変数に独自の設定をした場合、
設定されたフラグは環境変数によって ./configure
スクリプトに渡されてから make(1) に渡されます。
パッケージの作者によっては、
環境変数で渡された CFLAGS
を、
パッケージの Makefile
で上書きして、
無視するようにしていることがあります。
現在のところ、この問題の解決策はありません。
独自の CFLAGS
を使うことがどうしても必要な場合は、
パッケージのディレクトリーで make patch を実行してから、
Makefile
と
Makefile.in
をすべて調べて、
CFLAGS
を明示的に定義していないかを調べてください。
ふつうは、その部分を削除することができます。
ただし、一部の“小賢しい”プログラマーは、
彼らが選んだ特定の CFLAGS
の組合せのもとでしか動作しないような、
まずいコードを書いていることに注意してください。
使っている pkgsrc ツリーの一貫性を確認します。 この問題の原因としてありがちなのは、 時間などを節約するために pkgsrc の一部だけを更新していたというものです。 pkgsrc は小さなシステムの寄せ集めではなく、ひとつの大きなシステムですので、 pkgsrc ツリー全体を更新しておかないと動かなくなるような変更が時々おこなわれます。
CVS の衝突が起きていないことを確認します。 pkgsrc のファイルすべてについて、 “<<<<<<” や “>>>>>>” という文字列を検索します。
古いパッケージが展開されていないことを確認します。 これを確認するには、make clean clean-depends を実行します。
以上の確認をおこなってもなお問題がある場合は、
pkgsrc-users
メーリングリストにメールを出してください。
あなたが pkgsrc のファイルに変更を加えており、かつ、
他の誰かが CVS リポジトリーにおいて同じファイルに変更を加えています。
この変更がいずれもファイル内の同じ箇所に対するものであるため、
あなたが pkgsrc を更新したときに、変更が衝突したという印を
cvs
コマンドがファイルにつけたのです。
この印があるために、ファイルが妥当な
Makefile
ではなくなっています。
ファイルの内容を見てください。あなたが独自に加えた変更がもはや不要であれば、 ファイルを削除してからそのディレクトリーで cvs -q update -dP を実行し、最新版のファイルをダウンロードすることができます。
この部では、パッケージの作成や変更を扱います。 新しいパッケージを作る “HOWTO” 的な手引きから始めます。 その後の章は、 pkgsrc のリファレンスマニュアルに近いものになっています。
Table of Contents
Makefile
におけるプログラミングmk.conf
から利用者が設定可能な変数を捕まえる方法Table of Contents
あなたが pkgsrc にまだ入っていないパッケージを見つけた場合、 たいていはソースコードをどの URL からダウンロードできるかわかっているでしょう。 この URL をもとにして、 いくつかの段階を踏むだけでパッケージを作成することができます。
最初に、pkgtools/url2pkg
および pkgtools/pkglint
の両パッケージをインストールします。
次に、そのパッケージの属するカテゴリーとして、
最上層のディレクトリーをひとつ選びます。既存のもののかわりに、
専用のディレクトリー (local
など) を作ってもかまいません。
このカテゴリーのディレクトリーの下に、パッケージ用にもうひとつディレクトリーを作り、
その中に移動します。
プログラム url2pkg を実行します。
実行すると URL をたずねてきます。配布ファイル (たいていは
.tar.gz
ファイルです)の URL を入力して、
パッケージの基本的な要素が自動的に作られてゆくようすを観察します。
配布ファイルは自動的に展開され、
Makefile
の詳しい内容の一部を自動的に書いてくれますが、
残りは手動でやる必要があるでしょう。
パッケージの依存性を判断するため、展開されたファイルを調べます。
README
のようなファイルに依存性について書かれているのが理想的ですが、
実際はそうなっていないこともあります。
それぞれの依存先について、それが pkgsrc のどこにあるかを調べて、
依存先のディレクトリーに buildlink3.mk
というファイルがある場合はそれを Makefile
の最後の行の直前でインクルードします。
依存先に buildlink3.mk
がない場合は、
このファイルをまず作ります。buildlink3.mk
ファイルは、
依存先パッケージのインクルードファイルとライブラリーが確実に用意されるようにするためのものです。
単に、あるパッケージに含まれるバイナリーが必要なだけならば、
依存するバージョンと pkgsrc における場所を指定する
DEPENDS
行を Makefile に追加します。
この行は 3 番目の段落に書くようにします。
依存性がパッケージを構築するためだけに必要で、使用するためには必要ない場合は、
DEPENDS
ではなく BUILD_DEPENDS
を使います。
これにより、作成中のパッケージは以下のようになるでしょう。
[...] BUILD_DEPENDS+= lua>=5.0:../../lang/lua DEPENDS+= screen-[0-9]*:../../misc/screen DEPENDS+= screen>=4.0:../../misc/screen [...] .include "../../category
/package
/buildlink3.mk" .include "../../devel/glib2/buildlink3.mk" .include "../../mk/bsd.pkg.mk"
パッケージを“使い物”にするにはあと何をする必要があるかを確認するため、 pkglint を実行します。 pkglint のメッセージの意味がわからない場合は、 追加説明を出力してくれる pkglint --explain または pkglint -e を試してみてください。
多くの場合、パッケージはまだ構築できるようにはなっていません。 もっともありがちな場合については、次の節Section 10.1, “ありがちな種類のパッケージ”で説明しています。この説明に従えば、 おそらく先に進めるでしょう。
bmake clean を実行して、
作業ディレクトリーから展開されたファイルを掃除します。
作業ディレクトリーには、展開されたファイルのほかにも、
キャッシュファイルその他のシステム情報が置かれており、
これらが残っていると Makefile
編集後に悪影響のあることがあります。
ここで、bmake を実行してパッケージを構築します。 この段階では、さまざまな要因により構築がうまくいかないことがありますので、Chapter 19, パッケージを動くようにするを調べてください。
パッケージがうまく構築できた場合、次にすることは、 パッケージのインストールです。bmake install を実行して、うまくいくようお祈りします。
ここに至るまで、パッケージがインストールしたファイルの一覧を内容にもつ
PLIST
ファイルの内容は、
ほとんど空でした。bmake print-PLIST
>PLIST を実行して、おそらく正しいであろう一覧を作成します。
作成したファイルを、お好きなテキストエディターを使って、
ファイルの一覧がそれらしいものになっているか確認します。
再度 pkglint を実行して、
作成した PLIST
に余計なものが含まれていないか調べます。
さきほど bmake install を実行した時に、
インストールされたファイルのデータベースにこのパッケージが登録されましたが、
ファイルの一覧は空のものが登録されています。これを修正するため、
bmake deinstall を実行してから bmake install
を再度実行します。これで、このパッケージは PLIST
のファイルの一覧とともに登録されます。
bmake package を実行して、 インストールされたファイル一式からバイナリーパッケージを作成します。
KDE アプリケーションは、かならず
meta-pkgs/kde3/kde3.mk
をインクルードしてください。
これには、KDE パッケージでよくある設定が多数含まれています。
Python のモジュールとプログラムは、 あらかじめ用意された変数を使って、簡単にパッケージを作ることができます。
ほとんどの Python パッケージは、“distutils” または
easy-setup (“eggs”) のいずれかを使っています。
ソフトウェアが “distutils” を使っている場合は、
pkgsrc がこの枠組を使うようにするため、
PYDISTUTILSPKG
変数を “yes” に設定します。
“distutils” では、setup.py
という名前のスクリプトを使いますが、
“distutils” ドライバーが
setup.py
という名前でない場合は、
PYSETUP
変数をスクリプト名に設定します。
ソフトウェアが既定の Python バージョンに対応していない場合は、
PYTHON_VERSIONS_ACCEPTED
変数を、
そのソフトウェアが動作する Python バージョンに設定します。
バージョンは新しいものから古いものの順に並べます。たとえば以下のようにします。
PYTHON_VERSIONS_ACCEPTED= 25 24
パッケージにするソフトウェアが Python モジュールである場合は、
“../../lang/python/extension.mk
” をインクルードします。
この場合は、パッケージのディレクトリー名を
“py-software” という形式にし、
PKGNAME
を
“${PYPKGPREFIX}-${DISTNAME}” に設定します。たとえば以下のようにします。
DISTNAME= foopymodule-1.2.10 PKGNAME= ${PYPKGPREFIX}-${DISTNAME}
パッケージにするソフトウェアがアプリケーションである場合は、
“extension.mk” をインクルードする前に
“../../lang/python/application.mk
” もインクルードします。
パッケージにするソフトウェア (アプリケーションでもモジュールでも) が
egg に対応している場合、必要なことは、
“../../lang/python/egg.mk
” をインクルードすることだけです。
Python インタープリターへのパスを適切に設定するために、
REPLACE_PYTHON
変数を使います。この変数に、
パスの修正が必要なファイルのリストを設定します。たとえば以下のようにします。
REPLACE_PYTHON= ${WRKSRC}/*.py
私は pkgsrc/doc/TODO
ファイルを見て、
“nvu” パッケージが pkgsrc にまだ入っていないことに気づきました。
web 用に使うものと説明されているので、カテゴリーの選択は明らかに
“www” です。
$
mkdir www/nvu$
cd www/nvu
web サイトによれば、ソースは tar ファイルの形で用意されているので、 その URL を url2pkg プログラムに与えます。
$
url2pkg http://cvs.nvu.com/download/nvu-1.0-sources.tar.bz2
エディターが立ち上がりますので、DISTNAME
の行の前に
PKGNAME
の行を追加します。パッケージ名に
“sources” という単語は含めないものだからです。さらに、
MAINTAINER
, HOMEPAGE
,
COMMENT
の各行を記載します。これにより、
パッケージの Makefile
は以下のようになります。
# $NetBSD$ # DISTNAME= nvu-1.0-sources PKGNAME= nvu-1.0 CATEGORIES= www MASTER_SITES= http://cvs.nvu.com/download/ EXTRACT_SUFX= .tar.bz2 MAINTAINER= rillig@NetBSD.org HOMEPAGE= http://cvs.nvu.com/ COMMENT= Web Authoring System # url2pkg-marker (please do not remove this line.) .include "../../mk/bsd.pkg.mk"
ここで、エディターを終了し、 pkgsrc が大きなソースアーカイブをダウンロードするのを観察します。
url2pkg> Running "make makesum" ... => Required installed package digest>=20010302: digest-20060826 found => Fetching nvu-1.0-sources.tar.bz2 Requesting http://cvs.nvu.com/download/nvu-1.0-sources.tar.bz2 100% |*************************************| 28992 KB 150.77 KB/s00:00 ETA 29687976 bytes retrieved in 03:12 (150.77 KB/s) url2pkg> Running "make extract" ... => Required installed package digest>=20010302: digest-20060826 found => Checksum SHA1 OK for nvu-1.0-sources.tar.bz2 => Checksum RMD160 OK for nvu-1.0-sources.tar.bz2 work.bacc -> /tmp/roland/pkgsrc/www/nvu/work.bacc ===> Installing dependencies for nvu-1.0 ===> Overriding tools for nvu-1.0 ===> Extracting for nvu-1.0 url2pkg> Adjusting the Makefile. Remember to correct CATEGORIES, HOMEPAGE, COMMENT, and DESCR when you're done! Good luck! (See pkgsrc/doc/pkgsrc.txt for some more help :-)
これで、パッケージが展開されたので、その内容を見ていきましょう。
このパッケージには README.txt
がありますが、
mozilla に関することしか書かれていませんので、おそらく、
パッケージの依存性を調べるための役には立たないでしょう。
しかし、パッケージに GNU configure スクリプトがあるので、
必要なものについて逐一文句を言ってくれることを期待しましょう。
$
bmake
=> Required installed package digest>=20010302: digest-20060826 found
=> Checksum SHA1 OK for nvu-1.0-sources.tar.bz2
=> Checksum RMD160 OK for nvu-1.0-sources.tar.bz2
===> Patching for nvu-1.0
===> Creating toolchain wrappers for nvu-1.0
===> Configuring for nvu-1.0
[...]
configure: error: Perl 5.004 or higher is required.
[...]
WARNING: Please add USE_TOOLS+=perl to the package Makefile.
[...]
うまく文句を言ってくれました。そこで、パッケージの Makefile
をエディターで開き、USE_TOOLS
行がすでにあったので、
そこに “perl” を追加します。これによりパッケージの依存性が変更されたこと、
また、perl のラッパーが “tools” 相で自動的にインストールされることから、
パッケージの構築を最初からやり直すことが必要になりました。
$
bmake clean ===> Cleaning for nvu-1.0$
bmake [...] *** /tmp/roland/pkgsrc/www/nvu/work.bacc/.tools/bin/make is not \ GNU Make. You will not be able to build Mozilla without GNU Make. [...]
そこで、“gmake” を
USE_TOOLS
行に追加して、もう一度 (最初から) やり直します。
[...] checking for GTK - version >= 1.2.0... no *** Could not run GTK test program, checking why... [...]
今度は別の依存性です。最初の問題は、 「GTK のパッケージは pkgsrc のどこに隠されているか?」です。
$
echo ../../*/gtk* [many packages ...]$
echo ../../*/gtk ../../x11/gtk$
echo ../../*/gtk2 ../../x11/gtk2$
echo ../../*/gtk2/bui* ../../x11/gtk2/buildlink3.mk
最初の結果は、明らかに多すぎです。二つ目は、ただひとつの結果が出ており、 非常にみごとです。しかし、ここには GNOME パッケージに関する罠があります。 GNOME 2 がリリースされる前から、pkgsrc にはすでに多数の GNOME 1 パッケージがありました。そのような GNOME 1 パッケージをそのまま使い続けることができるようにするために、 GNOME 2 パッケージはそれらとは別のパッケージとして導入されており、 通常はパッケージ名に “2” が付け加えられています。 このため、gtk がこれに該当するかを確認したところ、 実際に該当していました。
GTK2 パッケージには buildlink3.mk
があるので、依存性の追加は非常に簡単です。パッケージの
Makefile
の最後の行の直前に
.include
行を追加します。これにより以下のようになりました。
[...] .include "../../x11/gtk2/buildlink3.mk" .include "../../mk/bsd.pkg.mk
改めて bmake clean && bmake を実行すると、 以下のようになりました。
[...] checking for gtk-config... /home/roland/pkg/bin/gtk-config checking for GTK - version >= 1.2.0... no *** Could not run GTK test program, checking why... *** The test program failed to compile or link. See the file config.log for the *** exact error that occured. This usually means GTK was incorrectly installed *** or that you have moved GTK since it was installed. In the latter case, you *** may want to edit the gtk-config script: /home/roland/pkg/bin/gtk-config configure: error: Test for GTK failed. [...]
この事例では、“どのパッケージも GNOME 2 を好む”との仮定は誤りでした。
上のエラーメッセージの最初のほうの行から、
このパッケージは実際には GNOME 1 バージョンの GTK を必要としていることがわかります。
もしこのパッケージが GTK2 を探していたなら、gtk-config
ではなく pkg-config を探していたでしょう。
そこで、パッケージの Makefile
中の x11/gtk2
を x11/gtk
に書き換えてから、
またやり直します。
[...] cc -o xpidl.o -c -DOSTYPE=\"NetBSD3\" -DOSARCH=\"NetBSD\" -I../../../dist/include/xpcom -I../../../dist/include -I/tmp/roland/pkgsrc/www/nvu/work.bacc/mozilla/dist/include/nspr -I/usr/X11R6/include -fPIC -DPIC -I/home/roland/pkg/include -I/usr/include -I/usr/X11R6/include -Wall -W -Wno-unused -Wpointer-arith -Wcast-align -Wno-long-long -pedantic -O2 -I/home/roland/pkg/include -I/usr/include -Dunix -pthread -pipe -DDEBUG -D_DEBUG -DDEBUG_roland -DTRACING -g -I/home/roland/pkg/include/glib/glib-1.2 -I/home/roland/pkg/lib/glib/include -I/usr/pkg/include/orbit-1.0 -I/home/roland/pkg/include -I/usr/include -I/usr/X11R6/include -include ../../../mozilla-config.h -DMOZILLA_CLIENT -Wp,-MD,.deps/xpidl.pp xpidl.c In file included from xpidl.c:42: xpidl.h:53:24: libIDL/IDL.h: No such file or directory In file included from xpidl.c:42: xpidl.h:132: error: parse error before "IDL_ns" [...]
パッケージの依存先が、まだ全部は見つかっていません。
ここでの問題は「ヘッダーファイル libIDL/IDL.h
はどのパッケージが提供しているのか?」です。
$
echo ../../*/*idl* ../../devel/py-idle ../../wip/idled ../../x11/acidlaunch$
echo ../../*/*IDL* ../../net/libIDL
二つ目で見つかったものを試してみましょう。そこで、
../../net/libIDL/buildlink3.mk
ファイルをインクルードしてから、
またやり直します。しかし、エラーはさきほどと変わりません。コードをいくらか調べたすえ、
パッケージの構築の過程が壊れているせいで機能しないという結論に達しました。
しかし、Mozilla のソースツリーは非常に巨大なので、修正する気にはなりません。
そこで、パッケージの Makefile
に以下の内容を追加して、
またやり直します。
CPPFLAGS+= -I${BUILDLINK_PREFIX.libIDL}/include/libIDL-2.0 BUILDLINK_TRANSFORM+= -l:IDL:IDL-2
パッケージ側では libIDL.so
というライブラリーを期待していますが、実際には
libIDL-2.so
だけが利用可能なので、下の行が必要です。
これにより、コンパイラーのラッパーにその場で書き換えをするよう伝えます。
次の問題は、FreeType インターフェースの最近の変更に関するものです。
www/seamonkey
のパッチファイルがこの問題に対処しているので、
これを patches
ディレクトリーにコピーします。
そして、はじめからやり直し、パッチをきれいに適用できるよう修正して、
またやり直します。これで、すべてうまくいきました。
Table of Contents
パッケージを用意する際にはいつも、以下のセクションで述べられている多くのファ イルが存在します。
構築、インストールおよびバイナリーパッケージの作成は、すべてパッケージの
Makefile
によりコントロールされます。
Makefile
には、パッケージに関するさまざまな情報が記述されています。
たとえば、パッケージをどこで取得するか、
パッケージをどのように構成、構築、インストールするか、などです。
パッケージの Makefile
は、
当該パッケージについて記述した、複数の節からなっています。
最初の節には、以下に掲げる変数を書きます。 これらは以下に掲げたままの順で並べるようにします。 このような変数の順序や節へのまとめ方は、ほとんど歴史的なものであって、 それ以上の意味はありません。
DISTNAME
は、当該パッケージの
web サイトからダウンロードされる配布ファイルの
基礎となる名前です。
PKGNAME
は、
pkgsrc が使うパッケージ名です。これは、
DISTNAME
(標準での値) が pkgsrc
におけるパッケージ名としてふさわしくない場合のみ書く必要があります。
通常、これはディレクトリー名とバージョン番号を合わせたものになります。
この値は正規表現 ^[A-Za-z0-9][A-Za-z0-9-_.+]*$
にマッチする必要があります。すなわち、使える文字は、
アルファベット・数字・マイナス記号・下線・ピリオド・プラス記号だけであり、
また、最初の文字はアルファベットまたは数字である必要があります。
SVR4_PKGNAME
は、
PKGNAME
が SVR4 のシステムにおいて一意なものにならない場合に、
パッケージファイルを作成する際に使う名前です。標準では
PKGNAME
であり、これの短縮は
pkgtools/gensolpkg
を使っておこなうことができます。
SVR4_PKGNAME
を使うのは、SVR4 のシステムで
PKGNAME
から一意なパッケージ名が得られない場合だけです。
SVR4_PKGNAME
の長さの上限は 5 文字です。
CATEGORIES
は、
当該パッケージにふさわしいカテゴリーのリストです。
pkgsrc の最上層にあるディレクトリーから自由に選ぶことができます。
現在CATEGORIES
の値として以下が使用できます。もし複数にまたがる場合、それら
の値はスペースで分けられる必要があります:
archivers cross geography meta-pkgs security audio databases graphics misc shells benchmarks devel ham multimedia sysutils biology editors inputmethod net textproc cad emulators lang news time chat finance mail parallel wm comms fonts math pkgtools www converters games mbone print x11
MASTER_SITES
,
DYNAMIC_MASTER_SITES
,
DIST_SUBDIR
, EXTRACT_SUFX
,
DISTFILES
の各変数については、
Section 17.5, “fetch 相”で詳しく論じます。
二つ目の節には、別途ダウンロードするパッチがある場合に、 そのパッチに関する情報を書きます。
PATCHFILES:
配布されているパッチを含んでいる、追加ファイルのファイル名です。
標準の値はありません。pkgsrc はこのファイルを
PATCH_SITES
から探します。
ファイル名の末尾が .gz
または
.Z
の場合は、
パッチ適用前に自動的に伸長されます。
PATCH_SITES
:
配布されているパッチファイル (上述の
PATCHFILES
を参照) がローカルにない場合用の、主な配布場所です。
三つ目の節には、以下に掲げる変数を書きます。
MAINTAINER
は、
当該パッケージの担当者であることを自覚しており、
send-pr(1) を使って報告された問題や質問の面倒をもっともよく見そうな人の電子メールアドレスです。
他の開発者がパッケージに変更を加える際には、
事前に MAINTAINER
に連絡してもかまいませんが、必ずしも連絡する必要はありません。
新しいプログラムをパッケージ化する場合は、
MAINTAINER
をあなた自身に設定してください。
そのパッケージを将来の更新に応じて保守することがどうしてもできない場合は、
<pkgsrc-users@NetBSD.org>
に設定します。
OWNER
は、
他の開発者に無断でパッケージを更新されたり変更されたりしたくない場合に、
MAINTAINER
のかわりに使うものです。
パッケージの Makefile には、
MAINTAINER
または OWNER
のいずれか一方を含めるようにしますが、
両方書いてはいけません。
HOMEPAGE
は、当該パッケージについて、
利用者がより詳しい情報を得られる URL です。
COMMENT
は、
当該パッケージについての一行説明です
(パッケージ名は含めません)。
このほか、構築に影響のある変数としては、以下のものがあります。
WRKSRC
: 当該パッケージに関連する配布ファイルが置かれるディレクトリーです。
標準では ${WRKDIR}/${DISTNAME}
になり、
ほとんどのパッケージはこの標準状態のままで動作します。
パッケージが専用のサブディレクトリー
(たとえば、ほとんどのGNUソフトウェアはこれを作ります) を作らずに、
カレントディレクトリーに展開される場合、
WRKSRC=${WRKDIR}
を設定します。
パッケージが DISTNAME
と同名のサブディレクトリーは作らずに、
別の名前のサブディレクトリーを作る場合は、
WRKSRC
を設定して、
${WRKDIR}
内の適切な名前を指すようにします。
たとえば
WRKSRC=${WRKDIR}/${DISTNAME}/unix
のようにします。
さらに別の例としては
lang/tcl
と x11/tk
を見てください。
pkgsrc が作成する作業用ディレクトリーの名前には、
WRKDIR_BASENAME
変数が使われます。この値は、標準では
work
です。同じ
pkgsrc ツリーを複数の異なる種類のバイナリーパッケージの構築用に使いたい場合は、
必要に応じて、この変数の値を変えることができます。
WRKDIR_BASENAME
の設定をありがちな方法でおこなうために、
二つの変数をそれぞれ使うことができます。
mk.conf
で
OBJHOSTNAME
が定義されると、
ホスト名の最初の部分がディレクトリー名に付け加えられます。
OBJMACHINE
が定義されると、
work.i386
や work.sparc
のように、プラットフォーム名が付け加えられます。
以下の事柄に気を配ってください。
もしパッケージによりマニュアルページが圧縮され
た形式でインストールされる場合、MANCOMPRESSED
を追加してください。
パッケージが BSD 形式の makefile を使っており、MANZ の設定に従う場合には、
MANCOMPRESSED_IF_MANZ
を使います。
すべてのファイルの/usr/local
を“${PREFIX}”に変更してください。(後述のパッチ
を参照)
もし、パッケージがinfoファイルをインストールするのであれば、Section 19.6.7, “infoファイルをインストールするパッケージ”を参照してください。
distinfo
ファイルには、パッケージが必要とする各
distfile のメッセージダイジェストあるいはチェックサムが格納されます。
作者が配布した元のファイルに対して、
このメッセージダイジェストが一致することを確認しています。これをもとに、イ
ンターネットから取得したdistfileが転送中にファイルが壊れたり、悪意によりセ
キュリティーホールを入れられたファイルに変更されていたりしていないことを確
認します。
最近、ダイジェストアルゴリズムの弱さについての噂があるため、
すべての distfile は、ファイルサイズに加えて、
SHA1 と RMD160 の両方のメッセージダイジェストを使って守られています。
patches
ディレクトリーに入っているすべてのパッチ (Section 11.3, “patches/*”参照) のチェックサムも、
この distinfo
ファイルに格納されます。
distinfo
ファイルを作り直すには、
make makedistinfo または make mdi
コマンドを使います。
パッケージのなかには、プラットフォームによってdistfileの組が異なるものがありま
す(たとえば lang/openjdk7
)。この情報は単一のdistinfo
ファイルに
書かれるので、このようなパッケージの更新時には、distfileの情報が失われない
ように注意を払ってください。
多くのパッケージは、pkgsrc で対応している各種プラットフォーム上で、
まだ無修正では動きません。このため、そのようなパッケージを動くようにするために、
多数の独自のパッチファイルが必要です。このパッチファイルは、
patches/
ディレクトリーにあります。
patch 相では、WRKSRC
以下にファイルが展開された後に、展開されたファイルに対して、
このパッチファイルがアルファベット
順で適用されます。
問題を避けるため、patch-*
ファイルは
diff -buフォーマットとし、かつ、曖昧
さなしで適用できるようにします。(曖昧さがあっても強制的にパッチを適用させる
ため、PATCH_FUZZ_FACTOR=-F2
を設定することができます)。
さらに、各パッチファイルは一つのファイルに対する修正だけを含むようにし、
また、一つのファイルを複数のパッチファイルによって修正するようなことはしないようにします。
こうすることで、将来の変更が簡単になります。
各パッチファイルは、以下のような構造となっています: 最初の行には パッチそのものの RCS Id があります。2 行目は、見栄えをよくするため、 空にします。これより後には、そのパッチによる各変更についてのコメントを書きます。 これには標準的な事例がいくつもあります。
一般に知られている脆弱性に対するパッチには、 その脆弱性の ID (CAN, CVE) を記すようにします。
ソースコードを変更するパッチには、 そのパッチを必要とするプラットフォームやその他の環境 (たとえばコンパイラー) を記すようにします。
あらゆる事例において、 そのアプリケーションのコードを理解している開発者がパッチを利用できるようにするため、 パッチにはコメントを書くようにします。上流の開発者に対しては特に注意が必要です。 たいていの場合、私たちの将来の作業を減らすために、 上流の開発者にパッチを採用してもらいたいからです。
一つ重要なこととして、NetBSD CVSツリーにチェックインした後に問題を引き起こ
すので、パッチファイルにRCS IDを含ませないように注意してください。
この問題を避けるため、 pkgtools/pkgdiff
パッケージの
pkgdiff
コマンドを使ってください。
さらに自動化するため、同パッケージのmkpatchesを使ってパッチ一式を作ることを
おすすめします。あなたがやらねばならないことは、ファイルの編集前に
cp -p filename filename.origのようにするか、あるいはさらに簡単に、同パッケージの
pkgviを使って、元のファイルをfilename.orig
の名前でバックアップしておくだ
けです。この方法でパッケージをアップグレードした場合、patchdiffを使って、新
しいパッチと既存のパッチを簡単に比較することができます。
patches
以下のファイルは新しいファイルに置き換えられますので、
変更点が適切かどうかをしっかり確認してください。
パッケージを作り終えたとき、忘れずにmake
makepatchsumコマンドでパッチファ
イルのチェックサムを生成するようにしてください。Section 11.2, “distinfo
”を参照してくだ
さい。
(たとえば、マニュアルページのインストール先を pkgsrc の流儀に合わせて変えるといったものではなく) distfile の問題を正すパッチを追加した場合は、 そのパッチをバグ報告としてメンテナーに送ってください。 こうすることで、pkgsrc を使っていない利用者も幸せになれますし、 通常は、将来のバージョンでパッチを削除することができるようになります。
パッチファイルのファイル名は、通常は
patch-
という形式です。
多くのパッケージでは、以前使われていた
path_to_file__with__underscores.c
patch-
という形式をまだ使っていますが、
パッチを新たに作る場合は、ファイル名を含んだ形式にしてください。[a-z][a-z]
pkgtools/pkgdiff
に含まれている
mkpatches は、
パッチファイルのファイル名を自動で処理します。
pkgsrc の複数のパッケージが同じ distfile を使っているなどの理由で、
複数のパッケージの間でパッチを共有したい場合は、
PATCHDIR
をパッチファイルのある場所へのパスに設定します。
たとえば以下のようにします。
PATCHDIR= ${.CURDIR}/../xemacs/patches
作者その他のメンテナーが配布しているパッチファイルは、
PATCHFILES
に列挙することができます。
置いておきたいパッチがあるがpkgsrcにcommitすべきものではない場合、それを
pkgsrcツリーの外の
$LOCALPATCHES
ディレクトリーに置いておくことができます。こ
のディレクトリーツリーはpkgsrcと同様の
“category/package”の構造を持つように
し、パッチを各パッケージのディレクトリー(すなわち$LOCALPATCHES/$PKGPATH
)に
置くようになっています。たとえば、
pkgsrc/graphics/png
に私的なパッチを適用す
るようにしたい場合は、そのパッチを
$LOCALPATCHES/graphics/png/mypatch
に置き
ます。このディレクトリーにあるファイルはすべてパッチファイルとして扱われ、
pkgsrcのパッチが適用された後に、このパッチが適用されます。
コードの移植性に関する問題を修正する場合は、 プリプロセッサーの細工を使ってオペレーティングシステムやプラットフォームを判別するようなことはしてはいけません。 そのような方法では、各 OS 固有性の詳細が適切に抽象化できないため、 他のオペレーティングシステムに対する移植性を損なってしまいます。
一般的な決めごとは、
アプリケーションを構築しているオペレーティングシステムそのものを検査するのではなく、
必要としている特有の機能を検査する、というものです。
たとえば、kqueue は NetBSD において利用可能であると仮定して
__NetBSD__
マクロを kqueue 対応の条件として使う、
ということはせずに、kqueue 自体を検出するようにするのです。
そしてこれは、一般的には
configure スクリプトにパッチを適用することになります。
ある OS が他の OS (たとえば kqueue を実装した Linux)
のインターフェースを採用してはいけない理由はまったくありませんが、
前述のようにオペレーティングシステムそのものを検査してしまうと、
そのような状況に対応することができません。
もちろん、機能を検査することは、 一般的に、開発者側の負担が多くなります。しかし、 機能を検査するようにすれば、その結果はきれいな変更となり、 他の多くのプラットフォームで動作させられる可能性があります。 また、本家のソースに統合される可能性が高くなることはいうまでもありません。 正しくない限り動かないの哲学を忘れないでください。
典型的な例としては、以下のようなものがあります。
Table 11.1. パッチ適用例
場所 | 誤 | 正 |
---|---|---|
configure スクリプト |
case ${target_os} in netbsd*) have_kvm=yes ;; *) have_kvm=no ;; esac |
AC_CHECK_LIB(kvm, kvm_open, have_kvm=yes, have_kvm=no) |
C ソースファイル |
#if defined(__NetBSD__) # include <sys/event.h> #endif |
#if defined(HAVE_SYS_EVENT_H) # include <sys/event.h> #endif |
C ソースファイル |
int monitor_file(...) { #if defined(__NetBSD__) int fd = kqueue(); ... #else ... #endif } |
int monitor_file(...) { #if defined(HAVE_KQUEUE) int fd = kqueue(); ... #else ... #endif } |
さらなる情報は、Making packager-friendly software の記事 (第 1 部、第 2 部) をお読みください。この記事では、ソフトウェアをパッケージ化しやすくする方法について、 複数の点での詳細をまとめています。ここで述べられている提案は、いずれも、 私たちが pkgsrc の作業をした経験から集められたものですので、 パッチの作成に際しても役に立つかもしれません。
常に、常に、常に、 パッケージに施したあらゆる移植性に関する修正や改良点を、 本家の開発者に還元するようにしてください。 彼らに移植性についての注意を喚起して、将来のバージョンが無修正で NetBSD で構築できるようにするためには、そうするしかないのです。 また、将来のバージョンの配布ファイルの利用者は、 フィードバックされた修正をパッケージのコードから直接利用することができるようになります。
フィードバックをする方法は、一般的には、 パッチをきれいに書き直し (pkgsrc で追加されたパッチは、 時にはクイックハックであることがあるからです)、 フィードバック先のプロジェクト用の適切な追跡システムに対してバグ報告をし、 変更が受け入れられるよう本家の作者とともに作業する、というものです。 フィードバックをすることで、pkgsrc のパッケージを単純なものとし、 さほど労力を割かずに将来の変更ができるようにするということが、 特に重要です。
フィードバックをしたら、上流のバグレポートの URL を パッチのコメントに追加してください。
フリーソフトウェアの理念をサポートして下さい。
DESCR
ソフトウェアについての複数行の説明。このファイルには適切なクレジットを含 めておいてください。他人があなたのユーモアのセンス(あるいは変わった綴り) を理解してくれない事、そしてここに書かれたものすべてを他人が読むであろう という事を念頭においておいてください。
PLIST
このファイルは、システムにインストールされるファイルを管理します:すべて のバイナリー、マニュアルページ、その他。ディレクトリーの作成、削除、イン サートされた(inserted)ファイルの位置を管理するための、他のディレクティブ もこのファイルに記述されます。 詳細はChapter 13, PLIST 問題を参照してください。
INSTALL
このシェルスクリプトはpkg_add(1)によって二度起動されます。
最初は、パッケー
ジが展開された後、ファイルが移動される前に、二度目はインストールするファ
イルが移動された後。このファイルは、
PLIST
内の@execコマンドでは不可能な特
別な処理のために使うことができます。より詳細な情報はpkg_add(1)と
pkg_create(1)を参照してください。Section 15.1, “インストール用のプレフィックス以外の場所にあるファイルとディレクトリー”もあわせて参照してください。
DEINSTALL
このスクリプトは、ファイルが削除される前後に実行されます。このスクリプト の責任は、パッケージのインストレーションにかかわる雑多なものをきれいにす ることです。なぜなら、pkg_deleteは、オリジナルのディストリビューションで 作成されたファイルをどのように削除するかをすべて知っておかなければならな いからです。より詳細な情報はpkg_delete(1)と pkg_create(1)を参照してください。
MESSAGE
パッケージのインストール後にこのファイルの内容が表示されます。
完全にフリーではないソフトウェアについての法的な通知や、
apache, PHP などのモジュールのインストール後の
設定ファイルの更新に関するヒント等に役立ちます。
パッケージのMakefile
で
MESSAGE_SUBST
を使うことで、変数を簡単に変えられる
ことに注意してください:
MESSAGE_SUBST+= SOMEVAR="somevalue"
とすると、MESSAGE
中の "${SOMEVAR}" は、
“somevalue”に置換されます。標準では、置換は
PKGNAME
,
PKGBASE
, PREFIX
,
LOCALBASE
, X11PREFIX
,
X11BASE
,
PKG_SYSCONFDIR
,
ROOT_GROUP
,
ROOT_USER
に対しておこなわれます。
MESSAGE_SRC
変数を設定すると、
置換の対象のファイルを変えたり追加したりすることができます。
この変数は、MESSAGE
(このファイルが存在する場合)
です。
ALTERNATIVES
FIXME: alternatives の枠組に関するドキュメンテーションは、 ありません。
Makefile.common
このファイルには、Makefile
に書くことができることを好きなように含めることができますが、
このファイルの目的は複数のパッケージから利用することです。
このファイルを利用するパッケージがあらかじめわかっている場合に限り、
使うようにします。それ以外の場合には、*.mk
ファイルを書いて、
その役割をあらわすファイル名をつけたほうがよいことが多いでしょう。
buildlink3.mk
このファイルには、buildlink3 の枠組 (Chapter 14, buildlink 方法論参照) のための 依存性情報が含まれます。
hacks.mk
このファイルには、コンパイラーのバグや、
それに類する事象への回避策が含まれます。このファイルは pkgsrc
の基盤が自動的にインクルードしますので、インクルードのための
.include
行は必要ありません。
options.mk
このファイルには、
利用者が選択可能なパッケージ固有のオプション (Chapter 16, オプションの扱い参照)
のためのコードが含まれます。パッケージにオプションが一つか二つしかない場合は、
このコードを Makefile
内に直接書いてもかまいません。
makeとタイプした時に、配布ファイルが
WRKDIR
で示されたディレクトリーに展開されます。
make clean
を実行すれば、これらを削除することができます。
このディレクトリーは、ソースの展開のほか、
さまざまなタイムスタンプファイルを作っておくためにも使用されます。
これらも、clean によって完全に削除されます。
標準では ${.CURDIR}/work
(OBJMACHINE
が設定されている場合は
${.CURDIR}/work.${MACHINE_ARCH}
) です。
また、もしあなたがコンフィギュレーションまたは構築するより前に、パッケージ
中に何かファイルを置きたいならば、それらのファイルをfilesディレクトリーに置
くことができますし、“pre-configure”ターゲットで、
${CP}コマンドによりコピーす
ることができます。あるいは、/dev/null
に対するそのファイルの単純なdiffをとり、
パッチメカニズムを使用して、そのファイルを生成することもできます。
files ディレクトリーにファイルを置く方法で、他のパッケージとファイルを共有したい場合は、
FILESDIR
変数を、他のパッケージの
files
ディレクトリーを指すように設定します。
たとえば以下のようにします。
FILESDIR=${.CURDIR}/../xemacs/files
Table of Contents
pkgsrc は、多くの Makefile
の断片からなっており、
この各断片が、pkgsrc システムの各部分を明確に形成しています。
pkgsrc のような大規模なシステムのプログラミング言語として make(1)
システムを使う場合、コードを適切かつわかりやすい状態に保つために、
いくらかの規律が必要です。
Makefile
プログラミングの基本的な構成要素は、
変数 (実はマクロ) とシェルコマンドです。
シェルコマンドは、awk(1) プログラムのような複雑なものになることもあります。
各シェルコマンドを意図どおりに動かすため、変数を使うときは、
すべての変数を適切にクォートすることが必要です。
本章では、Makefile
で頻出するいくつかのパターンと、
それらに伴う落とし穴を説明します。
ルールのターゲットとしてファイルを作る場合、 常に、データをまず一時ファイルに書き込んでから、 最後にファイル名を変えるようにしてください。 そうしておかないと、ファイルの生成の途中にエラーが起きた場合、 利用者が make(1) を 2 回目に実行したときに、 前回のファイルが存在したままとなり、ファイルが正しく再生成されません。 たとえば、
wrong: @echo "line 1" > ${.TARGET} @echo "line 2" >> ${.TARGET} @false correct: @echo "line 1" > ${.TARGET}.tmp @echo "line 2" >> ${.TARGET}.tmp @false @mv ${.TARGET}.tmp ${.TARGET}
make wrong を 2 回実行したときに、
1 回目の実行でエラーメッセージが出ますが、
ファイル wrong
は作られた状態になります。
一方、make
correct を実行すると、エラーメッセージが 2 回出るという、
期待どおりの動作となります。
エラーの場合には make(1) が ${.TARGET}
を削除することがあるということをご存知かもしれませんが、
この削除は、たとえば ^C
を押すなど、
割り込みがあった場合にのみおこなわれます。コマンドのどれかが
(上の例の false(1) のように) 失敗した場合には、
削除はおこなわれません。
Makefile
変数は文字列を値として持ち、
文字列は 5 種類の演算子 ``='', ``+='', ``?='',
``:='', ``!='' を使って操作することができます。演算子については
make(1) マニュアルページに説明があります。
Makefile
の変数が解釈される際、
ハッシュ文字 ``#'' とバックスラッシュ文字 ``\'' は特別扱いされます。
バックスラッシュに改行が続く場合、当該バックスラッシュの直前にあるあらゆる空白・
当該バックスラッシュ・改行・改行の直後にあるあらゆる空白は、
ひとつのスペースに置き換えられます。
バックスラッシュ文字とその直後に続くハッシュ文字は、
ひとつのハッシュ文字に置き換えられます。
以上の場合以外は、バックスラッシュはそのまま渡されます。
変数への代入の際は、ハッシュ文字 (その前にバックスラッシュがないもの)
はコメントの開始となり、そこから論理行の最後までがコメントとなります。
註: このようなアルゴリズムで解釈されるせいで、
バックスラッシュ一文字を値として持つ変数を作るには、
``!='' 演算子を使う方法しかありません。たとえば以下のようにします: BACKSLASH!=echo "\\"
.
以上は、変数の定義に関する説明です。このほか、変数に関してできることは、 変数を評価することです。変数が評価されるのは、変数が ``:='' または ``!='' 演算子の右辺にある場合と、変数がシェルコマンドの一部となっている場合 (コマンドが実行される直前に評価される) です。これら以外の場合、 make(1) は遅延評価をおこないます。つまり、 変数は他の処理がすべてすんだ後に評価されます。 このほか、マニュアルページに記載されている「修飾子」も、 変数を評価します。
修飾子のなかには、文字列を語に分割してから、分割した語に対して操作をするものがあります。 それ以外の修飾子は、文字列全体に対して操作をします。 文字列が語に分割される場合、その分割は、 sh(1) の解釈と同様の方式でおこなわれます。
例外のない規則はありません— .for ループはシェルのクォートの規約には従わず、 空白の並びで分離します。
変数には、取り扱い方が異なる複数の種類の変数があります。 文字列 (strings) と、二種類のリストです。
文字列 (strings) には、
任意の文字を含めることができます。とはいえ、
使うのは印字可能文字だけにしておくのがよいでしょう。
例としては PREFIX
や
COMMENT
があります。
内部リスト (internal lists) は、
シェルコマンドに決して渡されることのないリストです。
内部リストの要素は空白で区切られます。このため、
要素自体に空白を含めることはできません。空白以外の文字はすべて使うことができます。
内部リストは .for ループ内で使うことができます。
例としては DEPENDS
や
BUILD_DEPENDS
があります。
外部リスト (external lists) は、
シェルコマンドに渡すことのできるリストです。外部リストの要素には、
空白を含む任意の文字を含めることができます。このことが理由で、
外部リストは .for ループ内では使うことができません。
例としては DISTFILES
や
MASTER_SITES
があります。
本節では、読者がコードを書く際に使うことになるコードの断片を いくつか説明します。適当なコードがここに載っていない場合は、 あなたのコードをテストして、ここに追加してください。
STRING= foo * bar `date` INT_LIST= # empty ANOTHER_INT_LIST= apache-[0-9]*:../../www/apache EXT_LIST= # empty ANOTHER_EXT_LIST= a=b c=d INT_LIST+= ${STRING} # 1 INT_LIST+= ${ANOTHER_INT_LIST} # 2 EXT_LIST+= ${STRING:Q} # 3 EXT_LIST+= ${ANOTHER_EXT_LIST} # 4
文字列を外部リストに追加する場合 (例 3) は、 その文字列をクォートする必要があります。それ以外の場合は、 クォートを追加してはいけません。内部リストと外部リストは、 その各要素がどちらのリストでも適切に処理されることが確実な場合をのぞき、 統合してはいけません。
EXT_LIST= # empty .for i in ${INT_LIST} EXT_LIST+= ${i:Q}"" .endfor
このコードは、内部リスト
INT_LIST
を外部リスト
EXT_LIST
に変換します。内部リストの要素はクォートされていないので、
変換に際してはクォートする必要があります。
""
を追加する理由は後述します。
時には、任意の文字列を出力したいことがあるかもしれません。 不具合を起こす方法はたくさんありますが、 どんな複雑なものも扱えるような方法は少ししかありません。
STRING= foo bar < > * `date` $$HOME ' " EXT_LIST= string=${STRING:Q} x=second\ item all: echo ${STRING} # 1 echo "${STRING}" # 2 echo "${STRING:Q}" # 3 echo ${STRING:Q} # 4 echo x${STRING:Q} | sed 1s,.,, # 5 printf "%s\\n" ${STRING:Q}"" # 6 env ${EXT_LIST} /bin/sh -c 'echo "$$string"; echo "$$x"'
例 1 は、シェルで構文エラーを起こします。 各文字がそのままコピーされるだけだからです。
例 2 も構文エラーを起こします。また、${STRING}
の末尾の "
文字を除いた場合は、date(1) が実行されてしまいます。
また、$HOME
シェル変数も評価されるでしょう。
例 3 は、echo(1) コマンドの実装によって、 各空白文字の前にバックスラッシュが出力されたり、 されなかったりします。
例 4 は、最初の文字がダッシュでない文字列はすべて適切に処理します。 文字列の最初の文字がダッシュの場合、結果がどうなるかは echo(1) コマンドの実装に依存します。 入力される文字列の最初の文字がダッシュにならないことを保証できる限りは、この形式は適切です。
例 5 は、たとえ文字列がダッシュで始まっていたとしても、 適切に処理します。
例 6 も、あらゆる文字列を適切に処理できますし、 それ自体に問題のあるパイプを使わないので、 より軽い方法です。
EXT_LIST
はクォートする必要はありません。
なぜなら、リストに要素を追加した時に、
すでにクォートされているからです。
内部リストはシェルに渡されないものなので、 例示はありません。
変数が不適切にクォートされたソースは、多くありえます。 本節では、よく知られている例をいくつか掲げます。
リストの値を使うときは常に、
値の冒頭や末尾にある空白がどうなるかを考えてください。
リストが整形式のシェルの式である場合、それぞれの語から冒頭や末尾の空白を取り除くために、
:M*
修飾子を使うことができます。
:M
演算子は、最初にその引数をシェルの規約に従って分割してから、
シェルのグロブ式 *
にマッチする語 (つまり全部)
すべてからなるリストを新たに作ります。
これが必要となる状況は、CPPFLAGS
のような変数を
CONFIGURE_ARGS
に追加する場合です。
configure スクリプトが別の configure スクリプトから呼び出される場合、
呼び出された側のスクリプトは変数から冒頭と末尾の空白を取り除き、
それを別の configure スクリプトに渡します。しかし、この両 configure
スクリプトは、(子の) CPPFLAGS
変数が
親の CPPFLAGS
と同じものであると見込んでいます。
これが、CPPFLAGS
の値を適切に切り取ったものを
渡したほうがよい理由です。そして、以下に掲げるのは、その方法です。
CPPFLAGS= # empty CPPFLAGS+= -Wundef -DPREFIX=\"${PREFIX:Q}\" CPPFLAGS+= ${MY_CPPFLAGS} CONFIGURE_ARGS+= CPPFLAGS=${CPPFLAGS:M*:Q} all: echo x${CPPFLAGS:Q}x # 前後に空白がつく echo x${CONFIGURE_ARGS}x # 適切に切り取られる
上の例にはバグがひとつあります:
${PREFIX}
は適切にクォートされたシェルの式ですが、
シェルの後には C コンパイラーがあり、こちらでも適切に
(今度は C の文法で) クォートされている必要があります。
このため、上で例示したものは、${PREFIX}
の値にバックスラッシュや二重引用符が含まれていない場合に限って、
正しいものになります。これらの文字を含めたい場合、
C の文字列リテラルとして扱われる値をすべてクォートするために、
もう一つの層を追加する必要があります。
:Q
演算子はシェル用のクォートしかできないので、
C コンパイラー用のクォートには使えません。
値が空になりうる場合は、
:Q
演算子が妙な結果を出すことがあります。
以下に 2 種類のまったく異なる事例を掲げますが、
どちらも同じ細工をすることで解決できます。
EMPTY= # empty empty_test: for i in a ${EMPTY:Q} c; do \ echo "$$i"; \ done for_test: .for i in a:\ a:\test.txt echo ${i:Q} echo "foo" .endfor
一つ目の例では、3 行が表示されると思うかもしれませんが、
そのうちの 2 行しか表示されません。これは、
${EMPTY:Q}
が空の文字列に展開され、
シェルからは見えなくなるからです。回避策は、
${EMPTY:Q}""
と書くことです。このパターンは、
${TEST} -z ${VAR:Q}
や ${TEST}
-f ${FNAME:Q}
のように、しばしば見られます
(いずれも、間違いです)。
二つ目の例では、表示されるのは 4 行ではなく 3 行です。
最初に表示される行は a:\ echo foo
のようになります。
これは、値 a:\
のバックスラッシュを
make(1) が継続行として処理し、2 行目が 1 行目の
echo(1) コマンドの引数になってしまうためです。
これを防ぐには、${i:Q}""
と書きます。
pkgsrc の bmake プログラムは、以下のような代入を適切に処理することができません。
_othervar_
が ``-'' 文字を含んでいる場合、
以下のコードを実行すると、閉じ中括弧のひとつが
${VAR}
に含まれてしまいます。
VAR:= ${VAR:N${_othervar_:C/-//}}
もっと複雑なコードの断片と回避策については、
regress/make-quoting
パッケージのテストケース
bug1
をご覧ください。
Table of Contents
PLIST
ファイルは、パッケージの
“packing list” (梱包明細) です。すなわち、
パッケージを構成するファイルの一覧 (インストール先である
${PREFIX}
ディレクトリーからの相対位置)
と、それに加えて、いくつかの追加情報
(完全な一覧は pkg_create(1) マニュアルページを参照) が載っています。
この章では、PLIST
ファイル
(複数の場合もあります、以下を参照してください)を扱う場合に注意が必要な、
いくつかの特別な問題について述べます。
make print-PLISTコマンドを使って、パッケージの展開後に新しくできた全ファ イルにマッチするPLISTを出力することができます。このターゲットに関するさ らなる情報は、 Section 17.17, “他の役に立つターゲット”をご覧ください。
*-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; }
パッケージがシステムにインストールされる際に、 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
+=fooPLIST.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
もし、(bsd.own.mk
に)MANZ
が設定されていれば、マニュアルページは圧縮形式で
インストールされます。そうでなければ展開された形式でインストールされます。
PLIST
ファイルでこれをサポートするために、MANZ
と MANCOMPRESSED
の設定の有
無に従い、“.gz”サフィックスがマニュアルページに自動的に追加、削除され
ます。このPLIST
ファイルに対する変更は、PLIST
自身にたいしてでなく、それが
コピーされる時におこなわれます。
ひとつ以上のファイルを、バイナリーパッケージを構築するためにPLIST
のソース
として使用する時は、それらのファイル名を変数PLIST_SRC
に設定してください。こ
れらのファイルは、後でcat(1)によって連結されます。連結の順番は重要です。
PLIST_SRC
は、標準では ${PKGDIR}/PLIST
になります。
パッケージのなかには、インストールするファイルの組合せを、対象のオペレー ティングシステムによって変えるものがあります。このような差異は、以下のファ イルを使って自動的に処理することができます。
PLIST.common
PLIST.${OPSYS}
PLIST.${MACHINE_ARCH}
PLIST.${OPSYS}-${MACHINE_ARCH}
PLIST.common_end
“共有ディレクトリー”とは、複数の (かつ関連のない) パッケージがファイルをインストールするディレクトリーのことです。 以前は、共有ディレクトリーは、条件に応じた削除のために PLIST に特殊な細工をするか、 集権的な処理用パッケージを用意する必要があったので、 問題を起こすことがありました。
現在の pkgsrc では、話は単純になっています。 各パッケージは、必要に応じて、ディレクトリーを作成してファイルをインストールします。 pkg_delete は、パッケージのアンインストール後、 空のディレクトリーが残っていればすべて削除します。
パッケージの動作のために空のディレクトリーが必要な場合は、 インストール時に通常と同じようにディレクトリーを作成するようにし、 さらに PLIST に以下のような項目を追加します。
@pkgdir path/to/empty/directory
Table of Contents
buildlink は pkgsrc における枠組のひとつで、パッケージのコンフィギュレーション (configure) および構築 (build) の過程で、どのヘッダーやライブラリーが使われるかを制御するものです。 これは以下の二つの手順によって実現されます。
BUILDLINK_DIR
(標準では、
WRKDIR
のサブディレクトリー) 内に、
依存するヘッダーやライブラリーを指すシンボリックリンクを作ります。
通常のコンパイラーツールを置き換えるラッパースクリプトを生成します。
これは、-I${LOCALBASE}/include
および
-L${LOCALBASE}/lib
を、
BUILDLINK_DIR
への参照に変換します。
また、オペレーティングシステムによっては、このラッパースクリプトは、
ネイティブのコンパイラーが GCC に見えるようにし、
GCC を要求するパッケージを修正することなく、
ネイティブのコンパイラーで構築できるようにします。
こうすることで、パッケージ構築環境を正規化して、
他にどのようなソフトウェアがインストールされているかにかかわらず、
パッケージを一貫して構築できるようにします。
なお、通常のシステムヘッダーおよびライブラリーのパス、
たとえば /usr/include
,
/usr/lib
などは、すでに探索されていることに注意してください
-- buildlink3 は、パッケージの構築を、
システム非標準のソフトウェアから独立させるために設計されたものなのです。
パッケージが buildlink3 の枠組を使うようにする変換の過程 (“bl3ifying” - buildlink3 化) は、かなり単純です。 以下のことに注意してください。
構築の際には、常に、
toolchain 本体ではなくラッパースクリプトが呼ばれるようにしてください。
パッケージによっては巧妙なものがあるので、
ラッパーが呼ばれたかどうかを確実に調べる方法は、
${WRKDIR}/.work.log
を確認することだけです。
たとえば Java VM やスタンドアローンのシェルでは、
パッケージの Makefile で PREFIX
を上書きしないでください。${BUILDLINK_DIR}
からシンボリックリンクするためのコードは、
“pkg_info -qp pkgname
”
からの相対位置にあるファイルを探すからです。
パッケージの依存性として追加されるのは、パッケージの Makefile に列挙した
buildlink3.mk
ファイルだけ
であることを忘れないでください。
あるパッケージのライブラリーやヘッダーに対する依存性が必要な場合は、
DEPENDS+= foo>=1.1.0:../../category/foo
を、以下のものに置き換えます。
.include "../../category/foo/buildlink3.mk"
通常は、buildlink3.mk ファイルで必要な依存性を定義します。 buildlink3.mk ファイルを使う際に、より新しいバージョンへの依存性が必要な場合は、 そのことを Makefile で定義することができます。たとえば以下のようにします。
BUILDLINK_API_DEPENDS.foo+= foo>=1.1.0 .include "../../category/foo/buildlink3.mk"
pkgsrc/mk
以下には、
特別なパッケージを扱うための
buildlink3.mk
ファイルがいくつかあります。
bdb.buildlink3.mk
は、
BDB_ACCEPTED
および
BDB_DEFAULT
の値にもとづき、
ネイティブまたは pkgsrc の Berkeley DB の実装のどちらかを選択します。
curses.buildlink3.mk
: システムに
Curses も NCurses も附属しない場合に、devel/ncurses
パッケージをインストールしてくれます。
krb5.buildlink3.mk
は、
KRB5_ACCEPTED
の値を使って、
Kerberos 5 の実装を必要とするパッケージを
Heimdal または MIT-krb5 のどちらに依存させるかを選択します。
motif.buildlink3.mk
は、
システム附属の Motif がインストールされているかを確認し、
ない場合は、x11/lesstif
または x11/openmotif
への依存性を追加します。
利用者は、MOTIF_TYPE
を “dt”,
“lesstif” または “openmotif” に設定して、
どの版の Motif を使うかを選択することができます。
oss.buildlink3.mk
は、
Open Sound System (OSS) API
を使うパッケージが使うことがある変数をいくつか定義します。
pgsql.buildlink3.mk
は、
Postgres 8.0, 8.1 または 8.2 のうち、インストールされているものを受け入れます。
さらなる情報は、このファイルの内容をご覧ください。
pthread.buildlink3.mk
は、
PTHREAD_OPTS
の値を使うとともに、ネイティブの pthread があるか確認し、
ない場合は、必要に応じて devel/pth
への依存性を追加します。
xaw.buildlink3.mk
は、
XAW_TYPE
の値を使って、具体的にどの
Athena widget ライブラリーを使うかを選択します。
それぞれの buildlink3.mk
ファイルのコメントに、
適切な使い方に関するより詳しい説明があります。
パッケージの buildlink3.mk
ファイルは、
そのパッケージに附属するヘッダーファイルやライブラリーをコンパイルしたりリンクしたりする必要があることを示すために、
Makefile からインクルードされます。
buildlink3.mk
ファイルは、
適切な種類の依存関係を追加したり、
さらに必要となるヘッダーやライブラリーを使うために別の
buildlink3.mk
をインクルードしたりするために必要な情報を、
いつでも提供できるように作ります。
編集するための元となる buildlink3.mk
ファイルを作るには、Rene Hexel の pkgtools/createbuildlink
パッケージを使うことを強くおすすめします。ほとんどのパッケージに対しては、
以下のコマンドを使うと、buildlink3.mk
ファイルのよい出発点となるものを作ってくれます。
%
cd pkgsrc/
category
/pkgdir
%
createbuildlink >buildlink3.mk
以下に掲げるのは、
pkgsrc/graphics/tiff
における
buildlink3.mk
の実例です。
# $NetBSD: buildlink3.mk,v 1.16 2009/03/20 19:24:45 joerg Exp $ BUILDLINK_TREE+= tiff .if !defined(TIFF_BUILDLINK3_MK) TIFF_BUILDLINK3_MK:= BUILDLINK_API_DEPENDS.tiff+= tiff>=3.6.1 BUILDLINK_ABI_DEPENDS.tiff+= tiff>=3.7.2nb1 BUILDLINK_PKGSRCDIR.tiff?= ../../graphics/tiff .include "../../devel/zlib/buildlink3.mk" .include "../../graphics/jpeg/buildlink3.mk" .endif # TIFF_BUILDLINK3_MK BUILDLINK_TREE+= -tiff
ヘッダーとフッターで、
BUILDLINK_TREE
の値を操作しています。
この変数は、パッケージの依存関係を辿るために、
すべての buildlink3.mk
ファイルの間で、
共通に使われます。
本体の節では、多重のインクルードを防いだうえで、
pkg
への依存性をどのように追加するかを制御しています。
いくつもの重要な変数がこの節で設定されます。
BUILDLINK_API_DEPENDS.
は、インストールされるパッケージに対して、実際に記録される依存性です。
この変数の既存のリストを残したまま追加するために、
かならず += を使って設定します。
この変数の設定値は、
パッケージの API が現行のものになった以降の最初 (最古) のバージョンにします。
pkg
BUILDLINK_PKGSRCDIR.
は、pkgsrc における
pkg
pkg
のディレクトリーです。
BUILDLINK_DEPMETHOD.
(上の例には出てきません) は、
pkg
pkg
への依存性として
BUILD_DEPENDS
と
DEPENDS
のどちらを使うかを制御します。
BUILDLINK_DEPMETHOD.
を “build” にすれば、
構築時の依存性となります。この変数を設定しなかった場合は、
完全な依存性となります。pkg
BUILDLINK_INCDIRS.
および
pkg
BUILDLINK_LIBDIRS.
(上の例には出てきません) は、ヘッダーおよびライブラリーの検索パスに追加するための、
pkg
${BUILDLINK_PREFIX.
のサブディレクトリーです。設定しなかった場合は、それぞれ
“include” および “lib”
となります。pkg
}
BUILDLINK_CPPFLAGS.
(上の例には出てきません) は、pkg
CPPFLAGS
に追加するためのプリプロセッサー用のフラグで、このフラグは
configure および build の段階に渡されます。“-I”
オプションは使わずに、上述の
BUILDLINK_INCDIRS.
を使って処理するようにしてください。pkg
以下の各変数はすべて、二つ目の (多重のインクルードを防いでいる) 節において、
任意に定義されるものであり、どのパッケージのファイルを
${BUILDLINK_DIR}
からシンボリックリンクするか、および、
シンボリックリンクによってファイル名をどのように変換するか、
を制御します。
BUILDLINK_FILES.
(上の例には出てきません) は、
pkg
${BUILDLINK_DIR}
からシンボリックリンクされるリンク先の、
${BUILDLINK_PREFIX.
からの相対位置のシェルのグロブパターンです。
たとえば pkg
}include/*.h
のようになります。
BUILDLINK_FILES_CMD.
(上の例には出てきません) は、
pkg
${BUILDLINK_PREFIX.
.
からの相対位置でのファイルのリストを標準出力に出力する、シェルのパイプラインです。
これにより出力されるファイルは、
pkg
}${BUILDLINK_DIR}
からシンボリックリンクされます。指定しなかった場合、
pkg
の
+CONTENTS
を
${BUILDLINK_CONTENTS_FILTER.
でフィルターした結果が出力されるようになります。pkg
}
BUILDLINK_CONTENTS_FILTER.
(上の例には出てきません) は、pkg
+CONTENTS
を入力にとり、
${BUILDLINK_PREFIX.
からの相対位置でのファイルのリストを標準出力に出力するフィルターコマンドです。
指定しなかった場合、overwrite パッケージでは、
pkg
}BUILDLINK_CONTENTS_FILTER.
はパッケージの pkg
+CONTENTS
から include
および lib
ディレクトリーの内容を出力し、
pkgviews パッケージでは、lib
ディレクトリーにある
libtool アーカイブをすべて出力します。
BUILDLINK_FNAME_TRANSFORM.
(上の例には出てきません) は、元ファイル名から宛先ファイル名への変換用の
sed の引数のリストです。たとえば -e
"s|/curses.h|/ncurses.h|g" のようになります。pkg
この節では、
pkg
のライブラリー依存性として必要な
buildlink3.mk
をすべてインクルードすることができます。
ここで buildlink3.mk
ファイルをインクルードすると、
pkg
の
buildlink3.mk
ファイルがインクルードされる場合はいつも、
これらへの依存性のためのヘッダーやライブラリーも、
${BUILDLINK_DIR}
からシンボリックリンクされることになります。
依存性が追加されるのは、
buildlink3.mk
ファイルを直接インクルードした場合だけです。
パッケージを更新した際に
BUILDLINK_API_DEPENDS.
に列挙されている依存性のバージョンを上げる必要があるのは、
その更新で API やヘッダーファイルへのインターフェースが変わった場合です。pkg
このような場合は、
BUILDLINK_API_DEPENDS.
を調節して、最低限、新しいパッケージのバージョンを要するようにします。
場合によっては、新しいバージョンに依存するパッケージの
pkg
PKGREVISION
を上げる必要があることがあります。
また、依存しているパッケージに buildlink3.mk
ファイルがある場合は、
BUILDLINK_API_DEPENDS.
も調節します。これは、pkgsrc が適切なパッケージの依存性を求めるようにして、
ソースからの構築時に古いパッケージに依存したりしないようにするために、
必要なことです。pkg
BUILDLINK_ABI_DEPENDS.
を上げるのは、バイナリーインターフェースや、
インストールされている共有ライブラリーのいずれかの soname
(ライブラリーのバージョンのメジャー番号) が変わった場合です。
これは、これらを使うバイナリーパッケージが、
適切なパッケージの依存性を求めるようにして、
必要な共有ライブラリーをもたない古いパッケージに依存したりしないようにするために、
必要なことです。pkg
BUILDLINK_ABI_DEPENDS
および
ABI_DEPENDS
の定義を含めた、
他のパッケージへの依存性について、さらなる情報は、
Section 19.1.6, “依存性の処理”をご覧ください。
なお、必要もないのにパッケージを削除したり再構築したりするようなことのないよう、
BUILDLINK_API_DEPENDS.
や
pkg
BUILDLINK_ABI_DEPENDS.
の調節は、事前に熟考するようにしてください。
多くの場合、新しいバージョンのパッケージは、
従前の依存性のままでも問題なく動作します。pkg
また、
BUILDLINK_ABI_DEPENDS.
は、
pkg
BUILDLINK_API_DEPENDS.
と同じ値となる場合には設定する必要はありません。 pkg
pkgsrc のパッケージのなかには、
ベースシステムにも存在するようなヘッダーやライブラリーをインストールするものがあります。
そのようなパッケージでは、
buildlink3.mk
ファイルとは別に、
builtin.mk
ファイルも含めておきます。
このファイルでは、ベースシステム附属のソフトウェアと
pkgsrc のソフトウェアのどちらを使うのが適切かを判断するために必要な確認をおこないます。
pkg
用の
builtin.mk ファイルで必要なのは、以下のことだけです。
インクルードされた後に
USE_BUILTIN.
を “yes” または “no”
のどちらかに設定すること。pkg
builtin.mk
ファイルがインクルードされる前から定義されている
USE_BUILTIN.
を、一切上書きしないこと。pkg
複数のインクルードができるように書くこと。
これは非常に重要なことであり、
Makefile
のコーディングに対する配慮となります。
以下に掲げるのは、builtin.mk ファイルの推奨テンプレートです。
.if !defined(IS_BUILTIN.foo) # # IS_BUILTIN.foo is set to "yes" or "no" depending on whether "foo" # genuinely exists in the system or not. # IS_BUILTIN.foo?= no # BUILTIN_PKG.foo should be set here if "foo" is built-in and its package # version can be determined. # . if !empty(IS_BUILTIN.foo:M[yY][eE][sS]) BUILTIN_PKG.foo?= foo-1.0 . endif .endif # IS_BUILTIN.foo .if !defined(USE_BUILTIN.foo) USE_BUILTIN.foo?= ${IS_BUILTIN.foo} . if defined(BUILTIN_PKG.foo) . for _depend_ in ${BUILDLINK_API_DEPENDS.foo} . if !empty(USE_BUILTIN.foo:M[yY][eE][sS]) USE_BUILTIN.foo!= \ ${PKG_ADMIN} pmatch '${_depend_}' ${BUILTIN_PKG.foo} \ && ${ECHO} "yes" || ${ECHO} "no" . endif . endfor . endif .endif # USE_BUILTIN.foo CHECK_BUILTIN.foo?= no .if !empty(CHECK_BUILTIN.foo:M[nN][oO]) # # Here we place code that depends on whether USE_BUILTIN.foo is set to # "yes" or "no". # .endif # CHECK_BUILTIN.foo
最初の節では、pkg
がベースシステムに実際に存在するかどうかに応じて、
IS_BUILTIN.
を設定しています。これは、ベースシステムに pkg
pkg
相当の機能のソフトウェアが存在するかどうかではありません。
この変数を “yes” にするのは、
このパッケージそのものがベースシステムの一部として附属する場合だけです。
この変数は、builtin.mk
ファイルの内部でのみ使われます。
二つ目の節では、pkg
がベースシステムに存在する場合 (つまり
IS_BUILTIN.
が “yes” の場合)、
pkg
BUILTIN_PKG.
をそのバージョンに設定しています。この変数は、pkg
builtin.mk
ファイルの内部でのみ使われます。
三つ目の節では、
USE_BUILTIN.
を設定しており、これはすべての pkg
builtin.mk
ファイルで必須です。
この節のコードは、ベースシステム附属のソフトウェアが、
BUILDLINK_API_DEPENDS.
で列挙されている依存性を満たすのに十分かどうかを判別する必要があります。
この判別は、たいていは、
pkg
BUILTIN_PKG.
を、
pkg
BUILDLINK_API_DEPENDS.
の各依存性と比較することでおこなわれます。
pkg
USE_BUILTIN.
は、pkg
builtin.mk
ファイルの終わりまでに、
適切な値に設定する必要があります。なお、たとえ
IS_BUILTIN.
が “no” であっても、
pkg
USE_BUILTIN.
は “yes” にすることができます。なぜなら、
ベースシステム附属のソフトウェアが依存パッケージに十分似ており、
代替可能であるという判断もできるからです。pkg
最後の節は
CHECK_BUILTIN.
に守られており、前の節で設定された
pkg
USE_BUILTIN.
の値を使うコードをインクルードします。たいていの場合、ここでインクルードするのは、
たとえば依存性への制約の追加や、pkg
${BUILDLINK_DIR}
からシンボリックリンクされるファイルのリストの
(BUILDLINK_FILES.
を使った) 追加などです。pkg
パッケージの構築時に、
依存性を満たすソフトウェアとして組み込み (ネイティブ)
のものを使うか pkgsrc のものを使うかを、
大域的な設定に応じて切替えることができます。
この制御は、PREFER_PKGSRC
および
PREFER_NATIVE
を設定することでおこないます。
この両変数は、“yes”, “no”
またはパッケージのリストを値として持ちます。
PREFER_PKGSRC
は pkgsrc 版のソフトウェアを使うことを、
PREFER_NATIVE
で組み込み版を使うことを、
それぞれ指示します。この設定は、
対象パッケージではどちらを使うのがもっとも適当かに応じて、
PREFER_PKGSRC
か
PREFER_NATIVE
のいずれかで指定します。
あるパッケージがどちらにも設定されていない場合、
または両方で設定されている場合は、
PREFER_PKGSRC
が
PREFER_NATIVE
より優先します。たとえば、
NetBSD システムの最も基本的な要素を除き、
すべて pkgsrc 版のソフトウェアを使うこととする場合、
以下のように設定することができます。
PREFER_PKGSRC= yes PREFER_NATIVE= getopt skey tcp_wrappers
あるパッケージを PREFER_NATIVE
のリストに加えるには、そのパッケージに
builtin.mk
ファイルがある必要があります。
このファイルがない場合は、リストに加えても単に無視されます。
Table of Contents
本章では、pkginstall
の枠組について説明します。
主な機能は以下のとおりです。
pkgsrc が扱うツリー (LOCALBASE
)
以外の場所のディレクトリーやファイルの、汎用的なインストールおよび操作。
インストール時における、設定ファイルの自動処理 (パッケージが正しく設計されていればですが)。
システム起動スクリプトの作成およびインストール。
システムユーザーおよびグループの登録。
システムシェルの登録。
フォントデータベースの自動更新。
以下の各節では、上述の各機能について詳しく見てゆきます。
本章で説明する機能の多くは、パッケージのインストール後のターゲット
(post-install
) を使うだけで簡単に実現できるのではないか、
とお思いになるかもしれませんが、それは正しくありません。
このターゲットのコードは、パッケージをソースから構築した場合しか実行されないからです。
バイナリーパッケージを使う場合は、(コード自体が利用できないので)
このターゲットのコードでは何もできません。したがって、上述の各機能は、
pkginstall が自動生成するインストール用スクリプトでしか実現できないのです。
すでにご存知のとおり、PLIST
ファイルには、
パッケージに属するファイルとディレクトリーの一覧が書かれています。
この一覧では、インストール用のプレフィックス
(${PREFIX}
) からの相対位置を使うため、
このディレクトリー以外の場所にあるファイルを書くことはできません
(絶対パス名は使えません)。この制約がある一方で、
パッケージによってはそのような場所、たとえば
${VARBASE}
や
${PKG_SYSCONFDIR}
以下にファイルをインストールする必要があります。
これをおこなう唯一の方法は、インストール時にインストール用のスクリプトを使って
インストール対象のファイルを作成することです。
汎用のインストール用スクリプトは、
任意のコードを含めることのできるシェルスクリプトです。
実行するスクリプトを並べたリストを INSTALL_FILE
変数で与えます。
この変数の値は標準では INSTALL
です。
パッケージの削除用としても、同様の変数があります (DEINSTALL_FILE
:
標準の値は DEINSTALL
)。
これらのスクリプトでは任意のコマンドを実行できるので、
ファイルシステム中のどこであってもファイルの作成や管理をすることができます。
以上のような汎用のインストール用スクリプトを使うことはおすすめしませんが、 特殊な事例では必要となることがあります。これらを使うべきでない理由のひとつは、 インストール用スクリプト内に不必要なコードや単純に誤ったコードが入っていないことについて、 利用者がパッケージ作成者を信頼する必要があるということです。 また、以前は、同じ機能のために同様のコードがたくさん使われており、 それらに共通するエラーを修正する場合は、 同様のコードをすべて探して変更する必要がありました。
pkginstall の枠組では、これとは異なる標準化された方法を提供します。
パッケージの Makefile
で設定された変数にもとづき、
インストール対象のファイルやディレクトリーを操作するための汎用のスクリプトを提供します。
以下、本節では、この用途で使う変数を説明します。
以下の変数は、ファイルシステムの任意の場所へディレクトリーを作成するために、 設定することができます。
MAKE_DIRS
と OWN_DIRS
は、
インストール用スクリプトが作成したり、
削除を試みたりする対象のディレクトリーのリストを値として持ちます。
両変数の違いは、後者はアンインストール時に (空でなかったために)
削除できなかった各ディレクトリーを削除するよう管理者に対してうながしますが、
前者はそうしないことです。
MAKE_DIRS_PERMS
と
OWN_DIRS_PERMS
は、インストール用スクリプトが作成したり、
削除しようとしたりする対象のディレクトリーについて記述したタプルのリストを値として持ちます。
各タプルは、ディレクトリー名、所有者、所有グループと、
数字で表したモードの値をスペースで区切ったものからなります。
たとえば以下のようになります。
MAKE_DIRS_PERMS+= ${VARBASE}/foo/private ${ROOT_USER} ${ROOT_GROUP} 0700
両変数の違いは、PERMS
のつかない変数の違いとまったく同じです。
インストール用プレフィックス以外の場所に空でないファイルを作ることは、やりにくいことです。
なぜなら PLIST
は全ファイルをインストール用プレフィックス内にあるものとして扱うからです。
この問題に対する唯一の解決策は、インストールの際に、
ファイルをいったん既知の場所 (つまり、インストール用プレフィックス内)
に展開し、それを本来の場所にコピーすることです
(pkginstall が生成するインストール用スクリプトがおこないます)。
以下、インストール用プレフィックス以外の場所のファイルを自動的かつ首尾一貫して扱うために使える変数について説明しますが、
ここではプレフィックス内にいったん展開したファイルのことを原本ファイル (master
file) ということにします。
CONF_FILES
と
REQD_FILES
は、
原本ファイルとコピー先ファイルの組のリストを値として持ちます。
インストール時に、コピー先ファイルが存在しなかった場合に限って、
原本ファイルがコピー先ファイルにコピーされます。アンインストール時は、
コピー先ファイルがインストールにおいて変更されていなければ、
コピー先ファイルが削除されます。
両変数の違いは、後者はアンインストール時に (空でなかったために) 削除できなかった各ファイルを削除するよう管理者に対してうながしますが、 前者はそうしないことです。
CONF_FILES_PERMS
と
REQD_FILES_PERMS
は、
原本ファイルとコピー先ファイルについて記述したタプルのリストを値として持ちます。
各タプルは、ファイル名のほか、両ファイルの所有者、所有グループと、
数字で表したパーミッションを、この順番で指定します。
たとえば以下のようになります。
REQD_FILES_PERMS+= ${PREFIX}/share/somefile ${VARBASE}/somefile ${ROOT_USER} ${ROOT_GROUP} 0700
両変数の違いは、PERMS
のつかない変数の違いとまったく同じです。
(個々のパッケージの) 設定ファイルは、パッケージに固有のディレクトリー
PKG_SYSCONFDIR
にインストールされ、また、
インストール時には特別扱いが必要である (ほとんどのことは、pkginstall
で自動化されています) という点で、特別です。主に心がける必要があることは、
設定ファイルであるとされたファイルは、インストール時に、
そのファイルがもともと存在しなかった場合に限って、
正しい場所 (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
変数だけを使うことができます。
この値の設定に使われるアルゴリズムは、
基本的には以下のとおりです。
PKG_SYSCONFDIR.${PKG_SYSCONFVAR}
が設定されている場合は、
この値が使われます。
前項の変数は定義されていないが、
PKG_SYSCONFSUBDIR
がパッケージの
Makefile
で設定されている場合は、
${PKG_SYSCONFBASE}/${PKG_SYSCONFSUBDIR}
が使われます。
以上の場合以外は、
${PKG_SYSCONFBASE}
に設定されます。
なお、${PKG_SYSCONFDIR}
は自動的に
OWN_DIRS
に追加されることを断っておきます。この意味については、Section 15.1.1, “ディレクトリーの操作”をご覧ください。
ただし、${PKG_SYSCONFDIR}
のサブディレクトリーは追加されませんので、
OWN_DIRS または MAKE_DIRS を使って作成する必要があります。
pkgsrc (とユーザーも) が、設定ファイルを既知の場所に置くことを前提としている場合は、 設定ファイルをインストールする場所を各パッケージに教えてやる必要があります。 場合によっては、パッケージの Makefile を修正する必要があります。 この修正は、運がよければ、 コンフィギュレーションスクリプトに渡すフラグを追加する程度ですみます。 これは、GNU Autoconf が生成したファイルの場合が該当します。
CONFIGURE_ARGS+= --sysconfdir=${PKG_SYSCONFDIR}
なお、ここで指定しているのは、 パッケージが設定ファイルを探す必要のある場所であって、 設定ファイルのもともとのインストール先ではありません (困った事に、 両者ははっきり区別できませんが)。
前述のとおり、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
変数は当該パッケージに特有のものであって、
それ以外では意味を持たないことに注意してください。
システムの起動スクリプトは、OS ごとに決まった場所にインストールする必要があり、 その場所はたいていインストール用のプレフィックス以外の場所にある、という点で、 特別なファイルです。したがって、Section 15.1, “インストール用のプレフィックス以外の場所にあるファイルとディレクトリー”で説明したのと同じ方法を適用して、 同じ解決法を使うことができます。ただし、 pkginstall では起動スクリプトの処理専用の仕組みを用意しています。
システムの起動スクリプトが附属するパッケージでは、 以下のことをおこなう必要があります。
スクリプトに .sh
サフィックスを付け加えて、
${FILESDIR}
内に置きます。例としては、
files ディレクトリーに cupsd.sh
がある
print/cups
パッケージをご覧ください。
スクリプト名から拡張子を抜いたものを RCD_SCRIPTS
変数に追加して、pkginstall がこのスクリプトを処理するようにします。
前出の例では以下のようになります。
RCD_SCRIPTS+= cupsd
以上のことをおこなえば、pkginstall は各スクリプトに対して、 以下の手順を自動的におこないます。
files ディレクトリー以下の各ファイルに対して、
FILES_SUBST
変数で示されている置換をすべて適用します。
スクリプトを、files ディレクトリーから examples
階層 ${PREFIX}/share/examples/rc.d/
にコピーします。
なお、この原本ファイルは、PLIST
に明示的に登録する必要があります。
起動スクリプトを examples 階層からシステム全体の起動スクリプト用ディレクトリーにコピーするためのコードを、 インストール用スクリプトに追加します。
パッケージのインストール時に、特別なユーザーやグループを作成する必要がある場合、 pkginstall の枠組を使って作成することができます。
PKG_USERS
変数にユーザーのエントリーを追加すると、
ユーザーを作ることができます。各エントリーは、
以下のような書式となります。
user:group
ユーザーごとに変数を設定して、
ユーザーの属性をさらに詳しく指定することができます。
PKG_UID.
は、
ユーザーの数字の UID です。
user
PKG_GECOS.
は、
ユーザーの説明またはコメントです。
user
PKG_HOME.
は、
ユーザーのホームディレクトリーで、指定しなかった場合は
user
/nonexistent
となります。
PKG_SHELL.
は、
ユーザーのシェルで、指定しなかった場合は
user
/sbin/nologin
となります。
同様にして、PKG_GROUPS
変数にグループのエントリーを追加すると、
グループを作ることができます。こちらの書式は以下のようになります。
group
PKG_GID.
を定義すると、グループの数字の GID を設定することができます。group
もっと前の段階でユーザーやグループを作る必要がある場合は、
どの相の直後にユーザーやグループを作るかを表すために、
USERGROUP_PHASE
を
configure
または build
に設定することができます。
こうした場合は、作られるユーザーやグループの数字の UID や GID は、
自動的に最終的なインストール用スクリプトにハードコードされます。
パッケージがシステムシェルをインストールする場合は、管理者の手間を減らせるよう、
インストールしたシェルをシェルデータベース /etc/shells
に登録するようにします。この登録は、どのシステム上でもバイナリーパッケージが機能するようにするため、
インストール用スクリプトでおこなう必要があります。pkginstall では、
このことを簡単に実現できる方法を用意しています。
パッケージがシェルインタープリターを提供する場合は、
PKG_SHELL
変数を、そのシェルの絶対ファイル名に設定する必要があります。
こうすると、インストール用スクリプトに、シェル登録処理用のフックを追加します。
shells/zsh
から抜粋した例を以下に掲げますので、ご覧ください。
PKG_SHELL= ${PREFIX}/bin/zsh
X11 フォントをインストールするパッケージでは、 各フォントディレクトリー内のフォントの索引であるデータベースファイルを更新することが必要になります。 この更新は、pkginstall の枠組内で簡単におこなうことができます。
パッケージが X11 フォントをインストールする時には、
フォントをインストールするディレクトリーを、
FONTS_DIRS.
変数に列挙する必要があります。この type
type
は、“ttf”,
“type1”, “x11” のいずれかです。
こうすると、指定した各ディレクトリーのフォントデータベースファイルを更新するコマンドを実行するフックが、
インストール用スクリプトに追加されます。
利便のため、このディレクトリーのパスが相対パスで指定した場合は、
パッケージのインストール用プレフィックスからの相対位置として扱われるようになっています。fonts/dbz-ttf
から抜粋した例を以下に掲げますので、ご覧ください。
FONTS_DIRS.ttf= ${PREFIX}/lib/X11/fonts/TTF
Table of Contents
多くのパッケージは、対応する機能の組合せを変えて構築することができます。
bsd.options.mk
は pkgsrc における枠組のひとつで、
このようなオプションに応じて異なるパッケージ構築方法の判断を、
汎用的に処理するものです。この枠組のなかで、利用者は、
どのようなオプションの組合せを組み込んでパッケージを構築するかを厳密に指定したり、
大域的な標準状態のオプションの組合せを適用したりすることができます。
パッケージの振舞を、オプションの枠組を使って制御したい状況は、 大きく分けて二つあります。 ひとつは、プログラム自体の構築は常におこなうものの、 そのなかのある機能を有効にするかしないかです (他のパッケージに依存させるかさせないかによって制御することがよくあります)。 もうひとつは、別のプログラムを、 そのパッケージの一部として追加するかしないかです。 後者は、一般的には、オプションの枠組を使わずに、 パッケージを分割したほうがいいでしょう。 パッケージを分割すれば、 バイナリーパッケージを別々に追加できるようになるからです。 たとえば、foo パッケージには最小限の (それがないと foo パッケージに何の意味もなくなるような) 依存性を持たせておいたうえで、 別の foo-gfoo パッケージに GTK のフロントエンドプログラム gfoo を入れておくのです。 この方法は、foo パッケージに gfoo を追加する gtk オプションを用意する方法より、 すぐれています。なぜなら、オプションの枠組を使ってしまうと、 このオプションが標準で有効な場合は、 バイナリーパッケージの利用者は gfoo 抜き版の foo を使えず、 また、標準で有効ではない場合は、 バイナリーパッケージの利用者は gfoo を使えないからです。 パッケージを分割すれば、バイナリーパッケージの利用者は、 GTK 抜き版の goo をインストールすることも、 後から gfoo をインストールする (GTK はそのときになってから取り寄せる) こともできます。 また、ソースの利用者にとっても、 foo パッケージの再構築の必要がなくなるという利点があります。
依存性が大きく変化するようなプラグインは、通常は、 オプションではなく分割したほうがよいでしょう。
パッケージを分割すると、保守の手間が増えることがよくあります。 そのパッケージの本家が分割に対応していない場合は特にそうです。 分割するかオプションにするかは、 たくさんのパッケージの細切れや、依存パッケージの大きさや、作業量に対して、 利用者がどう思うであろうか、という見地に立って判断するようにします。
さらに考慮が必要なことは、ライセンスです。フリーではない部品や、 フリーでないもの (特にプラグイン) に依存する部品は、 分割可能な限り分割するのがよいでしょう。
標準の大域的なオプションは、
PKG_DEFAULT_OPTIONS
に列挙します。この値は、
そのオプションに対応しているパッケージすべてに組み込むオプションを並べたものです。
この変数は mk.conf
で設定するようにします。
以下に掲げるのは、bsd.options.mk
を架空の ``wibble'' パッケージでどのように使うかを示したものです。
パッケージの Makefile
に直接書くか、
別のファイル options.mk
に書いて
Makefile
からインクルードするか、
どちらかの方法をとります。
PKG_OPTIONS_VAR= PKG_OPTIONS.wibble PKG_SUPPORTED_OPTIONS= wibble-foo ldap PKG_OPTIONS_OPTIONAL_GROUPS= database PKG_OPTIONS_GROUP.database= mysql pgsql PKG_SUGGESTED_OPTIONS= wibble-foo PKG_OPTIONS_LEGACY_VARS+= WIBBLE_USE_OPENLDAP:ldap PKG_OPTIONS_LEGACY_OPTS+= foo:wibble-foo .include "../../mk/bsd.prefs.mk" # this package was previously named wibble2 .if defined(PKG_OPTIONS.wibble2) PKG_LEGACY_OPTIONS+= ${PKG_OPTIONS.wibble2} PKG_OPTIONS_DEPRECATED_WARNINGS+= \ "Deprecated variable PKG_OPTIONS.wibble2 used, use ${PKG_OPTIONS_VAR} instead." .endif .include "../../mk/bsd.options.mk" # Package-specific option-handling ### ### FOO support ### .if !empty(PKG_OPTIONS:Mwibble-foo) CONFIGURE_ARGS+= --enable-foo .endif ### ### LDAP support ### .if !empty(PKG_OPTIONS:Mldap) . include "../../databases/openldap-client/buildlink3.mk" CONFIGURE_ARGS+= --enable-ldap=${BUILDLINK_PREFIX.openldap-client} .endif ### ### database support ### .if !empty(PKG_OPTIONS:Mmysql) . include "../../mk/mysql.buildlink3.mk" .endif .if !empty(PKG_OPTIONS:Mpgsql) . include "../../mk/pgsql.buildlink3.mk" .endif
最初の節には、 このパッケージがどの構築オプションに対応しているかに関する情報があり、 標準状態を設定する必要があるオプションについてはその設定をしています。
PKG_OPTIONS_VAR
は、
make(1) 変数の名前で、
利用者はその名前の変数を設定して標準のオプションを上書きすることができます。
この変数名は PKG_OPTIONS.pkgbase
のように設定します。
オプションの処理をする段階では
PKGBASE
は定義されていないので、
PKG_OPTIONS.${PKGBASE} と定義してはいけません。
PKG_SUPPORTED_OPTIONS
は、このパッケージが対応している構築オプションを並べたリストです。
PKG_OPTIONS_OPTIONAL_GROUPS
は、
互いに排他的なオプションからなるグループの名前を並べたリストです。
各グループに含まれるオプションは、
PKG_OPTIONS_GROUP.
に列挙します。
ここでは、各グループのオプションのうちもっとも特徴的な設定を先頭に書きます。
各グループに含まれるオプションは、自動的に
groupname
PKG_SUPPORTED_OPTIONS
に追加されます。
PKG_OPTIONS_REQUIRED_GROUPS
は、
PKG_OPTIONS_OPTIONAL_GROUPS
に似ていますが、
グループに含まれるオプションをどれも選ばなかった場合には、
パッケージの構築に失敗する点が異なります。
PKG_OPTIONS_NONEMPTY_SETS
は、
オプションの集合の名前を並べたリストです。
各集合からは、少なくともひとつのオプションを設定する必要があります。
各集合に含まれるオプションは、
PKG_OPTIONS_SET.
に列挙します。
各集合に含まれるオプションは、自動的に
setname
PKG_SUPPORTED_OPTIONS
に追加されます。
集合に含まれるオプションをひとつも設定しなかった場合、パッケージの構築に失敗します。
PKG_SUGGESTED_OPTIONS
は、
標準状態で有効となる構築オプションを並べたリストです。
PKG_OPTIONS_LEGACY_VARS
は、
旧式の mk.conf
変数を同等のオプションに対応づけた
“USE_VARIABLE
:option
”
という組合せを並べたリストです。
この組合せは、旧式の変数の大域的なリストを残すために、
“+=” を使って追加するようにします。
利用者が旧式の変数を使った場合には、警告が出ます。
PKG_OPTIONS_LEGACY_OPTS
は、
名前が変更されたオプションを新しいものに対応づけた
“old-option
:new-option
”
という組合せを並べたリストです。
この組合せは、旧名のオプションの大域的なリストを残すために、
“+=” を使って追加するようにします。
利用者が旧名のオプションを使った場合には、警告が出ます。
PKG_LEGACY_OPTIONS
は、
廃止された変数用のオプションを並べたリストです。
これは、PKG_OPTIONS_LEGACY_VARS
と
PKG_OPTIONS_LEGACY_OPTS
のどちらでも対処できない場合、
たとえば PKG_OPTIONS_VAR
の名前が変更された場合などに使うものです。
PKG_OPTIONS_DEPRECATED_WARNINGS
は、
廃止された変数やオプションが使われたことと、その代替として何を使うかについての、
警告を並べたリストです。
パッケージ側では PKG_DEFAULT_OPTIONS
や、
PKG_OPTIONS_VAR
による変数名を変えてはいけません。
これらはもっぱら利用者が設定するためのものです。
オプションの標準設定を提案する場合は
PKG_SUGGESTED_OPTIONS
を使います。
PKG_OPTIONS_VAR
は、
bsd.options.mk
をインクルードする前に定義する必要があります。
PKG_SUPPORTED_OPTIONS
,
PKG_OPTIONS_OPTIONAL_GROUPS
,
PKG_OPTIONS_REQUIRED_GROUPS
のいずれも定義されていない場合は
(実行対象のプラットフォームが、
プラットフォーム固有のオプションのどれにも対応していない場合に、
これらの影響を受ける可能性があるため)、 PKG_OPTIONS
は空のリストに設定され、
パッケージがオプションの枠組を使わないように保護されます。
bsd.options.mk
がインクルードされた後、
変数 PKG_OPTIONS
は、
選択された構築オプションを並べたリスト
(非対応あるいは廃止されたオプションは適切に除去されています)
を値として持っています。
残りの節では、各オプション固有の処理をしています。
あるオプションが PKG_OPTIONS
のリストに含まれているかどうかの確認は、
以下のようにするのが正しい方法です。
.if !empty(PKG_OPTIONS:Moption
)
異なるパッケージに類似の機能を追加するオプション (あるライブラリーにオプションで対応するなど) は、 その機能に対応した全パッケージの間で共通の名前 (そのライブラリーの名前など) を使うべきです。 同じ意味のオプションをもつパッケージがすでに存在する場合は、 それと同じ名前を使ってください。
ひとつのパッケージに固有の機能を追加するオプションで、
他の (無関連の) パッケージが同じ (または類似の) オプション機能をもちそうにない場合は、
冒頭に
をつけたオプション名を使うようにします。pkgname
-
一群の関連パッケージの間で、
それらに固有のオプション機能を共有している場合は、
“主たる”パッケージ名を冒頭につけた形にします
(たとえば djbware-errno-hack
)。
新しいオプションを追加する場合は、
mk/defaults/options.description
にそのオプションの行を追加します。
行は、タブで区切られた二つのフィールドからなります。
最初のフィールドはオプション名、
二つ目はその説明です。この説明は、完全な文章 (大文字ではじまり、ピリオドで終わる)
で、このオプションで何ができるかを説明します。たとえば、“Enable ispell
support.” とします。このファイルはオプション名でソートします。
buildlink3.mk
ファイルを書くときには、
依存パッケージがどのようなオプションで構築されたかによって場合分けして、
異なる依存性を列挙する必要がある場合がよくあります。
このようなオプションの問い合わせには、
pkgsrc/mk/pkg-build-options.mk
ファイルを使うようにします。
通常は、以下のように使います。
pkgbase := libpurple .include "../../mk/pkg-build-options.mk" .if !empty(PKG_BUILD_OPTIONS.libpurple:Mdbus) ... .endif
pkg-build-options.mk
をインクルードしたところで、
PKG_BUILD_OPTIONS.libpurple
変数に、
libpurple パッケージの構築オプションが設定されます。これにより、
options.mk
における PKG_OPTIONS
と同様に、オプションを問い合わせることができます。
詳細は、pkg-build-options.mk
ファイルをご覧ください。
Table of Contents
本章では、パッケージがどのように構築されるかについて、詳しく説明します。
パッケージの構築は、複数の相 (phase) (たとえば、fetch
,
build
, install
) にわかれており、
そのすべてを以下の各節で説明します。それぞれの段階は、pre-
,
do-
, post-
のいずれかが相名の前についた、いわゆる期 (stage)
にわかれます。(たとえば、
pre-configure
, post-build
などです。)
実際に何かがおこなわれるのは、ほとんどが do-*
期においてです。
標準的なターゲット (fetch
など) は、決して上書きしないでください。変更する必要がある場合は、
対応する do-*
ターゲットを上書きしてください。
プログラムを構築するための基本的な手順は常に同じです。最初に、プログラムの ソースファイル(distfile)をローカルシステムへ持ってきて展開します。 コンパイルするための pkgsrc 独自のパッチを適用した後に、ソフトウェアを設定 し、構築(通常、コンパイルすることによって)します。最後に作成されたバイナリー 等を、システムにインストールします。
それぞれの段階で何が起きているかを、もっと詳しく把握するために、
PKG_VERBOSE
変数を設定することができます。
または、patch の段階における詳細に関心があるだけなら、
PATCH_DEBUG
変数を設定することもできます。
次のセクションでNetBSDパッケージシステムによって実行される手順の概略を述 べる前に、プログラムがインストールされる場所、その場所に影響をおよぼす変数 について簡単に記述します。
自動変数PREFIX
は、最終的にプログラムのすべてのファイルがインストールされる
場所をしめします。通常、LOCALBASE
(/usr/pkg
)、またはcross
カテゴリーの
パッケージのためのCROSSBASE
と同じ場所になっています。
PREFIX
の値は、プログラムのソース中でこれらのファイルが符号化されるさまざ
まな場所に使用されるべきです。
詳細に関しては、Section 11.3, “patches/*”およびSection 19.3.1, “共有ライブラリー - libtool”を参照して下さい。
これらの変数のどれかを選択し使用する場合には、 以下のルールに従ってください。
PREFIX
は常に現在のパッケージがインストールされる場所を指します。パッ
ケージ自身のインストール先のパスを参照する時に、“${PREFIX}”を使用してくだ
さい。
LOCALBASE
は、すべての非X11パッケージがインストールされる場所です。他
の非X11パッケージによってインストールされたインクルードファイルやライブ
ラリーの場所をさがすためのコンパイラーの-Iや-Lオプションを指定する場合に、
“${LOCALBASE}”を使用してください。
LOCALBASE
という変数名は、FreeBSD でパッケージをすべて
/usr/local
にインストールしていたことに由来します。
pkgsrc では /usr/local
をシステム管理者のために使わないようにしているので、
この変数名は間違った名前です。
X11BASE
は、実際に(xsrcなどに由来する)X11ディストリビューションがイン
ストールされる場所です。
通常のX11のインクルードファイル(パッケージとして
インストールされていない)をさがす場合、“${X11BASE}”を使用してください。
X11 ベースのパッケージは特別です。インストールされる場所は、
X11BASE
と LOCALBASE
のどちらに依存することもありえます。
通常、X11 のパッケージは、できるかぎり LOCALBASE
にインストールするものです。X11 のパッケージでは、X11 が必要なことを要求し、
適切な編集フラグを持つようにするために、
../../mk/x11.buildlink3.mk
をインクルードする必要があります。
しかし、LOCALBASE
以下にはインストールできないパッケージもあります。
app-defaults ファイルが附属するようなパッケージが該当します。
このようなパッケージは例外であり、X11BASE
以下にインストールする必要があります。そうするためには、
パッケージ側で USE_X11BASE
または USE_IMAKE
のいずれかを設定します。
註:
Makefile
で USE_IMAKE
や USE_X11BASE
を定義したパッケージによってインストールされたインクルードファイルやライブラリーをさがす場合、
${X11BASE}
と
${LOCALBASE}
を両方調べる必要があります。
X11 パッケージをすべて強制的に LOCALBASE
にインストールさせるために、
pkgtools/xpkgwedge
パッケージが標準で有効になっています。
X11パッケージのインストール場所を参照する用途には、X11PREFIX
を使って
ください。X11PREFIX
は、xpkgwedgeがインストールされていない場合は
X11BASE
となり、xpkgwedgeがインストールされている場合はLOCALBASE
と
なります。
xpkgwedgeがインストールされている場合、パッケージによってインストール先
がX11BASE
になっていたりLOCALBASE
になっていたりすることがあります。インス
トールされているパッケージのprefixを決めるために、EVAL_PREFIX
定義を使う
ことができます。この定義に“DIRNAME=<package>”の形式の組を書くと、make(1)変
数DIRNAME
が、インストールされているパッケージ <package>のprefixに設定され
ます。そのパッケージがインストールされていない場合は“${X11PREFIX}”に設定さ
れます。
例を使って説明するのが一番いいでしょう。
以下は、
pkgsrc/wm/scwm/Makefile
からの抜粋です。
EVAL_PREFIX+= GTKDIR=gtk+ CONFIGURE_ARGS+= --with-guile-prefix=${LOCALBASE:Q} CONFIGURE_ARGS+= --with-gtk-prefix=${GTKDIR:Q} CONFIGURE_ARGS+= --enable-multibyte
EVAL_PREFIX
を使って評価するパッケージに対して、以下のような定義を使って
デフォルトを定義することができます。
GTKDIR_DEFAULT= ${LOCALBASE}
ここでGTKDIR
は、
EVAL_PREFIX
での最初の定義の組に対応します。
パッケージは ${PREFIX}
以下に、
hier(7) に準じてファイルをインストールするようにします。
ただしマニュアルページは例外で、${PREFIX}/share/man
ではなく ${PREFIX}/man
にインストールします。
パッケージの構築時には、ソースファイル、一時ファイル、 pkgsrc 内部ファイルなどを置いておくために、さまざまなディレクトリーが使われます。 そのようなディレクトリーについて説明します。
ディレクトリーを指す変数のなかには、相対パス名を値に持つものがあります。
このような相対パス名の基点となるディレクトリーは、おもに二つあります。
一つは PKGSRCDIR/PKGPATH
で、pkgsrc 特有のディレクトリー用です。
もう一つは WRKSRC
で、パッケージそのものの内部にあるディレクトリー用です。
PKGSRCDIR
絶対パス名で、 pkgsrc のルートディレクトリーを指します。 通常は、この変数を使う必要はありません。
PKGDIR
当該パッケージを指す 絶対パス名です。
PKGPATH
PKGSRCDIR
を基点とした相対パス名で、
当該パッケージを指します。
WRKDIR
絶対パス名で、全作業がおこなわれるディレクトリーを指します。 distfile はこのディレクトリーに展開されます。 一般的に、このディレクトリーには、 buildlink や wrappers など、 pkgsrc の各種基盤が使う一時ディレクトリーも含まれます。
WRKSRC
絶対パス名で、distfile が展開されるディレクトリーを指します。
普通は、WRKDIR
直下のサブディレクトリーであり、
多くの場合は、このディレクトリーにおける、
唯一の隠されていないディレクトリーエントリーです。この変数は、パッケージの
Makefile
で変更することができます。
CREATE_WRKDIR_SYMLINK
定義は、
yes または no のいずれかの値をとり、
標準状態では no になります。これは、
pkgsrc の個々のパッケージのディレクトリー内に、
WRKDIR
へのシンボリックリンクを作成するか否かを示します。
pkgsrc ツリーを読み取り専用として使いたい場合は、
CREATE_WRKDIR_SYMLINK
の値を
no にしてください。
make phase (phase は相の名前) と打てば、
その相を実行することができます。
こうすると、その相のために必要な相をすべて自動的に実行します。
相を指定しない場合は build
相になります。つまり、
あるパッケージのディレクトリーで、引数なしで make
を実行すると、パッケージが構築されますが、インストールはされません。
パッケージの構築の最初の段階は、配布ファイル (distfiles) を、そのファイルを配布しているサイトから取得することです。 これは fetch 相がおこなう仕事です。
単純な場合では、MASTER_SITES
で
distfile (distfile のファイル名は DISTNAME
が使われます)
を取得する URL をすべて定義します。
これより複雑な場合については、以下で説明します。
変数 DISTFILES
は、取得する必要のある
distfile を並べたリストを指定します。この値は、標準では
${DISTNAME}${EXTRACT_SUFX}
になり、
ほとんどのパッケージではあえて定義する必要がありません。
EXTRACT_SUFX
は、標準では .tar.gz
になりますが、自由に変更することができます。なお、標準で定義される
distfile に加えて別の distfile が必要な場合は、
それを +=
演算子を使って追加することはできません。
たとえば以下のように書く必要があります。
DISTFILES= ${DISTNAME}${EXTRACT_SUFX} additional-files.tar.gz
各 distfile は、通常は MASTER_SITES
に並べられたサイトから取得されます。パッケージに複数の
DISTFILES
または複数の
PATCHFILES
があり、それらが異なるサイトで配布されている場合は、
ファイル (サフィックスを含む) の配布場所の URL を並べたリストを
distfile
SITES.
に設定することができます。distfile
DISTFILES= ${DISTNAME}${EXTRACT_SUFX} DISTFILES+= foo-file.tar.gz SITES.foo-file.tar.gz= \ http://www.somewhere.com/somehow/ \ http://www.somewhereelse.com/mirror/somehow/
distfile を実際に取得する際、それらは、
MASTER_SITES
または
SITES.*
に各 distfile のファイル名をそのまま (間にスラッシュを入れずに)
つなげた形の URL から取得されます。このため、サイトを定義する変数の値は、
スラッシュその他の分離記号で終わる必要があります。このため、たとえば
MASTER_SITES
を、distfile 名を引数としてとる
CGI スクリプトの URL にすることができます。そうした場合、
以下のような形で定義することになります。
MASTER_SITES= http://www.example.com/download.cgi?file=
例外は、URL の前にダッシュ (-) がついている場合です。 この場合、その URL を (distfile とつなげずに) そのまま使って distfile を取得し、 取得したファイルを distfile の名前で保存します。
パッケージで使うため、MASTER_SITES
用にあらかじめ定義された値がいくつか用意されています。
各変数の意味は、名前から明らかでしょう。
${MASTER_SITE_APACHE} ${MASTER_SITE_BACKUP} ${MASTER_SITE_CYGWIN} ${MASTER_SITE_DEBIAN} ${MASTER_SITE_FREEBSD} ${MASTER_SITE_FREEBSD_LOCAL} ${MASTER_SITE_GENTOO} ${MASTER_SITE_GNOME} ${MASTER_SITE_GNU} ${MASTER_SITE_GNUSTEP} ${MASTER_SITE_IFARCHIVE} ${MASTER_SITE_KDE} ${MASTER_SITE_MOZILLA} ${MASTER_SITE_MYSQL} ${MASTER_SITE_OPENOFFICE} ${MASTER_SITE_PERL_CPAN} ${MASTER_SITE_PGSQL} ${MASTER_SITE_R_CRAN} ${MASTER_SITE_SOURCEFORGE} ${MASTER_SITE_SOURCEFORGE_JP} ${MASTER_SITE_SUNSITE} ${MASTER_SITE_SUSE} ${MASTER_SITE_TEX_CTAN} ${MASTER_SITE_XCONTRIB} ${MASTER_SITE_XEMACS}
名前から意味がわかりにくいものについて、説明しておきます。
MASTER_SITE_BACKUP
には、ftp://ftp.NetBSD.org/pub/pkgsrc/distfiles/${DIST_SUBDIR} で保守されている、パッケージのバックアップサイトが含まれます。
MASTER_SITE_LOCAL
には、ftp://ftp.NetBSD.org/pub/pkgsrc/distfiles/LOCAL_PORTS/ で保守されている、パッケージのローカルなソース配布物が含まれます。
もしこれらの予め定義されたサイトの1つを選んだ場合、そのサイトのサブディレク トリーを指定することが必要となるかもしれません。これらのマクロは複数の実際 のサイトに展開されるかもしれませんので、サブディレクトリーを指定する場合は、 以下の表記を使わなければなりません:
MASTER_SITES= ${MASTER_SITE_GNU:=subdirectory/name/} MASTER_SITES= ${MASTER_SITE_SOURCEFORGE:=project_name/}
サブディレクトリー名の後のスラッシュ/に注意してください。
fetch 相では、distfile
がすべてローカルディレクトリー (DISTDIR
,
pkgsrc 利用者が設定可能) に存在する状態にします。
distfile は以下の形式のコマンドを使って取得されます。
${FETCH_CMD} ${FETCH_BEFORE_ARGS} ${site}${file} ${FETCH_AFTER_ARGS}
この ${site}
には、複数の候補が決まった順序で使われます: 最初に
MASTER_SITE_OVERRIDE
を試み、次に、SITES.file
が定義されていればそれ
を、定義されていなければ、MASTER_SITES
かPATCH_SITES
のどちらかを試
みます。そして、最後にMASTER_SITE_BACKUP
の値を試みます。
これらのうち最初のものと最後のもの以外の順序は、
MASTER_SORT_RANDOM
を設定し、かつ
MASTER_SORT_AWK
か
MASTER_SORT_REGEX
を設定して、ユーザー
が入れ換えることができます。
この取得用のコマンドと引数は、
FETCH_USING
変数に応じたものが使われます。
上述の例は、FETCH_USING=custom
とした場合のものです。
the NetBSD Foundation が運営している distfile
のミラーサイトでは、自由に配布可能な distfile
をミラーするために mirror-distfiles
ターゲットを使っています。NO_SRC_ON_FTP
を (たいていは “${RESTRICTED}” に)
設定しているパッケージの distfile はミラーされません。
distfileを取得した後に、チェックサムを生成し、distinfoファイルに保存され たチェックサムと比較します。もし、チェックサムが一致しなければ、構築は中 断されます。これはパッケージ作成時と同じdistfileが、構築に使用されている こと、つまり、悪意や一次配布サイトでの意図的な差し替えやネットワークの損 失によってdistfileが変更されていないことを保証するためです。
distfileがローカルシステム上に存在している場合、 通常、それらは圧縮アーカイブフォーマットで保存されているので、 展開する必要があります。
標準では、DISTFILES
はすべて展開されます。
一部だけを展開する必要がある場合は、
EXTRACT_ONLY
変数を、
展開する必要のあるファイルを並べたリストに設定することができます。
通常、ファイルの展開は mk/extract/extract
という小さなプログラムを使っておこなわれます。このプログラムは、
各種アーカイブ形式の展開方法を知っているので、
何も変更する必要はないでしょう。それでも変更が必要な場合は、
以下の変数を使うとよいでしょう。
EXTRACT_OPTS_{BIN,LHA,PAX,RAR,TAR,ZIP,ZOO}
この各変数を使って、展開用のコマンドのオプションを、
標準のもの (mk/extract/extract
で定義されています) から上書きします。
EXTRACT_USING
この変数は、tar アーカイブ展開用のコマンドを設定するもので、
bsdtar
, gtar
, nbtar
(標準状態での値), pax
または、
コマンドの絶対パス名に設定することができます。
NetBSD の (tar として使われる) pax でうまく展開できない場合は、
なるべく gtar より bsdtar を選ぶようにします。
必要なことが extract
プログラムではできない場合は、ファイル展開用のコマンドを保持する
EXTRACT_CMD
変数を上書きすることもできます。
この変数で指定された展開用コマンドは、
${WRKSRC}
ディレクトリー内で実行されます。
このコマンドの実行中は、シェル変数 extract_file
に、展開中のアーカイブファイルの絶対パス名が保持されます。
これでもなお不十分な場合は、パッケージの Makefile で、
do-extract
ターゲットを上書きすることができます。
展開の後で、PATCHFILES
で指定されたパッチとパッケージのpatchesサブディレ
クトリーに存在するパッチ、さらに、$LOCALPATCHES/$PKGPATH (たとえば
/usr/local/patches/graphics/png
)に存在するパッチのすべてが適用されます。
.Z
、あるいは.gz
で終る名前のパッチファイルは、適用する前に伸張されます。
.orig
、.rej
で終るものは無視されます。patch(1)のためのいくつかのオプショ
ンは、PATCH_DIST_ARGS
で指定する事ができます。
詳細に関してはSection 11.3, “patches/*”を参照して下さい。
デフォルトでは、パッチに曖昧さがあった場合にはpatch(1)が異常終了するような 特別な引数が渡されます。パッチを修正(再作成)して、きれいに適用できるよう にしてください。そうする理由は、曖昧さがあるパッチが一見うまく適用できても、実は誤った場 所に適用されていて、深刻な問題を起こす可能性があるからです。
この相についてはChapter 18, 構築や実行のために必要なツール で説明しています。
この相では、コンパイラーとリンカー用のラッパープログラムが作成されます。 以下の変数を使って、ラッパーに手を加えることができます。
ECHO_WRAPPER_MSG
経過を表示するためのコマンドです。
標準状態では何もしません。
経過を見るには、この変数を ${ECHO}
に設定します。
WRAPPER_DEBUG
この変数は、
ラッパーのログファイルにより詳しい情報が必要かどうかに応じて、
yes
(標準状態の値) または
no
に設定することができます。
WRAPPER_UPDATE_CACHE
この変数は、
ラッパーの速度を改善するためキャッシュを使わせるかどうかに応じて、
yes
または no
に設定することができます。標準状態の値は
yes
ですが、キャッシュに対応していないプラットフォームでは
強制的に no
になります。
WRAPPER_REORDER_CMDS
順序の並び替え用のコマンドを並べたリストです。
並び替え用のコマンドは、
reorder:l:
のような形式をしています。これを使うと
lib1
:lib2
-l
が常に
lib1
-l
より先に現れるようになります。
lib2
WRAPPER_TRANSFORM_CMDS
変換用のコマンドを並べたリストです。 [TODO: investigate further]
ほとんどのソフトウェアは、実行対象のプラットフォームで利用できるヘッダーファイル、 システムコール、およびライブラリールーチンについての情報を必要とします。 この情報の判断はコンフィギュレーションとして知られているプロセスであり、 通常、自動化されています。 大抵の場合、スクリプトが配布物と一緒に提供され、 それを実行することによりヘッダーファイルやMakefile等が生成されます。
パッケージが configure スクリプトを含んでいる場合、HAS_CONFIGURE
を “yes” に設定することにより、実行することができます。
もし、その configure スクリプトが GNU の autoconf スクリプトである場合は、
かわりに、GNU_CONFIGURE
を “yes” に指定してください。
大雑把にいうと、configure 相では以下のようなことをしています。
.for d in ${CONFIGURE_DIRS} cd ${WRKSRC} \ && cd ${d} \ && env ${CONFIGURE_ENV} ${CONFIGURE_SCRIPT} ${CONFIGURE_ARGS} .endfor
CONFIGURE_DIRS
(標準では “.”) は、
WRKSRC
からの相対位置でのパス名を並べたリストです。
この各ディレクトリー内で、環境変数 CONFIGURE_ENV
および
引数 CONFIGURE_ARGS
を使って
configure スクリプトが実行されます。
CONFIGURE_ENV
, CONFIGURE_SCRIPT
(標準では “./configure”),
CONFIGURE_ARGS
の各変数は、いずれもパッケージ側で変更することができます。
もし、プログラムがコンフィギュレーションのために Imakefile
を使用するので
あれば、USE_IMAKE
を “yes” に設定することにより、適切な手順が実行されます。
(もし、${X11PREFIX}
にインストールされるパッケージが欲しいだけで、xmkmfを実
行したくない場合、かわりにUSE_X11BASE
を使用してください。)
SCRIPTS_ENV
に変数を設定すると、
その変数を xmkmf の環境変数に追加することができます。
プログラムがコンフィギュレーションのために cmake
を使用するのであれば、
USE_CMAKE
を “yes” に設定することにより、適切な手順が実行されます。
CONFIGURE_ENV
に変数を追加すると、
その変数を cmake の環境変数に追加することができます。
また、CMAKE_ARGS
変数に引数を追加すると、
cmake の引数に追加することができます。
最上層ディレクトリーを指定する引数は
CMAKE_ARG_PATH
変数で与えられるようになっており、
この変数の標準の値は
“.” (CONFIGURE_DIRS
からの相対位置) です。
configure の段階ですることが何もない場合は、
NO_CONFIGURE
を “yes” に設定します。
パッケージの構築は、大雑把にいえば、 以下のコードを実行するのと同じことです。
.for d in ${BUILD_DIRS} cd ${WRKSRC} \ && cd ${d} \ && env ${MAKE_ENV} \ ${MAKE_PROGRAM} ${BUILD_MAKE_FLAGS} \ -f ${MAKE_FILE} \ ${BUILD_TARGET} .endfor
BUILD_DIRS
(標準では
“.”) は、
WRKSRC
からの相対位置でのパス名を並べたリストです。
この各ディレクトリー内で、環境変数
MAKE_ENV
および引数
BUILD_MAKE_FLAGS
を使って
MAKE_PROGRAM
が実行されます。
MAKE_ENV
,
BUILD_MAKE_FLAGS
,
MAKE_FILE
,
BUILD_TARGET
の各変数は、いずれもパッケージ側で変更することができます。
MAKE_PROGRAM
の標準の値は、
USE_TOOLS
に “gmake” が含まれている場合は
“gmake”、含まれていない場合は “make” です。
MAKE_FILE
の標準の値は “Makefile” であり、
BUILD_TARGET
の標準の値は “all” です。
build の段階ですることが何もない場合は、
NO_BUILD
を “yes” に設定します。
構築の段階が完了すると、ユーザーが構築されたプログラムやファイルを使えるようにするため、ソフトウェアをパブリックなディレ クトリーにインストールする必要があります。
install 相は、大雑把にいえば、 以下のコードを実行するのと同じことです。これに加えて、 このコードの前後では、整合性の検査やパッケージの登録などをするため、 多くの操作がおこなわれます。
.for d in ${INSTALL_DIRS} cd ${WRKSRC} \ && cd ${d} \ && env ${MAKE_ENV} \ ${MAKE_PROGRAM} ${INSTALL_MAKE_FLAGS} \ -f ${MAKE_FILE} \ ${INSTALL_TARGET} .endfor
各変数の意味は、build
相のものと同様です。
INSTALL_DIRS
は標準では
BUILD_DIRS
です。INSTALL_TARGET
は標準では “install” ですが、
USE_IMAKE
が定義されており、かつ
NO_INSTALL_MANPAGES
が定義されていない場合は、
“install.man”
が追加されます。
install 相では、以下の変数が有用です。
これらはいずれも install(1) コマンドの変種であり、
所有者、所有グループ、パーミッションをあらかじめ決めてあるものです。
INSTALL
は、オプションを何も指定しない install コマンドです。
用途別に特化した変種には、以下のものがあります。
INSTALL_PROGRAM_DIR
バイナリーを含むディレクトリー
INSTALL_SCRIPT_DIR
スクリプトを含むディレクトリー
INSTALL_LIB_DIR
共有静的ライブラリーを含むディレクトリー
INSTALL_DATA_DIR
データファイルを含むディレクトリー
INSTALL_MAN_DIR
マニュアルページを含むディレクトリー
INSTALL_PROGRAM
デバッグ用シンボルを取り除くことのできるバイナリー
INSTALL_SCRIPT
シンボルを取り除くことのできないバイナリー
INSTALL_GAME
ゲームのバイナリー
INSTALL_LIB
共有静的ライブラリー
INSTALL_DATA
データファイル
INSTALL_GAME_DATA
ゲーム用のデータファイル
INSTALL_MAN
マニュアルページ
これらのほか、以下の変数があります。
INSTALLATION_DIRS
pkgsrc が install
相の最初に作成するディレクトリーを
PREFIX
からの相対位置表記で並べたリストです。
パッケージは、ファイルをインストールする前に、
必要なディレクトリーをすべて自力で作成することになるので、
その他のディレクトリーをすべてここに列挙します。
稀な場合として、パッケージが何もインストールしないような場合は、
NO_INSTALL
を “yes” に設定します。
これはほとんどの場合、regress
カテゴリーのパッケージに関するものです。
install 期が完了すると、 インストールされたファイルからなるバイナリーパッケージを作ることができます。 このようなバイナリーパッケージは、たとえば make bin-install するか、 pkg_add を使って、それまでのコンパイルの過程を踏まずに、 迅速にインストールすることができます。
標準では、バイナリーパッケージは
${PACKAGES}/All
に作られ、また、
CATEGORIES
変数に設定されたカテゴリーごとに
${PACKAGES}/
にシンボリックリンクが作られます。category
PACKAGES
は標準では pkgsrc/packages
になります。
パッケージの作業が終わったら、make clean を実行して作業ディレクトリーを掃除することができます。 依存パッケージの作業ディレクトリーもすべて掃除したい場合は、 make clean-depends を使います。
前のセクションで述べた主ターゲットのために、二つの補助ターゲットが存在し ます。これは主ターゲットに“pre-”や“post-”というプレフィックスをつけ たものです。これらのターゲットは、特別な設定やインストール手順のために、 主ターゲットが実行される前や後に、パッケージの Makefile から実行されます。例えば、プログラムのコンフィ ギュレーションスクリプトやインストールターゲットが省略された場合に有用で す。
主なターゲットがおかしな動作をし、それを修正するための変数が存在しない場 合、do-*ターゲットを使用することにより、それらを再定義することができます (do-*ターゲットのかわりに、ターゲット自体を再定義してはいけません。pre-* やpost-*ターゲットが実行されなくなってしまいます)。通常、再定義する必要 はありません。
もし、make install実行後に、いくつかのファイルがきちんとインストール されなかった事に気がついた場合、このターゲットを使い、再びインストールす る事ができます。この場合、“インストール済み”フラグは無視されます。
これは、DEPENDS_TARGET
の標準の値です。ただし make update および make
package の場合は例外であり、これらについてはそれぞれ
“package” および “update”
が標準の値になります。
このターゲットは、パッケージをアンインストールするためにカレントディレク トリーでpkg_delete(1)を実行します。動作を制御するために、以下の変数を 使用することができます。
PKG_VERBOSE
pkg_delete(1)コマンドに「-v」オプションを渡します。
DEINSTALLDEPENDS
指定されたパッケージに必要な(依存する)すべてのパッケージを削除します。
このターゲットは、指定されたパッケージによってインストールされたパッ
ケージを削除するために使用されます。例えば、make deinstall
DEINSTALLDEPENDS=1がpkgsrc/x11/kde
で実行された場合、KDE全体を削除し
ます。pkg_delete(1)のコマンドラインに“-R”を指定すると設定されます。
バイナリーパッケージを、
ローカルディスクまたは列挙された FTP サイト
(BINPKG_SITES
変数を参照)
からインストールし、
利用可能なバイナリーパッケージがどこにもない場合には
make package をおこないます。
pkg_add 用の引数、たとえば饒舌な操作などを
BIN_INSTALL_FLAGS
に設定することができます。
このターゲットは、現在のパッケージを最新のものに更新します。最初にパッケー
ジと、それに依存するすべてのパッケージをアンインストールします。それから
最新のバージョンのパッケージをコンパイル、インストールします。これは、現
在どのパッケージがインストールされているかを調べ、make deinstall、
make install(または、UPDATE_TARGET
で設定されたターゲット)を続けて実
行するのと同じです。
以前に実行したmake
updateがさまざまな理由で中断された場合、パッケー
ジの更新のために、このターゲットを使用することができます。
ただし、この場
合は、make cleanを実行していない事、あるいはWRKDIR
の依存パッケー
ジのリストを削除していない事を確認してください。そうでなければ、インストー
ル済みの依存パッケージを使用し、現在のパッケージを自動更新することができ
ません。
中断されたmake updateの再開は、パッケージツリーの他の部分が変更され ていない場合に限って動作します。更新対象のパッケージのソースコードが変更 されていた場合は、make updateの再開はきっと失敗するでしょう。
make
updateの動作を変更するために、以下の変数をコマンドライン、また
はmk.conf
で使うことができます。
UPDATE_TARGET
更新されたパッケージや依存パッケージのために再帰的に使用されるインス
トールターゲット。
make update用のデフォルトは、DEPENDS_TARGET
が
設定されている場合はその値、それ以外の場合は“install”です。
これら以外のターゲットのよい例としては “package” や
“bin-install” があります。
ここで “update” を設定してはいけません
(無限ループに陥ってしまいます)。
NOCLEAN
更新した後、きれいに掃除をしません。調査やその他の目的のために、更新 されたパッケージの作業用ソース等をそのままにしておきたい場合に役に立 ちます。最終的にはソースツリーを掃除してください(以下の “clean-update”ターゲットを見てください)。そうしなければ、次回の makeやmake updateの時に古いソースコードが残っていることで トラブルがおこるかもしれません。
REINSTALL
インストール(make DEPENDS_TARGET
)の前に各パッケージをアンインストー
ルします。これは、make
updateの実行中断後に“clean-update”ターゲット
(以下参照)が呼ばれた場合に必要となることがあります。
DEPENDS_TARGET
再帰を無効化し、パッケージのターゲットをハードコードすることができま
す。updateターゲット用のデフォルトは“update”であり、事前に必要なパッ
ケージを再帰的に更新するようになっています。DEPENDS_TARGET
を設定する
のは、再帰的な更新を無効化したいときだけにしてください。make update
(後述します)の最中にインストールされる各パッケージに対して、特定のター
ゲットを指定するだけの場合は、これのかわりにUPDATE_TARGET
を使ってく
ださい。
カレントディレクトリーでmake updateが実行された時に更新されるすべて
のパッケージのソースツリーを掃除します。カレントパッケージ(あるいは、依
存パッケージ)がすでにアンインストールされている(例えばmake updateを実行
した後)場合には、このターゲットを使ってはいけません。もし使用すると、更
新するつもりのパッケージのいくつかを失う可能性があります。経験的には、初
めてmake updateを実行する前、あるいは汚れたパッケージツリーがある場
合(例えばNOCLEAN
を使用した場合)にのみ使用するとよいでしょう。
パッケージのツリーが掃除されているかどうかわからない場合は、ツリーの最上 層でmake cleanを実行するか、更新しようとしているパッケージのディレクト リーで以下のコマンドをこの順に使うか、どちらかをおこなうことができます。 (make updateを初めて実行するより前におこなってください。それ以外の場 合、更新しようとしているパッケージをすべて失ってしまいます)
#
make clean-update
#
make clean CLEANDEPENDS=YES
#
make update
make
clean-updateの動作を変更するために、以下の変数をコマンドライン、
またはmk.conf
で使うことができます。
CLEAR_DIRLIST
make cleanの後で、パッケージのためのディレクトリーのリストを再構
築しません。make updateで、更新したいすべてのパッケージがインストー
ルされた場合にのみ使用してください。通常、これはmake updateで自動
的に実行されます。ただし、NOCLEAN
変数の設定によって実行されない事もあ
ります(上を参照してください)。
当該パッケージのインストールを更新します。
依存するパッケージの置き換えをおこなわないという点で
update と異なります。
このターゲットを動作させるためには、pkgtools/pkg_tarup
をインストールする必要があります。
このターゲットは注意して使ってください。 このターゲットを使って更新した後に、 依存するパッケージが動作するという保証はありません。 特に、ライブラリーのパッケージで、 共有ライブラリーのメジャーバージョンが変わるようなものを make replace した場合は、ほぼ確実に壊れます。 このため、このターゲットは公式にはサポートされておらず、 熟練した利用者だけが使うことを推奨します。
このターゲットは、現在のパッケージに対してpkg_info(1)をおこないます。これ を使って、インストールされているパッケージのバージョンを調べる ことができます。
これは最上層用のコマンド、つまり pkgsrc
ディレクトリーで使うコマンドです。
ローカルの pkgsrc ツリー内の全パッケージのデータベースを作成します。
このデータベースには、依存性、コメント、メンテナー、
その他の有用な情報が含まれます。
個々のパッケージのエントリーは、当該パッケージのディレクトリーで
make describe を実行して作成されます。
作成された索引ファイルは
pkgsrc/INDEX
に保存されます。
この索引は、make
print-index を実行すると、饒舌な形式で表示することができます。
make search
key=something
を使って、索引を検索することができます。
make show-deps
PKG=somepackage
を実行して、特定のパッケージに依存するパッケージをすべて調べることができます。
このコマンドの実行には、非常に長い時間がかかります。 速いマシンでも数時間かかるでしょう。
このターゲットは、
README.html
ファイルを作成します。このファイルは www/firefox
や www/links
のようなブラウザー
で閲覧することができます。作成されたファイルは、ローカルホストの
PACKAGES
ディレクトリーにあるパッケージへの参照を含んでいます。また、
FTP_PKG_URL_HOST
とFTP_PKG_URL_DIR
を元にしたURLを参照させることもできます。
例えば、ローカルマシン上の/usr/packages
ディレクトリーのバイナリーパッ
ケージを参照するREADME.html
ファイルを作成したい場合、
FTP_PKG_URL_HOST=file://localhost
とFTP_PKG_URL_DIR=/usr/packages
をセット
してください。${PACKAGES}
ディレクトリーと、そのサブディレクトリーはすべ
てのバイナリーパッケージで検索されます。
このターゲットは、最上層またはカテゴリーのディレクトリーで実行することもできます。 そうした場合は、配下のパッケージに対して再帰的に実行されます。
これは最上層用のコマンドであり、pkgsrc
で実行します。
このターゲットを使い、README-all.html
を作成することができます。このファ
イルはNetBSDパッケージコレクションの中の、現在利用可能なすべてのパッケー
ジのリスト、また、それらが属するカテゴリーと簡単な説明を含んでいます。こ
のファイルはpkgsrc/*/README.html
から作りだされます。したがって、make
readme
の後に、このターゲットを実行してください。
これは“readme”ターゲット(上を見てください)とほとんど同じですが、CD-ROMに焼
かれるpkgsrcツリーを作る時に使われます。また、このターゲットは
README.html
ファイルを作成し、CDROM_PKG_URL_HOST
とCDROM_PKG_URL_DIR
に基づ
くURLへの参照を作ります。
このターゲットは、パッケージを構築するために、どのdistfileやパッチファイ
ルが必要か (ALLFILES
:
DISTFILES
およびPATCHFILES
をすべて含みますが、
patches/*
は含みません) を表示します。
このターゲットは、パッケージがインストールされていない場合は何も表示しま せん。もし、あるバージョンのパッケージがインストールされているが、現在の pkgsrcのバージョンでインストールされたものでない場合、警告メッセージを表 示します。このターゲットは、インストール済みのパッケージが古いバージョン であり、そのバージョンが削除可能で、最新の物が追加されることを表示するた めに使用されます。
当該パッケージの構築とインストールが可能な、パッケージ階層におけるディレ クトリーを表示します。このディレクトリーは、そのパッケージがインストール された際のディレクトリーと同じとは限りません。このターゲットは、単一ホス ト上で多数のパッケージの更新をしたい場合に使うためのもので、pkgsrc の最 上層のMakefileから“show-host-specific-pkgs”ターゲットで呼び出すことがで きます。
このターゲットは、インストールされているパッケージのうち、どれが当該パッ
ケージのDEPENDS
と合致するかを表示します。依存関係が古いせいで構築に問題が
起きる場合に便利です。
パッケージのインストール後に、すべてのバイナリーおよび(ELFプラットフォー
ムでは) 共有ライブラリーが必要な共有ライブラリーを見つけられるかどうか確
認します。mk.conf
でPKG_DEVELOPER
が設定されている場合はデフォルトで
実行します。
パッケージを新規に、または更新のために“make install”した後、
find -newer
work/.extract_doneをもとに新しいPLIST
を生成して表示します。PLIST生成は、
共有ライブラリーなどに配慮して行われますが、生成した結果をPLIST
に置く前
に再確認するよう強くおすすめします。パッケージ更新時には、このコマンド
の出力と、更新前のPLIST
ファイルとを比較すると便利でしょう。
パッケージが、tar(1)その他のファイルのアクセス時刻を更新しない方法を使っ
てファイルをインストールする場合は、それらのファイルはこのターゲットで使われる “find
-newer” コマンドで検
出されないので、手でPLIST
に書き足すよう注意してください!
このターゲットに関するさらなる情報は、 Section 13.3, “make print-PLIST の出力を細工する”を参照してください。
バルクビルドの実行に使われます。適切なバイナリーパッケージがすでに存在す
る場合は、何もしません。そうでない場合は、コンパイル、インストール、パッ
ケージ作成をおこないます
(PKG_DEPENDS
が適切に設定されている場合は、依存するパッケージも。Section 7.3.1, “設定”参照)。
バイナリーパッケージ作成後、ディスクの空き領域
を確保するために、ソース、インストールしたばかりのパッケージと依存パッケー
ジは削除されます。
このターゲットを使うと、 システムにインストールされているパッケージをすべてアンインストールすることもあるので、 注意してください。
依存パッケージ群をインストールするためのバルクインストールで使われます。 最新のバイナリーパッケージが利用可能な場合、pkg_add(1)でそれをインストール します。そうでない場合は、make bulk-packageが実行されますが、インストー ルされたバイナリーは削除されません。
バイナリーパッケージが“最新”であるとみなされる (pkg_add(1) でインストールされる) 条件は、以下のとおりです。
パッケージファイル
(Makefile
, ...)が、いずれも構築時から変更されていな
いこと。
そのパッケージが依存している(バイナリー) パッケージが、いずれも構築時から変更されていないこと。
このターゲットを使うと、 システムにインストールされているパッケージをすべてアンインストールすることもあるので、 注意してください。
Table of Contents
USE_TOOLS
定義は、
パッケージを構築するためにどのコマンドが必要か (BUILD_DEPENDS
のように)、
あるいは、インストールしたパッケージを実行するためにどのコマンドが必要か (DEPENDS
のように) を定義するために、
pkgsrc 内部で使われており、また、個々のパッケージ用としても使われています。
適当なツールがシステムに標準で附属していれば、多くの場合は
pkgsrc のパッケージは使われません。
パッケージを構築するときは、実行検索パスの前のほうにあるディレクトリーに、 代替ツールが (シンボリックリンクまたはラッパースクリプトとして) 用意されます。 buildlink システムと同様に、 こうすることで、首尾一貫した構築ができるようになります。
あるツールは、パッケージの構築を補助するために必要となることがあります。 たとえば、perl, GNU make (gmake), yacc はこのために必要になることがあります。
また、あるツールは、たとえば、システム標準附属のツールでは pkgsrc によるパッケージの構築用としては使い物にならないために、 必要となることがあります。 たとえば、パッケージが GNU awk, (yacc ではなく) bison や、 より優れた sed を必要とすることがあります。
パッケージが使うツールの実体は、 make show-tools を実行すると一覧表示されます。
pkgsrc が標準状態で使うツール一式は、
bsd.pkg.mk
で定義されています。ここには、
cat, awk,
chmod, test
などのような標準的な Unix のツールが含まれています。
これらは
make show-var VARNAME=USE_TOOLS を実行すると見ることができます。
個々のパッケージの構築のためにあるプログラムが必要な場合は、
USE_TOOLS
変数を使って
必要なツールを定義することができます。
以下の例では、:pkgsrc は、構築時依存性として、 ネイティブのバージョンではなく pkgsrc のバージョンを使うことを意味します。 また、:run は、実行時依存性としても使うことを意味します (ので、DEPENDS になります)。 このようなものを付けない場合は、構築時依存性を意味します。これは :build を明示的に使って設定することもできます。 (このため、以下の例のものは、それぞれ gmake:build および pkg-config:build と同じことです。)
USE_TOOLS+= mktemp:pkgsrc USE_TOOLS+= gmake perl:run pkg-config
このツールの枠組を使う時には、
TOOLS_PATH.foo
変数が、
適切なツールへのフルパスとして定義されます。
たとえば、TOOLS_PATH.bash
は Linux システム上では
“/bin/bash” になったりするでしょう。
実行時に常に pkgsrc バージョンのツールが必要となる場合は、
この枠組ではなく、単に DEPENDS
を使ってください。
pkgsrc の改良、あるいは新プラットフォームへの移植をする時には、
pkgsrc/mk/tools/tools.${OPSYS}.mk
以下にある、
対象プラットフォーム用の make file の断片を見て (あるいは作って) ください。
このファイルでは、たとえば以下のように、共通的に使うツールの名前を定義しています。
.if exists(/usr/bin/bzcat) TOOLS_PLATFORM.bzcat?= /usr/bin/bzcat .elif exists(/usr/bin/bzip2) TOOLS_PLATFORM.bzcat?= /usr/bin/bzip2 -cd .endif TOOLS_PLATFORM.true?= true # shell builtin
18.4.1. |
新しいツールを追加する方法は? |
TODO |
|
18.4.2. |
利用可能なツールの全一覧を見る方法は ? |
TODO |
|
18.4.3. |
あるパッケージの構築に使われているツールの全一覧を見る方法は? sed が使われているかどうかを知りたいんだけど。 |
今のところ、できません。 (TODO: が、 できるようにしたいと考えています。) |
Table of Contents
mk.conf
から利用者が設定可能な変数を捕まえる方法pkgsrc の目玉の一つは、多くのプラットフォームで動作することです。 そのため、pkgsrc のパッケージの移植性をできるかぎり高めることが重要になります。 本章では、pkgsrc の作業に際して、 注意が必要となる具体的な事項を説明します。
mk.conf
から利用者が設定可能な変数を捕まえる方法pkgsrc の利用者は、MAKECONF
によって参照されるファイル (標準では mk.conf
)
でいくつかの変数を上書きして、pkgsrc の設定をすることができます。
このような変数を make(1) のプリプロセッサーディレクティブ
(たとえば .if
や
.for
) の内部で使いたい場合は、
利用者の設定が読み込まれる場所より前で
../../mk/bsd.prefs.mk
をインクルードする必要があります。
しかし、変数によっては、
まだ定義されていない変数への参照を含んでいることがあるために、
../../mk/bsd.prefs.mk
をインクルードした後では完全に定義することができないものがあります。
シェルコマンドの場合は、変数の実態はマクロであり、
使われるときにしか展開されないので、このことは問題にはなりません。
ただし、前述したプリプロセッサーディレクティブの内部や、
依存性を記した行 (target: dependencies
のような形式の行)
においては、読み込み時に変数が展開されます。
各変数が読み込み時に使用可能か、 実行時にのみ使用可能かを網羅した一覧は、現在のところありませんが、 準備をしているところです。
時々、パッケージがユーザーとの対話を必要とする場合がありますが、 そのような状況は何通りもありえます:
distfile の取得時に、パッケージによっては、 ユーザー名とパスワードの入力や web ページ上のライセンスへの同意のような、 利用者の対話を必要とするものがあります。
distfile の展開時に、 パッケージによってはパスワードを要求することがあります。
パッケージの構築前の設定の補助
構築過程の最中の補助
パッケージのインストール中の補助
どの段階で対話が必要になるかをpkgsrcの機構に知らせるため、
INTERACTIVE_STAGE
定義が用意されており、
パッケージのMakefile
で定義します。
たとえば以下のようにします。
INTERACTIVE_STAGE= build
複数の段階を指定することもできます:
INTERACTIVE_STAGE= configure install
利用者は、BATCH
変数を設定して、
この定義がおこなわれているパッケージをとばすことができます。
ソフトウェアの作者は、 そのソフトウェアをどのようなライセンスのもとでコピーすることができるかを、定めることができます。 これは著作権法にもとづくことであって、ライセンス選択の理由は pkgsrc システムの範疇外です。pkgsrc システムでは、 ライセンスのなかには、従うことに不服だったり、 従うことが困難あるいは不可能だったりする利用者がいるようなライセンスがたくさんあることを認識しています。 Free Software Foundation ではいくつかのライセンスに対して、 それが「自由」なライセンスであると表明していますし、 Open Source Initiative では「オープンソース」を定義しています。 pkgsrc では、ライセンスが「自由」あるいは「オープンソース」であるといった目印をパッケージにつけたりはしないという方針をとっています。 ただし、これらの定義にあてはまらないライセンスをもつパッケージには、 ライセンスについて記した目印がついています。 なお、ライセンスでコピーを認めていないパッケージは、 明らかに、「自由」にも「オープンソース」にも該当しません。
「自由」でも「オープンソース」でもないパッケージについては、 構築してよいということを、個々のライセンスについて利用者が pkgsrc に指定しておかない限り、 pkgsrc はパッケージを構築しません。 なお、このドキュメンテーションでは、「ライセンスに同意する」 ("accepted the license") という言いまわしを避けています。 pkgsrc システムは、単に、 フリーでないライセンスのソフトウェアを誤って構築してしまうことがないようにする仕組みを提供しているだけです。 判断や責任は、利用者に委ねています。 (現在のところ、バイナリーパッケージのインストールは、 この仕組みの対象外です。これはバグです。)
BSD ライセンスと GPL のパッケージだけをインストールし、
それ以外はインストールしたくない、ということがあるかもしれません。
標準状態では、フリーなライセンスが
ACCEPTABLE_LICENSES
変数に列挙されています。
ACCEPTABLE_LICENSES
変数を
"+=" ではなく "=" を使って設定すれば、
どのライセンスを許容するかを利用者が上書きできます。
標準状態で許容されているライセンスは以下のとおりです。
public-domain gnu-gpl-v2 gnu-lgpl-v2 gnu-gpl-v3 gnu-lgpl-v3 original-bsd modified-bsd x11 apache-2.0 cddl-1.0 open-font-license
ライセンスの目印の仕組みは、パッケージの構築、インストール、
および使用にまつわる著作権関連の問題を処理するためのものであって、
再配布にまつわる問題 (RESTRICTED
および
NO_SRC_ON_FTP
などを参照) のためのものではありません。
再配布に制限のあるパッケージには、
これらの変数を使って再配布に制限があることを示す必要があります。
パッケージのコピーが特殊なライセンスのもとで認められていることを示すには、
そのライセンスを
pkgsrc/licenses
に置いたうえで、
LICENSE
変数をライセンスを特定する文字列に設定します。
たとえば、graphics/xv
では以下のようになります。
LICENSE= xv-license
構築しようとすると、利用者はそのパッケージに適用されているライセンスが
ACCEPTABLE_LICENSES
変数に設定されていないことを知らされます。
%
make
===> xv-3.10anb9 has an unacceptable license: xv-license. ===> To view the license, enter "/usr/bin/make show-license". ===> To indicate acceptance, add this line to your /etc/mk.conf: ===> ACCEPTABLE_LICENSES+=xv-license *** Error code 1
ライセンス自体は make
show-license すると見ることができます。
そのライセンスのものを構築してよい場合は、
pkgsrc が今後はそのライセンスを理由に構築をやめないように、
上の表示中で指示されている行を mk.conf
に追加することができます。
ACCEPTABLE_LICENSES+=xv-license
新しいライセンスが適用されているパッケージを追加する場合、
表示用のライセンスのテキストを pkgsrc/licenses
に追加します。既知のライセンスの一覧は、
このディレクトリーで見ることができます。
ライセンスが (整形以外で) 変更された場合は、 必ず、新しいライセンスの名前を以前のものと別の名前にします (たとえば、 バージョン番号があればそれを、なければ日付を末尾につけるなど)。 これは、前バージョンのライセンスのもとにあるプログラムを構築することを pkgsrc に指示している利用者が、 新しいライセンスのもとにあるプログラムを構築しないようにするためです。 もっと高度な点でいうと、 pkgsrc はライセンスの相当性を評価しません。 すなわち、個々のライセンスのテキストを、二組織のいずれかが (「自由」あるいは「オープンソース」であると) 認めているかどうかという、 機械的な検査をしているだけなのです。
LICENSE=shareware
や、
LICENSE=no-commercial-use
のような言いまわしは、
ライセンスの文面を特定できないので、
使わないことになりました。
また、このような言いまわしを使った場合の別の問題として、
利用者が pkgsrc に対して、同じ目印のついた複数のパッケージのうち、
ひとつのパッケージだけは構築を続行するが、
それ以外のパッケージは構築を続行しない、
といった指定ができなくなるというものもあります。
ライセンスによっては、ソフトウェアの再配布方法に制限があります。 パッケージが「自由」あるいは「オープンソース」でない限りは、 ライセンスの目印が必要なので、制限のあるパッケージにはすべてライセンスの目印がついているはずです。 その制限について記述しておくと、パッケージのツールは、 自動的に制限されたこと (たとえばバイナリーパッケージを FTP サイトに置くこと) を控えたりすることができます。
ソース (distfile) とバイナリーそれぞれについて、 置いていけないのが FTP サイトか CD-ROM かの組み合わせで、 4 種類の制限を表現することができます。どのライセンスでも、 これが厳密な文言となっていることはほとんどないことや、 フリーでない各ライセンスはお互いに異なる傾向があることから、 pkgsrc では FTP と CD-ROM を定義しています。 pkgsrc では、"FTP" を、ソースやバイナリーのファイルを、 インターネット上で料金を払わずに利用できるようにしてはいけない、 という意味で使います。 pkgsrc では、"CD-ROM" を、ソースやバイナリーを、 配布料金をとるような何らかの種類の媒体に、 他のソースやバイナリーパッケージと同梱して利用できるようにすることはできない、 という意味で使います。
このような 制限を表現するため、パッケージシステムでは以下のような制限を設定で きる5個のmake変数を定義しています:
RESTRICTED
なにか制限がある場合は常に、(制限の種類にかかわらず)この変数を設定します。 この変数を、その制限の理由を含む文字列に設定してください。 制限を理解しなければならない人は、ライセンスを読む必要がありますし、 おそらく法的な助言も必要だと考えなければなりません。
NO_BIN_ON_CDROM
バイナリーを、配布料金を取れるようにして、
他のバイナリーパッケージとともにCD-ROMに収録することができません。
そのような場合は常に、この変数を${RESTRICTED}
に設定
してください。
NO_BIN_ON_FTP
バイナリーを、インターネット上で料金を払わずに利用できるようにすることができません。
そのような場合は常に、この変数を
${RESTRICTED}
に設定してください。
この変数を設定すると、バイナリーパッケージは
ftp.NetBSD.org に置かれません。
NO_SRC_ON_CDROM
distfileを、料金を取れるようにして、
他のdistfileとともにCD-ROMに収録することができません。
そのような場合は、この変数を
${RESTRICTED}
に設定してください。
NO_SRC_ON_FTP
distfileを、インターネット上で料金を払わずに利用できるようにすることができません。
そのような場合は、この変数を
${RESTRICTED}
に設定してください。
この変数を設定すると、distfile は
ftp.NetBSD.org にミラーされません。
パッケージは他のパッケージに依存するかもしれません。そして、この依存性を定
義するためのいろいろな方法があります。pkgsrc は、buildlink3.mk
を使った依存関
係 (依存性の処理用としては、こちらが望ましい方法です。
この方法では以下の各変数を使っています。
さらなる情報はChapter 14, buildlink 方法論を参照してください)
のほか、
BUILD_DEPENDS
および DEPENDS
定義、
USE_TOOLS
定義をサポートしています。
両変数の基本的な差異は、以下の通りです: DEPENDS
定義では、
その依存性がバイナリーパッケージ内に記録されるので、
後でバイナリーパッケージをインストールする時に依存性が呼び出されます。
一方、BUILD_DEPENDS
定義ではバイナリーパッケージにそのような記録はされず、
パッケージの構築に際して依存性があることが示されているだけです。
つまり、あるパッケージが必要となるのが構築時だけである場合、そのパッケージ
はBUILD_DEPENDS
として書きます。
BUILD_DEPENDS
および
DEPENDS
定義の書式は以下の通りです:
<pre-req-package-name>:../../<category>/<pre-req-package>
なお、この“pre-req-package-name” のバージョン番号には、pkg_info(1) で説明され ている各ワイルドカードを含めることができます。
パッケージを構築または実行するために他のパッケージのバイナリーやライブラリーが必要で、
そのパッケージに buildlink3.mk
ファイルがある場合は、
それを使ってください。
.include "../../graphics/jpeg/buildlink3.mk"
パッケージを構築するために、他のパッケージのバイナリーが必要な場合は、
BUILD_DEPENDS
定義を使ってください。
BUILD_DEPENDS+= scons-[0-9]*:../../devel/scons
パッケージがリンクのためのライブラリーを必要とし、
そのパッケージに buildlink3.mk
ファイルがない場合は、
buildlink3.mk
ファイルを作ってください。
DEPENDS
を使うと、
インクルードファイルやライブラリーをコンパイラーから隠してしまうので、このような場合には不適切です。
パッケージを実行するために、いくつかの実行可能ファイルが必要であり、かつ
buildlink3.mk
ファイルが存在しない場合は、
DEPENDS
変数を使ってください。print/lyx
パッケージを実行する時には、
teTeXパッケージ由来のlatex のバイナリーが実行可能でなければなりません。これ
は、以下のように指定します。
DEPENDS+= teTeX-[0-9]*:../../print/teTeX
パッケージ依存関係にはワイルドカードを使うことができます。 ワイルドカード依存関係は、バイナリーパッケージを作る時には保持されること に注意してください。依存関係はバイナリーパッケージのインストール時にチェッ クされ、パターンにマッチするパッケージが使われます。ワイルドカード依存関係 は、注意を払って使うよう気を付けてください。
“tk-postgresql”が“tk-*”という
DEPENDS
にマッチするなどの曖昧なマッチの可能性を排除
するため、“-*”ではなく
“-[0-9]*”を使うことをおすすめします。
ワイルドカードは、 依存パッケージがあるバージョン以上でないと構築できないことを指定するのにも使えます。
DEPENDS+= ImageMagick>=6.0:../../graphics/ImageMagick
以上のように書いた場合、このパッケージは ImageMagick のバージョン 6.0 以上を使って構築されることを意味します。このような形式の依存関係は、たとえば、 依存先のコマンドラインオプションが変更された場合にでも、構築できることを保証することができます。
あるバージョン以上のライブラリーに依存させる必要がある場合は、 the pkgsrc guide の buildlink の節をご覧ください。
セキュリティー上の修正があった場合は、 パッケージ脆弱性ファイルを更新してください。 さらなる情報は、Section 19.1.10, “セキュリティー問題を持つパッケージへの対処”を参照してください。
パッケージの構築用に別のパッケージに含まれるファイルが必要な場合は、
関連する配布ファイルを
DISTFILES
に追加して、
必要なファイルが自動的に展開されるようにします。例としては print/ghostscript
パッケージをご覧ください。
(このパッケージは、
構築の際に jpeg のソースがソースの状態で存在することに依存しています。)
パッケージは、すでにインストール済みの別のパッケージと衝突する可能性があり ます。例えば、パッケージが、pkgsrcの中の別のパッケージと同じファイルをイン ストールするような場合です。
この場合、衝突するパッケージ(バージョン文字列を含む)のリストをスペースで区
切ってCONFLICTS
にセットすることができます。
例えば、x11/Xaw3d
およびx11/Xaw-Xpm
は同じ共有ライブラリーをイ
ンストールします。したがって、pkgsrc/x11/Xaw3d/Makefile
に以下のような設定を
おこなってください。
CONFLICTS= Xaw-Xpm-[0-9]*
そして、pkgsrc/x11/Xaw-Xpm/Makefile
には以下の設定が必要です。
CONFLICTS= Xaw3d-[0-9]*
パッケージは、名前のプレフィックスが同じで、異なるバージョン文字列をもつ別 のパッケージと自動的に衝突します。例えば“Xaw3d-1.5”は、古いバージョンの “Xaw3d-1.3”と衝突するでしょう。
環境によってはパッケージを構築しないよう指示するような理由がいくつかありま
す。パッケージが、ほとんどのプラットフォームで構築および実行できる場合は、
NOT_FOR_PLATFORM
として例外を記述します。逆に、パッケージが一部のプラットフォー
ムでしか構築および実行できない場合は、ONLY_FOR_PLATFORM
を設定します。
ONLY_FOR_PLATFORM
と
NOT_FOR_PLATFORM
の値はいずれも、OS triples
(OS-version-platform) であり、
グロブ形式のワイルドカードを使うことができます。
パッケージのなかには、あるオペレーティングシステムの特定のバージョンに強く依存するものがあります。
たとえば、LKM や sysutils/lsof
などです。
このようなバイナリーパッケージは、同じ OS の別バージョンと後方互換ではないので、
FTP サーバーでは対象バージョン専用のディレクトリーにアップロードするようにします。
OSVERSION_SPECIFIC
を “yes” に設定して、
パッケージに印をつけてください。この変数は、現在のところ、
パッケージシステム内部のどこでも使われませんが、
将来は使われることになるかもしれません。
パッケー
ジをとばすべき場合(たとえば、そのパッケージが提供する機能が、すでにシステム
で提供されている場合)は、
PKG_SKIP_REASON
にそのことを説明するメッセージを設
定します。必要な条件が満たされていないせいでパッケージの構築が失敗するであ
ろう場合は、PKG_FAIL_REASON
にそのことを説明するメッセージを設定します。
あるパッケージを、一旦インストールしたら削除できないようにするためには、
そのパッケージの Makefile で PKG_PRESERVE
定義を設定します。この定義を設定した
pkgsrc エントリーから作られたバイナリーパッケージには、その旨が記録されます。
“preserved” 付きのパッケージは、
pkg_delete(1) を使っても、
“-f” オプションを付けない限りは削除されません。
脆弱性が発見された場合、そのことを
localsrc/security/advisories/pkg-vulnerabilities
に記載してcommitしてくださ
い。このファイルを commit した後、同じディレクトリーで make upload
して、ftp.NetBSD.org 上のファイルを更新してください。
脆弱性の修正を、パッチの適用によっておこなった場合は、修正後に
PKGREVISION
を上げます (もちろん、問題の修正を、
新しくリリースされたソフトウェアを使っておこなった場合は、
これは必要ありません)。
また、修正を安定版 pkgsrc 枝に適用したほうがよい場合は、 pullup 要求を提出してください。
ftp.NetBSD.org 上にすでに置かれているバイナリーパッケージは、 週次の cron ジョブによって半自動的に対処されます。
既存のパッケージに修正を加えたときに、PKGNAME
のバージョン番号を変えると便利
な場合があります。元の作者による将来のバージョンと衝突しないようにするため、
PKGREVISION=1
(2, ...)を設定して、パッケージのバージョンに
“nb1”, “nb2”, ...
という接尾辞をつけることができます。この“nb”は、パッケージのツール群からは“.”と
同様の扱いを受けます。たとえば、
DISTNAME= foo-17.42 PKGREVISION= 9
とすると、PKGNAME
は“foo-17.42nb9”になります。
たとえば DIST_SUBDIR
の設定用などに、
PKGNAME
に接尾辞 “nbX” がつかない、
元の値を使いたい場合は、PKGNAME_NOREV
を使います。
このパッケージの新しいリリース版が出た際には、
PKGREVISION
は消してください。
たとえば、上で例示したパッケージの新しいマイナーリリースに際しては、以下の
ようにします。
DISTNAME= foo-17.43
バイナリーパッケージに対して自明でない変化をおよぼす場合は、すべて、
PKGREVISION
を上げるようにします。
PKGREVISION
を上げないと、
変更前のバージョンをインストールしている人が、
そのパッケージが古くなったことを知るすべがなくなってしまいます。
したがって、PKGREVISION
を上げない変更とは、本質的に
「誰もアップグレードする必要のない自明な変更」ということであり、
これが PKGREVISION
を上げるべきか否かを大雑把に判断する方法です。
PKGREVISION
を上げる意味のない変更には、たとえば以下のようなものがあります。
HOMEPAGE
,
MAINTAINER
, OWNER
や、Makefile 中のコメントの変更。
構築変数の変更で、作成されるバイナリーパッケージに変化がない場合。
DESCR
の変更。
PKG_OPTIONS
の追加で、標準のオプションに変化がない場合。
PKGREVISION
を上げる価値のある変更には、
たとえば以下のようなものがあります。
セキュリティーの修正
パッチファイルの変更または追加
PLIST
の変更
依存性の変更や、依存先パッケージの改称。
依存するパッケージの ABI が変更された場合にも、 PKGREVISION を上げる必要があります。
複数のファイルに含まれる同じテキストを置換したい場合や、 テキストの置換方法を変化させたい場合には、パッチだけでは実現できません。 そこで SUBST の枠組の出番です。この枠組では、 ファイル内のテキストを置換するために簡単に使えるインターフェースを用意しています。 たとえば以下のように使います。
SUBST_CLASSES+= fix-paths SUBST_STAGE.fix-paths= pre-configure SUBST_MESSAGE.fix-paths= Fixing absolute paths. SUBST_FILES.fix-paths= src/*.c SUBST_FILES.fix-paths+= scripts/*.sh SUBST_SED.fix-paths= -e 's,"/usr/local,"${PREFIX},g' SUBST_SED.fix-paths+= -e 's,"/var/log,"${VARBASE}/log,g'
SUBST_CLASSES
は、ここで定義する
SUBST の塊を区別するための識別子を並べたリストです。
SUBST の枠組は pkgsrc で多用されているので、この変数には常に
+=
演算子を使うことが重要です。
そうしないと、一部の置換がおこなわれなくなることがあります。
各 SUBST の塊の残りの変数は、
最初の行の識別子 (この例では fix-paths
)
を使ってパラメーター化されています。
これらは、関数呼び出しの引数とみなすことができます。
SUBST_STAGE.*
は、
この置換をどの期におこなうかを指定します。
実際に使われるものは限られていますが、相の名前と
pre-
, do-
,
post-
のあらゆる組合せを使うことができます。
もっともよく使われるのは post-patch
と
pre-configure
です。このふたつのうち、
pre-configure
を使うと、
bmake patch を実行することで、
パッチを適用したほかは一切変更されていない状態にすることができるため、
こちらのほうが好まれます。このことは、
新しいパッチを作成するためにパッケージのデバッグをする際に、
特に便利です。これと同様に、pre-install
よりも post-build
のほうが好まれます。
これは、一般的に install 相は極力簡素なものにするほうがよいからです。
post-build
を使った場合、
後にインストールされるものと同じファイルが作業ディレクトリーにできあがるので、
正しく置換がおこなわれたかを確認することができます。
SUBST_MESSAGE.*
は、
置換がおこなわれる直前に表示するテキストで、省略可能です。
SUBST_FILES.*
は、置換の対象となるファイルを、
シェルのグロブパターンで指定したものを並べたリストです。
このパターンは、WRKSRC
ディレクトリーからの相対位置として解釈されます。
SUBST_SED.*
は置換の内容を
sed(1) への引数の形で指定したものを並べたリストです。
各 sed コマンドの前には -e
をつけて、
SUBST の塊全体が一様に見えるようにします。
以上のほかにも変数がいくつかありますが、
それらはほとんど使われないものなので、
mk/subst.mk
ファイル内でのみ文書化されています。
動的なURLからダウンロードする必要がある場合は、
DYNAMIC_MASTER_SITES
を設定す
ることができます。すると、make fetchは、ダウンロードすべき各ファイルを引
数としてfiles/getsite.sh
を呼び出します。このスクリプトは、ファイルをダウン
ロードするディレクトリーのURLを出力することが前提となっています。
graphics/ns-cult3d
が、
この使い方の例となっています。
パスワード用に個人情報の登録が必要だったり、ソースに代金を払う必要があった
り、その他もろもろの理由により、ダウンロードが自動化できない場合は、
FETCH_MESSAGE
を、
構築中止前にユーザーに表示する説明文を行ごとに並べたリストに設定することができます。
たとえば以下のようにします。
FETCH_MESSAGE= "Please download the files" FETCH_MESSAGE+= " "${DISTFILES:Q} FETCH_MESSAGE+= "manually from "${MASTER_SITES:Q}"."
時々、ソフトウェアパッケージの作者がソフトウェアのリリース後に変更を加え、
変更後のdistfileを、バージョン番号を変えずに公開することがあります。このと
き、pkgsrcにそのパッケージがすでに入っていると、チェックサムが一致しない
ことになります。distfileの更新が意図されたものであって、
トロイの木馬などが仕込まれたのではないことを確認するため、
新しい distfile の内容と変更前の古い distfile の内容と比較してください。
新旧の distfile を比較したことと、何が変わったのかを、
commit メッセージに含めてください。
確認後、この問題の正しい回避策は、DIST_SUBDIR
を一意な (普通は PKGNAME_NOREV
にもとづく) ディレクトリー名に設定することです。
これを設定すると、このパッケージの DISTFILES
と
PATCHFILES
はすべて、
distfiles ディレクトリー以下の、設定した名前のサブディレクトリーに置かれます。
(詳細は、Section 19.1.11, “既存パッケージ修正時に、バージョンを上げるにはどうするか”をご覧ください。)
この問題がよく起きる場合は、ディレクトリー名に
PKGNAME
を使ったり
(これにより nbX
サフィックスが含まれる)、
${PKGNAME_NOREV}-YYYYMMDD
のように日付を付けたりすることができます。
設定後は、distinfo
ファイルを作り直すのを忘れないでください。
このファイルでは、ファイル名のなかに DIST_SUBDIR
パスが含まれているからです。
この変更によって、インストールされるパッケージが以前のものと異なるものになる場合は、
PKGREVISION も上げます。
さらに、パッケージの正当な作者にメールを出して、
リリース後に、ファイル名を変えずに
distfile の内容を変えるのはよろしくないやり方だと伝えてください。
pkgsrcはさまざまな種類のマシンをサポートします。それらはa.outとELFのような
異なるオブジェクトフォーマットを使い、共有ライブラリー、ダイナミックローディ
ングの有無すらも異なります。これに対応するためにコマンドそのもの、およびオ
プションがコンパイラー、リンカーなどに渡される必要があります。すべてのマシ
ンで正しく動作させることは非常にむずかしく、テストのためにすべてのマシンを
持っていない場合は特にそうでしょう。
devel/libtool
パッケージはこれを助けます。
devel/libtool
はプラットフォームによらずに、
ソースファイルから、静的、動的なライブラリー両方を構築する方法
を“知って”いるからです。
以下に、libtoolをパッケージで使用するための7つの手順を記述します。
USE_LIBTOOL=yes
をパッケージのMakefileへ追加します。
ライブラリーオブジェクトのために、“${LIBTOOL} --mode=compile ${CC}”を“${CC}”
に設定します。ライブラリーが、提供されたMakefileだけを使用して構築される
のであれば、CC
の定義にこれを追加するだけです。このコマンドひとつだけで、
PICと非PICのライブラリーオブジェクトを作成します。したがって、共有ライブ
ラリーとそうでないライブラリーの構築規則を別々に記述する必要はありません。
ライブラリーのリンクのための“ar”、“ranlib”、“ld -Bshareable”コマン ドを削除してください。そしてその代わりに以下のコマンドを使用してください。
${LIBTOOL} --mode=link \ ${CC} -o ${.TARGET:.a=.la} \ ${OBJS:.o=.lo} \ -rpath ${PREFIX}/lib \ -version-info major:minor
ライブラリーの拡張子は.la
に、オブジェクトの拡張子は
.lo
に変更されることに
注意してください。OBJS
を必要に応じて変更してください。このコマンドは、必
要なものすべて、
.a
、.so.major.minor
、
そしてELFのシンボリックリンク(必要
なら)を自動的にカレントディレクトリーに作成します。特に、メジャー番号と
マイナー番号がゼロの場合は、“-version-info”をかならず含めるようにしてくだ
さい。そうしないとlibtoolは共有ライブラリーのバージョンを取り除きます。
libtool のマニュアルより:
libtool のライブラリーのバージョンは、以下の三つの整数で表されます。 CURRENT このライブラリーが実装しているインターフェース番号のうち最新のもの。 REVISION CURRENT インターフェースの実装番号。 AGE このライブラリーが実装しているインターフェースの最新のものと最古のものの間の差。 すなわち、このライブラリーが実装しているのは、 `CURRENT - AGE' から `CURRENT' までの番号の範囲にある、 すべてのインターフェース番号です。 二つのライブラリーの CURRENT と AGE 番号がいずれも同じ場合、 ダイナミックリンカーは REVISION 番号が大きいほうのライブラリーを選びます。
また、“-release”オプションは、ある一つの場合に限って、a.outとELF(シンボ リックリンクを除く)との間で異なる結果をもたらします。 “libfoo-release.so.x.y” の形式のELFライブラリーは、a.outプラットフォーム上 では “libfoo.so.x.y” のシンボリックリンクを持ちます。これは自動的に処理され ます。
“-rpath引数”は構築されたライブラリーのインストール先ディレクトリーです。
PLIST
には、
.la
ファイルだけを含めます。
これ以外のファイルは自動的に追加されます。
共有オブジェクト(.so
)ファイル(すなわち、dlopen(3)でロードされるファイル
であって、共有ライブラリーでは*ありません*)のリンク時には、ファイルにバー
ジョンが加えられないようにするため、“-module -avoid-version”を使ってくだ
さい。
PLIST
ファイルにはfoo.so
の一覧が加わります。
インストールする前のライブラリーに依存するプログラムをリンクする時に、
cc(1)かld(1)の前に
“${LIBTOOL} --mode=link”を書いてください。このコマンドは、正
しいライブラリー(静的、または共有)を見つけます。ただし、libtoolを使う時
には-Lオプションで相対パスを指定すること(“-L../somelib”のように)ができない
ことに注意してください。引数として.la
ファイルを使うように修正しなければ
なりません。例えば、
${LIBTOOL} --mode=link ${CC} -o someprog -L../somelib -lsomelib
は、以下のように変更する必要があります。
${LIBTOOL} --mode=link ${CC} -osomeprog
../somelib/somelib.la
これで、ライブラリーを正しく扱う事ができます。
ライブラリーをインストールするときに、install(1)
あるいはcp(1)コマンドの前に
“${LIBTOOL} --mode=install”を書いて下さい。そしてライブラリーの名前を
.la
に変えてください。例えば、以下のように書く必要があります。
${LIBTOOL} --mode=install ${BSD_INSTALL_LIB} ${SOMELIB:.a=.la} ${PREFIX}/lib
これは、静的リンクのための.a
、共有ライブラリー、必要なシンボリックリンク
をインストールし、ldconfig(8)を実行します。
PLIST
には、
.la
ファイルだけを含めます
(これは、以前のものから変わった点です)。
USE_LIBTOOL=yes
をパッケージの
Makefile に追加します。こうするとほとんどの場合、パッケージ固有の
libtool を無視します。古い libtool を使っているパッケージでは、
libtool はdo-configureターゲットでltconfigスクリプトにより作られます。make
configure; find work*/ -name libtool
のようにして、libtool スクリプトの場所を確認することができます。
LIBTOOL_OVERRIDE
で、どの libtool
スクリプトを無視するかを、WRKSRC
からの相対位置で指定します。
指定しなかった場合、“libtool */libtool
*/*/libtool” に設定されますので、パッケージ固有の libtool
スクリプトの場所がこのいずれとも異なる場合は、適宜設定してください。
静的ライブラリー *.a
の構築やインストールが必要ない場合は、かわりに
SHLIBTOOL_OVERRIDE
を使います。
パッケージが動的共有オブジェクトのロードに、libtool (libltdl)のプラットフォー ム独立なライブラリーを使う場合は、 devel/libltdl/buildlink3.mkをインクルードしてください。
パッケージによっては、環境により動作や構築ができなくなるような、正しくない libtoolの使い方をしているものがあります。ありがちな間違いは以下のようなもの です。
実行形式やライブラリーで、共有オブジェクト(-module)を依存ライブラリーと してインクルードする。このこと自体は、以下の二つのうちいずれかが行なわれ ている場合は、問題になりません。
その共有オブジェクトが正しく命名されている。すなわち、
libfoo.la
ではなく
libfoo.la
となっている。
-dlopenオプションが実行形式のリンク時に使われている。
ルーチンの初期化を適切に呼ばずにlibltdlを使う。関数lt_dlinit()を呼んで、
マクロ
LTDL_SET_PRELOADED_SYMBOLS
を実行形式にインクルードするようにしましょ
う。
パッケージが、configureスクリプトやmakefileの雛型Makefile.inを再生成するた めにGNU autoconfまたはautomakeを実行する必要がある場合、これらの実行は pre-configureターゲットでおこないます。
autoconfのみを必要とするパッケージでは以下のようになります:
AUTOCONF_REQD= 2.50 # if default version is not good enough USE_TOOLS+= autoconf # use "autoconf213" for autoconf-2.13 ... pre-configure: cd ${WRKSRC} && autoconf ...
また、automakeとautoconfを必要とするパッケージでは以下のようになります:
AUTOMAKE_REQD= 1.7.1 # if default version is not good enough USE_TOOLS+= automake # use "automake14" for automake-1.4 ... pre-configure: set -e; cd ${WRKSRC}; \ aclocal; autoheader; automake -a --foreign -i; autoconf ...
GNU Automake を使うパッケージは、ほぼ確実に GNU Make を必要とします。
生成されたファイルに対して、configureプロセスがさらに変更を加える時がありま
すが、この時には構築プロセスが一連のautomakeの手順を再実行しようとします。
configureの段階でさまざまなファイルに手を加えると、この挙動は止められます。
この挙動が問題が起こす場合は、そのパッケージのMakefileで
AUTOMAKE_OVERRIDE=NO
を設定することができます。
C, C++ および Fortran 言語用のコンパイラーは、 NetBSD の基本システムに附属しています。標準では、 pkgsrc はパッケージが C で書かれていると仮定し、それ以外のコンパイラーをすべて隠します (ラッパーの枠組による。Chapter 14, buildlink 方法論参照)。
パッケージがどの言語のコンパイラーを必要としているかを表すには、
USE_LANGUAGES
変数を設定します。使うことのできる値は、
現在のところ、“c”, “c++”,
“fortran” (および、これらの任意の組合せ) です。標準では
“c” になります。GNU の configure スクリプトを使うパッケージでは、
C++ で書かれているものであっても、通常は configure 相で
C コンパイラーを必要とします。
プログラムが Java で書かれている場合は、pkgsrc における Java
の枠組を使います。パッケージは
../../mk/java-vm.mk
をインクルードする必要があります。
この Makefile の断片は、以下の変数を用意してくれます。
USE_JAVA
は、
JDK への依存性が追加されるかどうかを定義します。
USE_JAVA
が “run” に設定された場合は、
JDK への実行時依存性があるだけです。標準では “yes” となり、
この場合は JDK への構築時依存性も追加されます。
パッケージが Java2 の実装を必要とすることを表すため、
USE_JAVA2
を設定します。この変数が対応している値は、
“yes”, “1.4”,
“1.5” です。 “yes” は任意の Java2
の実装を受け入れます。“1.4” はバージョン 1.4 以上を要求し、
“1.5” はバージョン 1.5 以上のみを受け入れます。
この変数は標準では設定されません。
PKG_JAVA_HOME
は、
依存している Java 実装のランタイムの場所を自動的に設定するものです。
JAVA_HOME
変数の定義が必要なプログラムでは、
この変数に適切な値を設定するために使うことができます。
perl スクリプトがパッケージに含まれる場合は、
USE_TOOLS
変数に “perl” を追加し、
適切なインタープリターへのパスが設定されるようにするために
REPLACE_PERL
を設定します。
REPLACE_PERL
の値には、パスを調節する対象のスクリプトを
WRKSRC
からの相対位置として並べたリストを含めるようにします。
対象のスクリプト内に現れる */bin/perl
はすべて、
perl の実行ファイルへのフルパスに置き換えられます。
特定のバージョンの perl が必要な場合は、
PERL5_REQD
変数をバージョン番号に設定します。
標準では “5.0” になります。
perl モジュールの扱いについては、 Section 19.6.6, “perl モジュールをインストールするパッケージ”をご覧ください。
パッケージ構築時に最もよくある障害は、 プラットフォームによっては必要なヘッダーファイル、関数やライブラリーがなかったり、 あるいは、ライブラリーで提供される関数がパッケージ作者の考えているものと違っていたりするものです。 そのようなことを回避するために、ほとんどの場合は、 ない関数を使わないようにしたり、代替の関数を提供したりするように ソースコードを書き換えることができます。
パッケージに最初から GNU configure スクリプトが附属している場合は、
構築の障害の修正方法としては、コードを変更せずに configure
スクリプトを変更するのが望ましい方法です。configure スクリプトが附属しない場合は、
コンパイル対象のオペレーティングシステムやハードウェアアーキテクチャーに応じて必要なマクロを定義している
C プリプロセッサーを役立てることができます。このマクロは、たとえば
#if defined(__i386)
のようにして調べることができます。
ほとんどすべてのオペレーティングシステム、ハードウェアアーキテクチャー、
およびコンパイラーには、独自のマクロがあります。
たとえば、__GNUC__
,
__i386__
, __NetBSD__
の各マクロがすべて定義されている場合は、i386 互換 CPU 上の NetBSD を使っていることと、
コンパイラーが GCC であることがわかります。
以下に列挙するハードウェアおよびオペレーティングシステム用のマクロは、
使っているコンパイラーに依存します。
たとえば、Solaris 上でコードを条件付きコンパイルしたい場合、
__sun__
は
SunPro コンパイラーでは定義されていないので使ってはいけません。
かわりに __sun
を使います。
4.4 BSD から派生したシステムとそれ以外のシステムを 見分けるには、以下のコードを使うようにしてください。
#include <sys/param.h> #if (defined(BSD) && BSD >= 199306) /* BSD-specific code goes here */ #else /* non-BSD-specific code goes here */ #endif
これでは十分正確でない場合は、 以下のマクロを検査することもできます。
FreeBSD __FreeBSD__ DragonFly __DragonFly__ Interix __INTERIX IRIX __sgi (TODO: 出典の確認) Linux linux, __linux, __linux__ NetBSD __NetBSD__ OpenBSD __OpenBSD__ Solaris sun, __sun
i386 i386, __i386, __i386__ MIPS __mips SPARC sparc, __sparc
ソースファイルのなかには、コンパイラーのバージョンとアーキテクチャーの組合 せによって、また、ほとんどの場合は、最適化を有効にしたことも関係して、コン パイラーのバグを発現させるものがあります。よくある症状は、gccの内部エラーや、 ファイルのコンパイルが完了しないというものです。
たいていは、回避策として、MACHINE_ARCH
とコンパイラーのバージョンを確認し、
問題のあるファイル・MACHINE_ARCH
・コンパイラーの組合せに対して最適化を無効に
し、そのことをpkgsrc/doc/HACKS
に文書化しておくことが必要となります。
このファイルに多くの例が載っているので、参照してください。
このエラーメッセージは、しばしば、 パッケージが必要な共有ライブラリーにリンクしていないことを表します。 以下の関数は、このエラーメッセージを何度も出すことがわかっているものです。
関数 | ライブラリー | 影響のあるプラットフォーム |
---|---|---|
accept, bind, connect | -lsocket | Solaris |
crypt | -lcrypt | DragonFly, NetBSD |
dlopen, dlsym | -ldl | Linux |
gethost* | -lnsl | Solaris |
inet_aton | -lresolv | Solaris |
nanosleep, sem_*, timer_* | -lrt | Solaris |
openpty | -lutil | Linux |
このようなリンカーのエラーの修正は、多くの場合、
パッケージの Makefile
に
LIBS.
を追加してから bmake clean;
bmake を実行すれば十分です。OperatingSystem
+=
-lfoo
SunPro コンパイラーを使っている場合は、別の問題の可能性があります。 このコンパイラーは、以下のようなコードを処理することができません。
extern int extern_func(int); static inline int inline_func(int x) { return extern_func(x); } int main(void) { return 0; }
ここからは、inline_func
関数がたとえ使われていなくても、
この関数用のコードが生成され、そのコードから
extern_func
が参照されますが、この参照は通常は解決することができません。
この問題を解決するため、
パッケージに関数のインライン化を無効化するよう指示してみることができます。
一部のプラットフォームに附属する BSD 互換の install は、
一度に複数のディレクトリーを作成することができません。
このため、 ${INSTALL_*_DIR}
を使うときは、以下のようにします。
${INSTALL_DATA_DIR} ${PREFIX}/dir1 ${INSTALL_DATA_DIR} ${PREFIX}/dir2
こうするかわりに、単に “dir1
dir2
” を
INSTALLATION_DIRS
変数に追加するという方法もあります。
こうすると、適切な処理が自動的におこなわれます。
一般的には、ドキュメンテーションは
${PREFIX}/share/doc/${PKGBASE}
または
${PREFIX}/share/doc/${PKGNAME}
(後者は、
パッケージのバージョン番号を含んでいます) 以下にインストールします。
GNU autoconf を使っている最近のパッケージの多くは、
HTML のドキュメンテーションのインストール先を、
“--with-html-dir” オプションを使って設定することができます。
時には、このフラグを使わないとドキュメンテーションが
${PREFIX}/share/doc/html
や他の場所にインストールされるために、
このフラグを使う必要があることがあります。
例外は、textproc/gtk-doc
ツールによって生成される、
ライブラリーの API のドキュメンテーションです。このドキュメンテーションは、
専用のブラウザー (devhelp) から使うものであり、ブラウザーが標準で使う場所である
${PREFIX}/share/gtk-doc
に置くようにします。
このようなドキュメンテーションは、ファイル名の末尾が
.devhelp
または
.devhelp2
であることから区別できます。
(これらのファイルを
${PREFIX}/share/doc/${PKGBASE}
または
${PREFIX}/share/doc/${PKGNAME}
にインストールしても使うことができます。この場合、
これらのディレクトリーの直下に
.devhelp*
ファイルを置く必要があり、
サブディレクトリー階層を追加することはできません。通常は、
“--with-html-dir=${PREFIX}/share/doc”
を使えばそのようにすることができます。
${PREFIX}/share/gtk-doc
のほうが好ましいのですが。)
パッケージによっては (ほとんどは games カテゴリーのもの)、
システム上の各ユーザーが最高得点を記録できるように、
得点ファイルをインストールします。これを実現するために、
バイナリーは setgid してインストールし、得点ファイルは
グループとオーナーのいずれかまたは両方を当該グループやオーナー
(伝統的には "games" ユーザーおよびグループ) の所有とする必要があります。
SETGIDGAME
,
GAMEDATAMODE
, GAMEGRP
,
GAMEMODE
, GAMEOWN
の各変数でこの挙動を制御します。詳細は
mk/defaults/mk.conf
に書かれています。
なお、games に setgid されたインストールは、標準では有効になっていません。
SETGIDGAME=YES
を設定すると、
これに応じて他の各変数が設定されます。
このため、パッケージではファイルの所有やアクセス許可属性を決してハードコードせずに、
INSTALL_GAME
および
INSTALL_GAME_DATA
の設定に応じて適切に設定されるようにします。
パッケージが DESTDIR
に対応しているというのは、
ファイルを最終的な置き場所にインストールせずに、
足場となるディレクトリーにインストールするということです。
その後、通常の方法でインストール可能なバイナリーパッケージが作成されます。
この対応には、二つの方法があります。
パッケージを root としてインストールする必要がある場合
(“destdir”)と、root 以外のユーザーでインストール可能な場合
(“user-destdir”) です。
PKG_DESTDIR_SUPPORT
を、
“destdir” または “user-destdir” のいずれかに設定する必要があります。
Makefile で bsd.prefs.mk をインクルードする場合、
PKG_DESTDIR_SUPPORT
は、
インクルードの前に設定する必要があります。
すべてのインストール操作では、インストール先を
${DESTDIR}
から始まる場所にする必要があります。
automake は、たいていは、この DESTDIR に対して、 自動的に対処します。自動化されていない処理や pre/post-install では、不適切に処理されることが多いので、修正してください。
ファイルが、特別な所有者や所有グループでインストールされる場合は、
SPECIAL_PERMS
を使ってください。
一般的に、各パッケージは、
DESTDIR を使えるようにするために、
UNPRIVILEGED
に対応させるようにしてください。
パッケージには perl 以外のインタープリターへのパスがハードコードされていることもあります。
スクリプトのインタープリターへのフルパスを適切なものにするため、
当該パッケージの Makefile
で、
以下のような定義をする必要があります
(ここでは例として tclsh を使います)。
REPLACE_INTERPRETER+= tcl REPLACE.tcl.old= .*/bin/tclsh REPLACE.tcl.new= ${PREFIX}/bin/tclsh REPLACE_FILES.tcl= # パスを修正する必要がある tcl スクリプトを列挙します # REPLACE_PERL と同様に、${WRKSRC} からの相対位置とします
2006 年 3 月より前は、この各変数は
_REPLACE.*
および
_REPLACE_FILES.*
という名前でした。
perl5モジュールを提供するパッケージでは、MakefileにMakefileの断片
../../lang/perl5/module.mk
をインクルードしてください。このファイルには、perl5モ
ジュール用の標準的なperlの構成をするdo-configureターゲットのほか、その構成
を調整するためのさまざまなフックが含まれています。詳細は、このファイル中の
コメントをご覧ください。
perl5 のモジュールがインストールされる場所は、構築プロセスで使われるperl の
バージョンに応じて変わります。これを扱うために、pkgsrc は、
インストールされた.packlist
ファイル(ほとんどの perl5 モジュールが生成します)
に列挙された各ファイルに対応する行を、PLIST
に追加します。これは、packlist
ファイルへのパスをスペースで区切ったリストをPERL5_PACKLIST
として定義するこ
とで行なわれるようになります。たとえば以下のように定義します。
PERL5_PACKLIST= ${PERL5_SITEARCH}/auto/Pg/.packlist
PERL5_SITELIB
, PERL5_SITEARCH
,
PERL5_ARCHLIB
の各変数は、perl5モジュールがイ
ンストールされうる三つの場所を表すもので、packlistを持たないperl5パッケージ
で使うことができます。この3変数の置換は、PLIST
でもおこなわれます。
パッケージによっては、infoファイルをインストールしたり、“makeinfo”または
“install-info”コマンドを使ったりします。
このようなパッケージでは、パッケージの Makefile で
INFO_FILES
を定義するようにします。
これを定義しておくと、info ファイルを
Info ディレクトリーファイルに登録するために、INSTALL
および
DEINSTALL
スクリプトが作られるようになります。
info ファイルの登録用の “install-info” コマンドは、
システム附属のものが使われるか、
または、必要があればそれ用のパッケージが自動的に追加されて使われます。
PKGINFODIR
は
${PREFIX}
以下のディレクトリーで、
info ファイルが置かれる主な場所です。
PKGINFODIR
は標準では
“info” となっており、利用者が上書きすることができます。
info ファイルは、そのパッケージの PLIST
に列挙します。ただし、分割された
info ファイルは列挙する必要はありません。
構築時に “makeinfo” コマンドが必要なパッケージは、
Makefile で USE_TOOLS
変数に “makeinfo” を追加する必要があります。
あるバージョン以上の“makeinfo”コマンドが必要な場合は、
パッケージの Makefile
で
TEXINFO_REQD
変数を必要な最低バージョンに設定します。
デフォルトでは、 3.12 が最低限必要なバージョンとなります。
makeinfo コマンドがシステムにないか、
最低限必要なバージョンを満たさない場合は、
devel/gtexinfo
パッケージへの構築時の依存関係が自動的に追加されます。
パッケージで提供されるソフトウェアの構築やインストールの過程では、
install-info コマンドを使ってはいけません。
info ファイルの登録は INSTALL
スクリプトの仕事であって、
適切な makeinfo コマンドを使う必要があるからです。
pkgsrc の基盤は、以上のことを実現するため、
PATH
のはじめのほうにあるディレクトリーに、
install-info や makeinfo
を上書きするスクリプトを作成します。
install-info を上書きするスクリプトは、メッセージを記録すること以外、
何の効果もありません。makeinfo を上書きするスクリプトは、
メッセージを記録し、TEXINFO_REQD
の値に従って、適切な makeinfo コマンドを実行するか、
または異常終了します。
マニュアルページをインストールするパッケージはすべて、
マニュアルページを同じディレクトリー内にインストールして、
マニュアルページを共通のひとつの場所から探せるようにします。
pkgsrc では、この場所は
${PREFIX}/${PKGMANDIR}
であり、パッケージ内ではこの表記を使うようにします。
PKGMANDIR
の値は標準では
“man
” です。これ以外によく使われる値は、
“share/man
” です。
PKGMANDIR
の独自設定には、
完全には対応していません。
PLIST
ファイル内では、
マニュアルページのファイルの最上層ディレクトリーを、
単に man/
と書くことができます。
これは pkgsrc の枠組みが必要に応じて変換してくれます。
これ以外の場所の場合は、正確な
PKGMANDIR
を使って書く必要があります。
GNU_CONFIGURE
が
“yes” に設定されているパッケージでは、
標準では
./configure
--mandir スイッチを使って、マニュアルページをどこにインストールするかを設定します。
このパスは GNU_CONFIGURE_MANDIR
で、
標準では ${PREFIX}/${PKGMANDIR}
になります。
パッケージが GNU_CONFIGURE
を使うが、
--mandir は使わない場合は、CONFIGURE_HAS_MANDIR
を
“no” に設定することができます、
また、./configure
スクリプトが標準的ではない --mandir の使い方をする場合は、
必要に応じて GNU_CONFIGURE_MANDIR
を設定することができます。
圧縮したマニュアルページのインストールに関する情報は、 Section 13.5, “マニュアルページの圧縮” をご覧ください。
パッケージが、 GConf が使用する .schemas
または
.entries
ファイルをインストールする場合は、
これらが確実にデータベースに登録されるようにするために、
いくつか特別な手順を踏む必要があります。
GConf の buildlink3.mk
ファイルではなく
../../devel/GConf/schemas.mk
をインクルードします。
こうすると、インストールおよびアンインストール時に、 GConf
のデータベースを再構築し、また、GConf のデータファイルのインストール場所を
標準的な configure 引数を使ってパッケージに伝えてくれます。
また、パッケージがデータベースに直接アクセスすることが一切できなくなります。
パッケージが
.schemas
ファイルを必ず
${PREFIX}/share/gconf/schemas
以下にインストールするようにします。
${PREFIX}/etc
以下にインストールするようになっている場合は、
手作業でパッケージを修正する必要があります。
PLIST を確認し、etc/gconf ディレクトリー以下の項目をすべて削除します。 これらは自動的に処理されるものだからです。詳細は Section 9.13, “設定ファイルの置き場所を変更する方法は?”を参照してください。
Makefile
で、
GCONF_SCHEMAS
変数を定義します。変数値には
パッケージがインストールする .schemas
ファイルをすべて列挙します。このファイル名にディレクトリーを含めてはいけません。
Makefile
で、
GCONF_ENTRIES
変数を定義します。変数値には
パッケージがインストールする .entries
ファイルをすべて列挙します。
このファイル名にディレクトリーを含めてはいけません。
パッケージが、 scrollkeeper/rarian が使用する .omf
ファイルをインストールする場合は、これらが確実にデータベースに登録されるようにするために、
いくつか特別な手順を踏む必要があります。
rarian の buildlink3.mk
ファイルではなく
../../mk/omf-scrollkeeper.mk
をインクルードします。
こうすると、インストールおよびアンインストール時に、 scrollkeeper
のデータベースを再構築してくれます。
また、パッケージがデータベースに直接アクセスすることが一切できなくなります。
PLIST を確認し、libdata/scrollkeeper
ディレクトリー以下の項目をすべて削除します。
これらは自動的に処理されるものだからです。
PLIST から share/omf
ディレクトリーを削除します。
これは rarian が処理します。(make
print-PLIST で自動でおこなえます。)
パッケージがフォントファイルをインストールする場合は、 インストール時とアンインストール時に、 フォントのインストール先ディレクトリーにあるフォントデータベースを再構築する必要があります。 この処理は pkginstall の枠組を使って自動的におこなうことができます。
フォントのインストール先ディレクトリーを
FONTS_DIRS.
変数に列挙することができます。変数名中の type
type
は、
“ttf”, “type1”, “x11” のいずれかです。
また、データベースファイル fonts.dir
は PLIST に含めてはいけません。
なお、フォント用のディレクトリーを新たに作らないようにしてください。 X サーバーがフォントを見つけるための設定をユーザーが手動でおこなう必要がないようにするため、 新しいディレクトリーではなく標準的なディレクトリーを使うようにします。
パッケージが GTK2 の IM モジュールやローダーをインストールする場合は、 これらが確実に GTK2 のデータベースに登録されるようにするために、 いくつか特別な手順を踏む必要があります。
gtk2 の buildlink3.mk
ファイルではなく
../../x11/gtk2/modules.mk
をインクルードします。
こうすると、インストールおよびアンインストール時に、GTK2
のデータベースを再構築してくれます。
GTK2 の IM モジュールをインストールするパッケージでは、
GTK2_IMMODULES=YES
を設定します。
GTK2 のローダーをインストールするパッケージでは、
GTK2_LOADERS=YES
を設定します。
パッケージが GTK2 のデータベースディレクトリーを直接いじらないよう修正します。 データベースは以下のとおりです。
libdata/gtk-2.0/gdk-pixbuf.loaders
libdata/gtk-2.0/gtk.immodules
PLIST
を確認し、libdata/gtk-2.0
ディレクトリー以下の項目をすべて削除します。
これらは自動的に処理されるものだからです。
パッケージが、システム全体で使われるカタログへ登録する必要のある SGML または XML のデータファイル (DTD, sub-catalog など) をインストールする場合は、 いくつか特別な手順を踏む必要があります。
パッケージの Makefile
で
../../textproc/xmlcatmgr/catalogs.mk
をインクルードします。
こうすると、インストールおよびアンインストール時に、
データファイルをシステム全体で使われるカタログに登録してくれます。
SGML_CATALOGS
を、このパッケージがインストールする
SGML カタログをすべてをフルパス表記にしたものに設定します。
XML_CATALOGS
を、このパッケージがインストールする
XML カタログをすべてをフルパス表記にしたものに設定します。
SGML_ENTRIES
を、SGML カタログに追加する
個々のエントリーに設定します。各エントリーは
3 個の文字列からなります。書き方の詳細は xmlcatmgr(1)
(特に、'add' アクション用の引数) を参照してください。
なお、通常はこの変数を使うことはありません。
XML_ENTRIES
を、XML カタログに追加する
個々のエントリーに設定します。各エントリーは
3 個の文字列からなります。書き方の詳細は xmlcatmgr(1)
(特に、'add' アクション用の引数) を参照してください。
なお、通常はこの変数を使うことはありません。
パッケージが、.xml
ファイルを
${PREFIX}/share/mime/packages
以下にインストールすることで MIME データベースを拡張する場合は、
データベースがこの新規ファイルについて確実に整合性を持つようにするために、
いくつか特別な手順を踏む必要があります。
../../databases/shared-mime-info/mimedb.mk
をインクルードします (同じディレクトリーにある buildlink3.mk
ファイルは、他の buildlink3.mk
ファイルでインクルードするために予約されているので使いません)
こうすると、インストールおよびアンインストール時に、MIME
データベースを再構築してくれます。
また、パッケージがデータベースに直接アクセスすることが一切できなくなります。
PLIST を確認し、share/mime
ディレクトリー以下の項目のうち、
share/mime/packages
以下に置かれるファイル
以外のものをすべて削除します。
このディレクトリーについては update-mime-database プログラムが自動的に処理しますが、
除外したファイルはパッケージ依存のファイルなので、
ファイルをインストールしたパッケージが自分で削除する必要があります。
PLIST から share/mime/*
ディレクトリーをすべて削除します。
これらは shared-mime-info プログラムが処理します。
パッケージが構築時に intltool を使う場合は、
intltool
を USE_TOOLS
に追加します。
こうすると、パッケージの配布ファイルに附属する intltool ではなく、
pkgsrc の intltool を強制的に使うようになります。
この仕組みは、intltool 構築時の依存関係を追跡して、 利用可能な最新版を使います。この方法を使うことで、 リリース後にできたバグ修正も適用することができます。
パッケージに rc.d スクリプトが附属する場合、このスクリプトは、
標準では起動ディレクトリーにコピーされませんが、
mk.conf
にオプション
PKG_RCD_SCRIPTS=YES
を追加指定すると、
パッケージのインストール時に、スクリプトが
/etc/rc.d
以下にコピーされます。
また、パッケージのアンインストール時には、
自動的にスクリプトが削除されます。
パッケージが、TeX パッケージを texmf ツリーにインストールする場合は、
texmf ツリーの ls-R
データベースを更新する必要があります。
kpathsea のような主たる TeX パッケージ以外のパッケージは、
${PREFIX}/share/texmf
ではなく ${PREFIX}/share/texmf-dist
内にファイルをインストールするようにします。
../../print/kpathsea/texmf.mk
をインクルードします。こうすると、インストール時とアンインストール時に
ls-R
を再構築してくれます。
パッケージが
${PREFIX}/share/texmf-dist
の texmf ツリー以外の
texmf ツリーにファイルをインストールする場合は、
TEX_TEXMF_DIRS
を、データベースの更新が必要となる
texmf ツリーをすべて並べたリストに設定します。
パッケージが、updmap
を使って登録する必要があるフォントマップファイルもインストールする場合は、
../../print/texlive-tetex/map.mk
をインクルードしたうえで、
TEX_MAP_FILES
と
TEX_MIXEDMAP_FILES
のいずれかまたは両方を、
そのようなフォントマップファイルをすべて並べたリストに設定します。
こうすると、インストール時とアンインストール時に
updmap が自動的に実行され、
TeX 出力ドライバー用のフォントマップファイルの有効化や無効化をしてくれます。
PLIST
には
ls-R
データベースは一切含めないようにします。
このデータベースは teTeX-bin パッケージによってのみ削除されるものだからです。
パッケージのなかには、あるオペレーティングシステム用のバイナリーを (エミュレーションに対応した) 別のオペレーティングシステム上で実行するための、 ライブラリーや実行ファイルを提供するものがあります。 例としては、NetBSD 上で Linux のバイナリーを実行するものがあげられます。
pkgtools/rpm2pkg
は、Linux の rpm パッケージの展開やパッケージ化を補助するものです。
CHECK_SHLIBS
を no に設定して、
インストールされた実行ファイル用のライブラリーを動的リンカーがすべて見つけられることを検査する
check-shlibs ターゲットを抑止することができます。
この検査では標準の動的リンカーを実行するので、
エミュレーションパッケージに対しては検査が失敗します。
エミュレーションで使われるライブラリーは、
標準のディレクトリーには置かれていないからです。
パッケージが、
share/icons/hicolor
以下に画像をインストールするか
share/icons/hicolor/icon-theme.cache
データベースを更新するかあるいはその両方をおこなう場合は、
テーマ用の共有ディレクトリーを適切に扱い、キャッシュデータベースを確実に再構築するために、
以下の手順を踏む必要があります。
../../graphics/hicolor-icon-theme/buildlink3.mk
をインクルードします。
PLIST
を確認し、
テーマのキャッシュを参照するエントリーを削除します。
PLIST が share/icons/hicolor
階層からアイコン用の共有ディレクトリーを削除しないようにします。
これは自動的に処理されるものだからです。
後の 2 点について、 PLIST がこれらを守っていることを確認する最良の方法は、 make print-PLIST を使って作り直すことです。
パッケージが、.desktop
ファイルを
share/applications
以下にインストールし、そのファイルに
MIME 情報が含まれている場合は、それらが MIME データベースに確実に登録されるようにするために、
以下の手順を踏む必要があります。
../../sysutils/desktop-file-utils/desktopdb.mk
をインクルードします。
PLIST を確認し、
share/applications/mimeinfo.cache
ファイルを参照するエントリーを削除します。
これは自動的に処理されるものだからです。
最後の点について、 PLIST がこれらを守っていることを確認する最良の方法は、make print-PLIST を使って作り直すことです。
パッケージを作成する時に落ちいりやすい間違いをチェックし、パッケージを動作 させるための手順があります。これは基本的には前のセクションで説明したことと 同じですが、デバッグを助けるための方法を追加しています。
PKG_DEVELOPER=yes
を mk.conf
で設定しておいてください
pkgtools/url2pkg
をインストールし、
デバッグ対象のパッケージ用にディレクトリーを作ってそこに移動してから、
url2pkg を実行します。
%
mkdir /usr/pkgsrc/
category
/examplepkg
%
cd /usr/pkgsrc/
category
/examplepkg
%
url2pkg http://www.example.com/path/to/distfile.tar.gz
Makefile
に、必要な編集を加えます。
DESCR
の内容を書きます
make configure を実行します。
ドキュメンテーション、
およびconfigureの段階でわかった依存関係をすべて、
パッケージのMakefile
に書き加えます。
以下を繰り返しおこなって、パッケージを作り上げます
%
make
%
pkgvi ${WRKSRC}/some/file/that/does/not/compile
%
mkpatches
%
patchdiff
%
mv ${WRKDIR}/.newpatches/* patches
%
make mps
%
make clean
root以外のユーザーで作業をおこなうと、改変すべきでないファイルは改変され
ません。特に、構築の段階以外では。
mkpatches,
patchdiff および pkgvi
は、pkgtools/pkgdiff
パッケージに入っています。
必要ならMakefile
を修正してください。
Section 11.1, “Makefile
”を参考にしてください。
PLIST
を作成します:
#
make install
#
make print-PLIST >PLIST
#
make deinstall
#
make install
#
make deinstall
これは通常、root
で実行する必要があります。
残ったままのファイルがないか調べます:
#
make print-PLIST
もし、なにかファイルが見つかれば、それらはPLIST
に不足しているので、追加
してください。
これでPLIST
の修正ができました。
パッケージを再度インストールして、バイナリーパッケージを作ります:
#
make reinstall
#
make package
インストールしたパッケージを削除します:
#
pkg_delete
examplepkg
上記の make print-PLIST コマンドを繰り返します。 今度は何も見つからないはずです:
#
make print-PLIST
バイナリーパッケージを再インストールします:
#
pkg_add .../
examplepkg
.tgz
遊んでみてください。すべてが機能することを確認してください。
pkgtools/pkglint
に含まれるpkglintを実行し、
報告される問題を修正してください。
#
pkglint
提出してください(もし cvs アクセス可能であればコミットしてください)。Chapter 21, 提出およびコミットが参考になります。
Table of Contents
我々は、トロイの木馬等を含まないことを保証するために、pkgsrc 開発者からし かバイナリーを受け取りません。これは、誰かを排斥するものではなく、 むしろユーザーを保護するための方針です。しかしながら、あなたの作ったバイ ナリーパッケージをどこかに置き、配布することは自由に行なってもかまいま せん。NetBSD 開発者がバルクビルドを実行してパッケージをアップロードしたい場合は、 Section 7.3.8, “バルクビルドの成果をアップロードする”を参照してください。
最初にパッケージが完全かどうか、コンパイル、実行できるかどうかを確認して
ください。
このドキュメントのChapter 20, デバッグ、その他が参考になるでしょう。次に、
パッケージを構成するファイルすべてからなる tar(1)
アーカイブを作り、gzip して uuencode してください。
最後に、このパッケージを pkgsrc のバグ追跡システムに送信してください。
send-pr(1) コマンドを使って送信するか、このコマンドがない場合は web ページ
http://www.NetBSD.org/support/send-pr.html
をご覧ください。この web ページには、説明と、
パッケージを提出できるフォームへのリンクがあります。
これらのかわりに、
sysutils/gtk-send-pr
パッケージを使って提出することもできます。
問題報告においては、カテゴリー (category) は “pkg” とし、問題の概要 (synopsis) にパッケージ名とバージョン番号を含めます。 また、説明 (description) のフィールドに、パッケージの簡単な説明 (COMMENT 変数または DESCR ファイルの内容でもOKです) を書きます。uuencode したパッケージのデータは “fix” フィールドに含めます。
複数のパッケージを提出したい場合は、一つのパッケージにつき一つのPRにわけ て送ってください。そうすることで、私たちが追跡しやすくなります。
以上のようにするほか、新しいパッケージは pkgsrc-wip (“pkgsrc work-in-progress”) に入れることもできます。 詳細は、ホームページ http://pkgsrc-wip.sourceforge.net/ をご覧ください。
パッケージの追加、更新、移動、および削除は、すべて
pkgsrc/doc/CHANGES-
に書いてください。
このファイルを、これまでと同じ形式のまま最新の状態に保つことは非常に重要なことです。
なぜなら、このファイルはスクリプトにより www.NetBSD.org
や他のサイトのページを自動的に更新するために使用されているからです。
また、YYYY
pkgsrc/doc/TODO
ファイルを確認し、
今回更新あるいは削除したパッケージのことが書かれている場合は、
その部分を削除してください。
パッケージの PKGREVISION
を引き上げた時に、
その変更がセキュリティーに関するものやその他関連のあるものである場合は、
pkgsrc/doc/CHANGES-
に載せるようにします。
依存性の更新にともなう大量の引き上げについては、ここには書かないでください。
これら以外の場合は、書くべきかどうかは開発者が自分で決めることです。YYYY
正しい CHANGES-
の項目を作るのを手伝ってくれる make ターゲット、 make
changes-entry があります。このターゲットは YYYY
CTYPE
および NETBSD_LOGIN_NAME
というオプションの変数を使います。
一般的な使い方は、まず CHANGES-
ファイルを (あとで衝突して修正する必要が起こらないように)
最新の状態にした上で、パッケージのディレクトリーに cd
します。パッケージを更新した場合は make changes-entry
だけで十分です。新規パッケージの追加や、パッケージの移動または削除の場合は、
コマンドラインで YYYY
CTYPE
変数を "Added",
"Moved" または "Removed" に設定します。ローカルのログイン名が
NetBSD のログイン名と異なる場合は、mk.conf
で
NETBSD_LOGIN_NAME
を設定することができます。
また、このターゲットは、TODO
ファイルから、
当該パッケージの項目を自動的に削除してくれます。最後に、
make changes-entry-commit などとして
pkgsrc/doc/CHANGES-
の変更を
commit するのを忘れないでください。
なお、cvs.NetBSD.org から直接チェックアウトせずに、
ローカルにコピーしたリポジトリーを使って作業している場合などは、
USE_NETBSD_REPO=yes を設定するとよいでしょう。こうすると、
cvs コマンドでは本家リポジトリーを使うようになります。
YYYY
このセクションは、pkgsrcリポジトリーへの書き込みアクセス権限を持っ ている pkgsrc 開発者にのみ意味があるものです。cvsはカレントディレクトリーから の相対位置にファイルをインポートすることと、cvs importコマンドに渡したパ ス名からリポジトリー中のファイルの位置が決まることを忘れないでください。新 しく作ったパッケージは、“TNF”のベンダータグと“pkgsrc-base”のリリースタ グでインポートしてください。例えば:
$
cd .../pkgsrc/category/pkgname$
cvs import pkgsrc/category/pkgname TNF pkgsrc-base
また、インポートに使ったディレクトリーは、忘れずに邪魔にならないところに移
しておいてください。そうしておかないと、ソースツリーを次に“cvs
update”した
ときにcvsが文句を言います。さらに、この新しいパッケージを、categoryの
Makefile
に忘れずに追加してください。
初回のインポートでは、コミットメッセージにDESCR
ファイルの内容を含めておき、
どういうパッケージなのかがメーリングリストの読者にわかるようにしてください。
新しいパッケージを追加する場合は、“cvs add”ではなく“cvs import”を使うように してください。"cvs import"なら、単一のコマンドですべて記述することができ、 また、一貫したタグを打つことができるからです。
パッケージを更新するときは、新旧バージョン間の変更点の簡潔で適切で意味のあ る要約を、コミットログに必ず書いてください。そうすべき理由はいろいろありま す:
URLは不安定なものであり、時間がたつと変わることがあります。完全になくなる かもしれませんし、新しい情報に書き換わるかもしれません。
新旧バージョン間の変更点をCVSリポジトリーに保持しておくと、cvsやanoncvsの 利用者にとって、非常に便利です。
新旧バージョン間の変更点をCVSリポジトリーに保持しておくと、pkgsrc-changes メーリングリストの読者が、パッケージをいつ更新するかの戦術を立てられるよう になり、非常に便利です。
また、あるパッケージに新しいバージョンがリリースされたというだけの理由で、 CVSリポジトリー上のパッケージを更新しないほうがいいことを認識してください。 私たちは、pkgsrcに含まれるパッケージに関して保守的であることを好みます。と いうのも、開発版やベータ版のパッケージは、pkgsrcが使われる場面のほとんどに 対して、まったくふさわしくないからです。どのバージョンをpkgsrcに入れるのが よいか、分別をもって判断してください。新機能(テストされていない機能があるか もしれません)よりも安定性のほうが好ましいことを念頭に置いてください。
パッケージ名の変更は、なるべくしないようにしてください。
パッケージ名を変更する際には、かならず、 他の Makefile やオプションや buildlink などで古い名前を参照している箇所をすべて修正します。
パッケージ名を変更する際には、さらに、
SUPERSEDES
を旧パッケージのパッケージ名と
dewey 式のバージョン番号に設定します。
名前が複数回変わっている場合は、複数並べて設定することができます。
これで、新しいパッケージで旧名のパッケージを置き換える作業は完了です。
なお、CHANGES-YYYY
ファイルにおける
“successor” の記述は、必ずしも、supersedes
の意味ではありません。successor は、厳密な同等品でなくても、
代替として使えるものを助言するものでもいいからです。
パッケージの名前の変更や移動は、しないほうがよいのですが、 それでも必要な場合は、以下の手順でおこないます。
パッケージのディレクトリーをどこかにコピーします。
コピーしたものからCVSディレクトリーをすべて削除します。
手順1,2は、以下のようにすることもできますので、今後の作業にはこちらを使ってください:
%
cvs -d user@cvs.NetBSD.org:/cvsroot export -D today pkgsrc/category/package
CATEGORIES
を修正します。また、“../../category/package”のかわりに単に
“../package”とすることができるDEPENDS
のパスをすべて修正します。
修正後のパッケージの Makefile で、
PREV_PKGPATH
を、移動前のカテゴリー/パッケージのパス名に設定します。
この PREV_PKGPATH
は、
パッケージの更新を pkgsrc の構築によっておこなうツールが使います。
たとえば、そういったツールは pkg_summary(5) データベースから
(SUPERSEDES
がない場合)
PREV_PKGPATH
を検索して、これをもとにパッケージの移動後の
PKGPATH
を調べることができます。
なお、この検索で複数のパスが見つかることもありえるので、
ツールの側では PKGBASE
もあわせて検査します。
この PREV_PKGPATH
の値を設定するのは、
SUPERSEDES
が設定されない場合
(つまり、PKGBASE
が変わらない場合) です。
新しい場所で、修正後のパッケージをcvs import します。
このパッケージに依存しているパッケージを調べます:
%
cd /usr/pkgsrc
%
grep /package */*/Makefile* */*/buildlink*
手順5で見つかったものに対して、このパッケージへのパスを、新しい場所を指すように修正します。
古い場所で、移動前のパッケージをcvs rm (-f)します。
oldcategory/Makefile
からこのパッケージを削除します。
newcategory/Makefile
にこのパッケージを追加します。
変更および削除されたファイルを commit します:
%
cvs commit oldcategory/package oldcategory/Makefile newcategory/Makefile
(もちろん、手順5の各パッケージもです)。
この節では、パッケージ作成中に湧くような疑問と回答を掲載します。
あなたがお持ちの疑問に対する答がここにない場合は、
まず、他の節を見てみてください。
それでも答が見つからなければ、
pkgsrc-users
メーリングリストで尋ねてください。
22.1. |
|
|
|
22.2. |
|
|
|
22.3. |
|
|
|
22.4. |
|
[FIXME] |
|
22.5. |
make show-var
VARNAME=BUILDLINK_PREFIX. |
最適化のために、一部の変数は “wrapper” の段階以降でしか使えません。 wrapper の段階を“シミュレート”するには、 お尋ねのコマンドに PKG_PHASE=wrapper を付け加えます。 |
|
22.6. |
|
|
|
22.7. |
パッケージ開発者向けの メーリングリストはどれ? |
|
|
22.8. |
pkgsrc の資料はどこにある? |
pkgsrc に関する資料がある場所は、 たくさんあります。
|
|
22.9. |
少し時間があるんだけど、 何をしたらいい? |
これは、まだよく尋ねられてはいないのですが、 答えてしまいます。
|
Table of Contents
GNOME の web サイトによれば、
GNOME プロジェクトでは二つのものを提供します: 一つは、 利用者にとって直観的で魅力的なデスクトップである GNOME デスクトップ環境です。 もう一つは、アプリケーション構築用の広範な枠組である GNOME 開発プラットフォームで、その他のデスクトップに統合されています。
pkgsrc を使うと、多くのプラットフォームのもとで、 完全な GNOME 環境の自動的な構築やインストールを透過的におこなうことができます。 pkgsrc は、buildlink3 技術、ラッパーとツールの枠組や、 設定ファイルの自動処理があることから、 GNOME の構築およびパッケージングシステムとして最も高度なもののひとつであると、 自信を持っていうことができます。 インストールされたソフトウェアの構成要素を、 完全にきれいにアンインストールできるようにするため、 多くの取り組みがおこなわれています。
pkgsrc は NetBSD の公式パッケージングシステムなので、 上述したことはすなわち、NetBSD のもとで GNOME が機能するようにするために、 多大な取り込みがおこなわれているということです。最近では、DragonFly BSD も pkgsrc をパッケージングシステムとして採用しており、 同 OS のもとで GNOME の構築やインストールができるようにするため、 移植性に関する修正を数多く寄せてくれています。
あなたの空き時間を NetBSD のために使っていただけたら、 pkgsrc および GNOME は、おもしろげな新機能の導入に注力することができます。まずは保留中の作業 の一覧をご覧ください。NetBSD のもとで GNOME デスクトップを完全に機能させるまでには、まだ長い道が残っているため、 あなたの助けが必要なのです。
pkgsrc には、GNOME 関連のメタパッケージが三つあります。
meta-pkgs/gnome-base
: GNOME
デスクトップ環境の中核部分を提供します。
これは GNOME を正常に起動させるために必要なものだけからなっており、
日々の操作をするうえで重要な機能が足りないかもしれません。
このパッケージの考え方は、
末端利用者がこのパッケージの上層で独自の構成をできるようにするためのものであり、
このメタパッケージをまずインストールして最低限の機能を整えてから、
個々のアプリケーションを追加するというものです。
meta-pkgs/gnome
: GNOME
プロジェクトが定義する GNOME プラットフォームおよびデスクトップの、
完全なインストールを提供します。これは、GNOME の公式 FTP サーバーの
platform/x.y/x.y.z/sources
および
desktop/x.y/x.y.z/sources
ディレクトリーで配布されている構成要素にもとづいています。
このディレクトリーにある開発者専用ツールは、他の構成要素の正常動作のために必要な場合以外は、
インストールされません。同様に、バインディングセット附属のパッケージ
(bindings/x.y/x.y.z/sources
)
も、末端利用者向けの構成要素からの依存により必要な場合以外は、
含まれません。このパッケージは、meta-pkgs/gnome-base
を「拡張」するものです。
meta-pkgs/gnome-devel
:
GNOME の構成要素を CVS リポジトリーから取得した場合用に、
その構築のために必要なツールをすべてインストールします。
これらは
autogen.sh スクリプトを正常に動かすために必要なものです。
以上の各パッケージでは、更新を簡単にできるようにするため、
DEPENDS
行が依存性にもとづく順序で並べられています。
あるパッケージが、それより前に並んでいるパッケージに依存することはできますが、
後に並んでいるパッケージに依存することはできません。この順序を守ることは、
更新を簡単にするために非常に重要なことです。これを、
アルファベット順に並びかえてはいけません。
ほとんどすべての GNOME アプリケーションは C で書かれており、 構築システムとして共通のツール一式を使っています。C 以外の言語 (Python など) を新たに追加する場合は事情が異なりますが、 最低限必要なツールについては、以下のことが参考になるでしょう。
ほとんどすべての GNOME アプリケーションは、構築システムとして GNU Autotool を使っています。GNOME に限らない一般的な決めごととして、 このことをパッケージに教えてやる必要があります。
GNU_CONFIGURE=yes USE_LIBTOOL=yes USE_TOOLS+=gmake
パッケージが pkg-config を使って依存性を決めている場合は、 必要なユーティリティーのリストに同ツールを追加します。
USE_TOOLS+=pkg-config
さらに、構築の過程の最後で
pkgtools/verifypc
を使って、
作ったパッケージのなかで指定した依存性に間違いがなく、
要求バージョンもすべて正しいことを確認します。
パッケージが intltool を使う場合は、依存性を処理するため、また、
利用可能な最新バージョンを使うようにするため、かならず
intltool
を USE_TOOLS
に追加します。
パッケージが gtk-doc (ドキュメンテーション生成ユーティリティー) を使う場合は、依存性を追加してはいけません。 このツールは巨大なものですし、 パッケージの distfile には生成済みのドキュメンテーションが附属しているはずだからです (そうなっていない場合はバグですので、報告してください)。 このようなパッケージでは、以下のようにして gtk-doc を無効化するようにします (標準で無効になっている場合を除く)。
CONFIGURE_ARGS+=--disable-gtk-doc
HTML ファイルの標準でのインストール場所
(share/gtk-doc/<package-name>
) は適切なものなので、
パッケージが別の場所へのインストールを要求した場合以外は変更しないようにします。
場所を変更すると、devhelp
などのプログラムがファイルを開けなくなってしまいます。
場所の変更は、以下のようにしておこなうことができます。
CONFIGURE_ARGS+=--with-html-dir=${PREFIX}/share/gtk-doc/...
GNOME は、インストール用プレフィックスの下に複数の
共有ディレクトリーおよびファイルをもっており、
データベースの保守のために使っています。ここでいう共有とは、
同じディレクトリーやファイルを複数の異なるパッケージが使うことであり、
PLIST
の内容の衝突を起こします。
現在、pkgsrc にはもっともありがちな部類の事例を扱うための仕組みがあるので、
ファイルのリストには必ず
@unexec ${RMDIR}
という行を書くようにし、
共有のファイルは書かないようにしてください。
この仕組みを使わずに独自の処理をしてしまうと、
作成したパッケージが、正しくないものになってしまうでしょう。
以下の表は、共有ディレクトリーまたはファイルを使うような、 ありがちな状況を挙げたものです。各状況について、適切な処置を示しています。 ここで示した処置を適用した後は、 make print-PLIST を使って パッケージのファイルのリストを作り直し、 それが正しいことを確認してください。
Table 23.1. GNOME パッケージ用の PLIST の扱い
パッケージの挙動 | 処置 |
---|---|
share/omf 以下に OMF ファイルをインストールする。 |
Section 19.6.10, “scrollkeeper/rarian のデータファイルをインストールするパッケージ”参照。 |
share/icons/hicolor
階層以下にアイコンをインストールする、または
share/icons/hicolor/icon-theme.cache を更新する。 |
Section 19.6.19, “ハイカラーテーマのアイコンをインストールするパッケージ”参照。 |
share/mime/packages
以下にファイルをインストールする。 |
Section 19.6.14, “MIME データベースの拡張をインストールするパッケージ”参照。 |
share/applications 以下に
.desktop ファイルをインストールし、かつそのファイルに MIME
情報が含まれる。 |
Section 19.6.20, “デスクトップファイルをインストールするパッケージ”参照。 |
GNOME を全体として見た場合、 二種類の更新があります。
GNOME 3 (がいつか登場したとして) への道程は、まだ相当長いものなので、
ここでは、バージョンが 2.X
から 2.Y
(Y
は X
より大きい偶数)
に上がることをメジャーアップデートということにします。
メジャーアップデートでは構成要素のコードに多くの変更がおこなわれており、
GNOME のほとんどすべての distfile が新しいバージョンに更新されているため、
更新は面倒な作業になります。変更のなかには、
以前のバージョン系列との API や ABI の互換性を損なうものがあることもあります。
このような事情があるので、破損を最小限にするために、
更新は一度にまとめておこなう必要があります。
通常、メジャーアップデートでは、 約 80 個のパッケージが更新されるほか、新しいパッケージがいくつか追加されます。
ここでは、バージョンが 2.A.X
から 2.A.Y
(Y
は X
より大きい数)
に上がることをマイナーアップデートということにします。
GNOME の構成要素すべてが更新されるわけではないことや、
枝内でのバージョン増大に沿った形でおこなうことができ、
API や ABI の互換性が失われないことなどから、
更新は簡単におこなうことができます。
マイナーアップデートで更新されるパッケージ数は、 大きく変動することがありますが、通常は約 50 個です。
pkgsrc の GNOME 構成要素を新しい安定版リリース (メジャーまたはマイナー) に更新するためには、 以下の手順に沿っておこなうようにします。
以下のコマンドを使って、新しいリリースを構成する tarball
の一覧を作ります。
こうすると、構成要素の distfile の全一覧が
list.txt
ファイルに得られます。
%
echo ls "*.tar.bz2" | \ ftp -V ftp://ftp.gnome.org/pub/gnome/platform/x.y/x.y.z/sources/ | \ awk '{ print $9 }' >list.txt
%
echo ls "*.tar.bz2" | \ ftp -V ftp://ftp.gnome.org/pub/gnome/desktop/x.y/x.y.z/sources/ | \ awk '{ print $9 }' >>list.txt
各メタパッケージの Makefile
を開き、
バージョンを更新後のリリースのものに上げます。
3 個のメタパッケージは常にバージョンに整合性をもたせるようにします。
PKGREVISION
がある場合は、
当然、削除します。
各メタパッケージについて、
DEPENDS
行を更新して、
前掲のコマンドで得られた最新バージョンと合致するようにします。
これより新しいバージョンにしては (たとえそれが FTP サーバーにあったとしても)
いけません。このメタパッケージは、
特定の GNOME リリースを構成するバージョンだけを揃えることを意図したものだからです。
ただし、統合デスクトップを使用する上での深刻な問題が新しいバージョンで解決する場合には、
例外的に認められます。これは、たいていの場合、
GNOME による新しいバージョンは使わずに、
pkgsrc 内でのリビジョンを上げる形をとります。
list.txt
ファイルに現れないパッケージは、
利用可能な最新バージョンに (pkgsrc にそれがあれば) アップデートするようにします。
たとえば、meta-pkgs/gnome-devel
メタパッケージに含まれるパッケージのうち
GNU Autotools に依存するパッケージがこれに該当します。
変更後のメタパッケージからパッチを作り、そこから「新規の」行を抽出します。 この結果から、pkgsrc のどのパッケージをどの順序でアップデートする必要があるか、 概要がわかります。
%
cvs diff -u gnome-devel gnome-base gnome | grep '^+D' >todo.txt
デスクトップのメジャーアップデートの場合は、 インストールされているパッケージをすべて削除し、まっさらな状態から始めることをおすすめします。
ここが、もっとも長い作業が必要なところです。
todo.txt
に書き出された各パッケージを、
並んでいる順序どおりに更新するという作業を繰り返します。
デスクトップのメジャーアップデートの場合は、
全パッケージの更新が完了するまで commit してはいけません。
未更新のパッケージを壊す可能性があるからです。
パッケージが新しいものになり動作する状態になったら、
個々のパッケージを一つずつ、適切な log メッセージをつけて commit してゆきます。
最後に、3 個のメタパッケージの更新と、これらに対応する
doc/CHANGES-<YEAR>
および
pkgsrc/doc/TODO
ファイルの変更を
commit します。
GNOME は 100 のパッケージを擁する、pkgsrc の大きな構成要素です。 GNOME パッケージに移植性に関する修正を施した場合は、常に、常に、 常に、 GNOME 本家の開発者に還元していただくということが重要です (Section 11.3.5, “作者へのフィードバック”参照)。 彼らに移植性についての注意を喚起して、将来のバージョンが無修正で NetBSD で構築できるようにするためには、そうするしかないのです。 pkgsrc 独自のパッチを少なくすればするほど、将来の更新は楽になります。 GNOME のメジャーアップデート対応に取り組む開発者としては、 皆さんにそのようにしていただけるとありがたく思います。
最もありふれたバグの報告先は、GNOME の Bugzilla と freedesktop.org の Bugzilla です。GNOME の構成要素すべてがこれらをバグ追跡用に使っているわけではありませんが、 ほとんどはこれらを使っています。バグ報告に際しては、常に、 現在起きている問題や、移植性を最大限にするためにはどのように改良したらよいかについて、 詳細に説明するようにし、また、可能であれば CVS の head に対するパッチをつけてください。 詳しく書けば書くほど、パッチが採用される可能性が高くなります。
また、プリプロセッサーを使った細工で移植性の問題を修正するようなことはしないでください。
FreeBSD で GNOME に取り組む人たちは、彼らのオペレーティングシステムへの GNOME の移植にあたり大きな仕事をしていますが、
このせいで、公式の GNOME のソースに __FreeBSD__
や、これと同類のマクロの検査が蔓延してしまっています。これは移植性を損なうものです。
詳細は、私たちのパッチ作成の指針
(Section 11.3.4, “パッチ作成の指針”)
をご覧ください。
この部では、 開発者向けの手引きに書かれているインターフェースの背後にある基盤に関するあらゆることを扱います。 パッケージのメンテナーをしているだけの人には、 この部は必要ないはずです。
Table of Contents
Table of Contents
pkgsrc の基盤は、Makefile の小さな断片がたくさん集まってできています。 それぞれの断片に、適切なインターフェースを定義することが必要です。 本章では、そのようなインターフェースの何たるかを説明します。
pkgsrc の基盤において変数が定義されている場合、 変数が定義されている場所や定義の方法自体が、 その変数の使用目的について多くを語っています。 また、変数を定義しているファイルの冒頭のコメントや、 この手引きに、さらなる資料があることもあります。
特別なファイルとして、
mk/defaults/mk.conf
があります。このファイルには、
利用者が定義する変数がすべて書かれています。
これらの変数のなかには ?=
演算子を使って定義されているものもありますが、
そうでないものは、何かを定義すると “yes” を意味することになるため、
定義されていません。これらの変数はすべて、
pkgsrc 利用者が MAKECONF
ファイルで定義して上書きすることができます。
このファイル以外では、以下のようなならわしとなっています。
?=
演算子を使って定義されている変数は、
個々のパッケージで上書きすることができます。
また、=
演算子を使って定義されている変数は、
実行時に読み出し専用で使うことができます。
変数名が下線で始まる変数は、 pkgsrc の基盤以外からは一切読み書きできません。 これらは、特記のない限り、変更してもかまいません。
以上のならわしは、現在のところ、 pkgsrc の基盤全体に一貫して適用されているわけではありません。
リストを含む変数はすべて、標準状態では空になっているものです。
このならわしに従わない変数は、
USE_LANGUAGES
と
DISTFILES
の二つです。この二変数は、
パッケージの Makefile
(その他、ここからインクルードされるファイル) において、
+=
演算子を使って単純に変更することができません。
あらかじめ値が設定されているかどうかや、
何が設定されているかがまったくわからないからです。
DISTFILES
については、
パッケージ側で標準の値が“わかっている”ので、
以下の例のように定義するだけですみます。
DISTFILES= ${DISTNAME}${EXTRACT_SUFX} additional-files.tar.gz
このような標準の値を使っているために、
同じ値が多くのパッケージの Makefile に現れます。
USE_LANGUAGES
についても同様ですが、
こちらは、標準の値 (“c
”)
が非常に短いために目立ちません。
とはいえ、多くのファイルにこの値が書かれています。
変数の評価は、変数が使われる文脈によって、 読み込み時におこなわれる場合と、実行時におこなわれる場合があります。 変数が読み込み時に評価されるのは、以下のような文脈においてです。
:=
および !=
演算子の右辺
.if
や
.for
のような make ディレクティブ
(訳註: make(1) の) 依存性を記述した行。
特別な例外として、.for
ループの反復変数があります。
これは、どの文脈で使われるかにかかわらず、
インライン展開されます。
変数の値は読み込みによって変わる可能性があるので、
誤って評価することのないよう注意する必要があります。
読み込み時に評価してはいけない変数の典型例は、
DEPENDS
および
CONFIGURE_ARGS
です。
評価の結果何が起きるかをわかりやすくするため、
以下の例を見てください。
CONFIGURE_ARGS= # none CFLAGS= -O CONFIGURE_ARGS+= CFLAGS=${CFLAGS:Q} CONFIGURE_ARGS:= ${CONFIGURE_ARGS} CFLAGS+= -Wall
このコードからわかることは、:=
演算子を使うと、
容易に、予期しない結果を生むということです。
最初の段落はごくふつうのコードです。二つ目の段落では
CONFIGURE_ARGS
を評価しており、この結果、
CFLAGS=-O
になります。三つ目の段落では、
-Wall
を
CFLAGS
に付け加えていますが、この追加が
CONFIGURE_ARGS
には反映されません。
実際のコードではたいてい、
この三つの段落が完全に無関係のファイルに現れます。
バグや (ほとんどは文書化されていない)
方針への違反を検出するために、
変数の定義や使い方を制限する方法はたくさんあります。詳細は、
pkglint
の開発者向けドキュメンテーションをご覧ください。
ほとんどの .mk
ファイルは、
以下の二種類のいずれかに分類されます。
一つのファイルが複数の種類の性質を持つと、
見つけにくいバグの原因となることがしばしばあるので、そういうことは避けるようにします。
伝統的な命令型プログラミング言語の言葉で説明すると、
いくつかの .mk
ファイルはプロシージャーということになります。
プロシージャーは入力引数をとり、—インクルードされた後に—
出力引数を返します。Makefile
内の変数はすべて大域的なスコープをもつため、
すでに別の意味で使われている引数名を使わないよう注意する必要があります。
たとえば、PKGNAME
は、引数名としては不適切なものです。
プロシージャーは、プリプロセッシングの際に完全に評価されます。
このため、プロシージャーを呼ぶときには、
入力引数はすべて完全に解決可能である必要があります。たとえば、
CONFIGURE_ARGS
は、たいていは、
プロシージャーを呼んだ後にテキストが追加されることから、
変数の一部しかプロシージャーに渡されないことになるので、
決して入力引数として使ってはいけません。
また、他の変数から導かれる値への参照は、
プロシージャーの呼び出しの後に更新されます。
プロシージャーは、その出力引数を、 プリプロセッシングディレクティブ内で使うものとして、または、 実行時のみに利用可能なものとして、いずれかを宣言することができます。 後者は、他の実行時変数への参照を含む変数用です。
プロシージャーは、複数の呼び出しが可能なように書くものです。 つまり、ファイルに多重インクルードの防護策を施してはいけません。
プロシージャーの例としては、
mk/bsd.options.mk
や
mk/buildlink3/bsd.builtin.mk
があります。
引数が読み込み時に評価されることを表すため、
引数は :=
演算子を使って与えます。
この演算子は、この目的のためだけに使うようにします。
パッケージの Makefile
は、通常、
一連の変数の定義からできており、最後の行で
../../mk/bsd.pkg.mk
ファイルをインクルードしています。
コンパイラーや X11 の実装の種類など、
特定の機能の有無を問い合わせる必要がある場合は、
最後のインクルードの前に、これ以外の各種
*.mk
ファイルをインクルードすることができます。
.if
や
.for
のようなプリプロセッサーディレクティブを多用しているので、
ファイルを読み込む場所と順序が問題になります。
本節では、各種ファイルをどこで読み込むか、 および、その順序の理由を説明します。
bsd.prefs.mk
で最初におこなわれることは、
OPSYS
, OS_VERSION
,
MACHINE_ARCH
など、基本的な変数をいくつか定義することです。
次に、MAKECONF
(通常は mk.conf
)
で指定されているファイルから、ユーザーによる設定が読み込まれます。
それから、ユーザーによって上書きされたもの以外の変数が
mk/defaults/mk.conf
から読み込まれます。
ユーザーによる設定の後に、 システムの設定とプラットフォームの設定が読み込まれます。 これらはユーザーによる設定を上書きすることがあります。
その後、ツールの定義が読み込まれます。 この時点では、ツールのラッパーはまだ影響しません。 ラッパーは、パッケージを構築する時に影響をおよぼします。 このため、ツール名を直接使うのではなく、適切な変数を使う必要があります。
最後に、ラッパーおよびパッケージシステムのフレーバーから、 必須の変数がいくつか、 パッケージ構築過程の初期段階でキャッシュされていた変数とともに、 読み込まれます。
最初に、bsd.prefs.mk
が読み込まれます。
次に、パッケージ側で定義されない変数の標準状態の値を定義している、
各種の *-vars.mk
ファイルが読み込まれます。
この変数は、後になって、無関連のファイルで使われる可能性もあります。
その次に、bsd.pkg.error.mk
ファイルから
error-check
ターゲットが提供されます。
このターゲットは、
DELAYED_ERROR_MSG
または
DELAYED_WARNING_MSG
を使う他のターゲットすべてに対して、特別な依存性として追加されます。
その後、hacks.mk
から、
パッケージ固有のハックがインクルードされます。
そして、他の各種ファイルのインクルードが続きます。 この段階でインクルードされるファイルのほとんどは、 インクルードされる順序に関して依存性を持ちませんが、 なかには依存性を持つものもあります。
ここで、PKG_FAIL_REASON
と
PKG_SKIP_REASON
を検査するコードが実行されます。
ここまでの段階でインクルードされるすべてのファイルに対しては、
この両変数の使用が制限されます。
これより後にインクルードされるファイルでは、黙って無視されます。
それから、目的のターゲットに対応するファイルが、 この後で実行される順序でインクルードされますが、 実際の順序は問題とはならないはずです。
最後に、何ら興味深い変数を設定するものではなく、 実行される make ターゲットを定義するだけのファイルが、 さらにいくつかインクルードされます。
Table of Contents
pkgsrc の基盤は多くのコードベースの集合体であり、 熟考のすえ作られた各小片の周辺を少し変更しただけで pkgsrc が使い物にならなくなるであろう曲り角がたくさんあります。 ほとんどの変更によって pkgsrc が壊されることを防ぐため、 pkgsrc の基盤の重要な部分に変更を加える場合は、 常に一連の退行テストを実行するようにします。 本章では、pkgsrc において退行テストがどのように機能するか、および、 新しいテストをどのように追加すればよいかを、説明します。
まず、pkgtools/pkg_regress
パッケージをインストールする必要があります。
このパッケージには pkg_regress コマンドが附属しており、
あとは、このコマンドを実行するだけで、
regress
カテゴリーにあるテストをすべて実行してくれます。
regress
カテゴリー内のディレクトリーのうち、
spec
というファイルを含むものは、
それぞれがひとつの退行テストに対応しています。
spec
ファイルはシェルプログラムで、
pkg_regress コマンドからインクルードされます。
以下の関数は、必要に応じて上書きすることができます。
各関数は引数をとりません。関数はいずれも、 “set -e” された状態の下で呼ばれるので、 テストにおいて実行される各コマンドの終了コードを、 注意して確認してください。
do_setup()
この関数は、テスト用に環境変数を準備します。 標準では、何もしません。
do_test()
この関数は、テストを実際に実行します。
標準では、この関数は TEST_MAKE
を
引数 MAKEARGS_TEST
で呼んで、
エラーメッセージをはじめとする出力をファイル
TEST_OUTFILE
に書き込みます。
check_result()
この関数は、テスト実行後に実行するもので、 ふつうは、実際の出力を予想したものと比較するために使います。 これにより、次節のようなさまざまな補助関数が使えるようになります。
do_cleanup()
この関数は、テストの実行が終わった後に、 すべての掃除をします。標準では、何もしません。
Table of Contents
pkgsrc システムはすでに、多くのオペレーティングシステム、 ハードウェアアーキテクチャー、およびコンパイラーに移植されています。 本章では、pkgsrc の移植性をさらに高めるために必要な手順を説明します。
pkgsrc を未対応のオペレーティングシステム (以下、
MyOS
とします) に移植するには、
以下のファイルを作成あるいは修正する必要があります。
pkgtools/bootstrap-mk-files/files/mods/MyOS
.sys.mk
このファイルには、いくつかの基本的な定義、 たとえば C コンパイラーの名前が含まれています。
mk/bsd.prefs.mk
OPSYS
, OS_VERSION
,
LOWER_OS_VERSION
,
LOWER_VENDOR
,
MACHINE_ARCH
, OBJECT_FMT
,
APPEND_ELF
の各変数、
その他このファイルに書かれている各変数を定義するコードを追加します。
mk/platform/MyOS
.mk
このファイルには、 pkgsrc が使用するプラットフォーム固有の定義が含まれています。 まず他のプラットフォーム用のファイルのいずれかをコピーしてから、 必要に応じて編集します。
mk/platform/MyOS
.pkg.dist
このファイルには、ディレクトリーを並べたリストが、
パーミッションビットと所有権とともに含まれています。
ここに含まれるディレクトリーは、明示的に USE_MTREE
を設定している各パッケージのインストールに際して、
自動的に作成されます。この機能は、
廃止が予定されています。
mk/platform/MyOS
.x11.dist
既存の x11.dist ファイルのいずれかを、
にコピーするだけです。MyOS
.x11.dist
mk/tools/bootstrap.mk
プラットフォームによっては、ベースシステム附属のツールが pkgsrc で使うには不十分なことがあります。 たとえば sed(1) には、 処理可能な行長が短く制限されているバージョンがたくさんあります。 したがって、pkgsrc では別途ツールを用意しており、 このファイルで有効化することができます。
mk/tools/tools.MyOS
.mk
このファイルでは、 pkgsrc 自身が必要とするツールおよび、別のツールや pkgsrc のパッケージが必要とするツールすべてのパスを定義しています。 これらのツールが移植対象のプラットフォームではどこにあるかを調べて、 書き足します。
これで、lang/perl5
や shells/bash
のような、
いくつかの基本的なパッケージが構築できるようになったはずです。
Table of Contents
私たちは、パッケージコレクションにないソフトウェアをさがし、GNU bisonを選びまし た。バークレーのyaccがすでにソースツリーに存在するので、 bisonを使いたい人は いないでしょう。しかし、練習という意味では役にたちます。
# $NetBSD$ # DISTNAME= bison-1.25 CATEGORIES= devel MASTER_SITES= ${MASTER_SITE_GNU} MAINTAINER= thorpej@NetBSD.org HOMEPAGE= http://www.gnu.org/software/bison/bison.html COMMENT= GNU yacc clone GNU_CONFIGURE= yes INFO_FILES= bison.info .include "../../mk/bsd.pkg.mk"
GNU version of yacc. Can make re-entrant parsers, and numerous other improvements. Why you would want this when Berkeley yacc(1) is part of the NetBSD source tree is beyond me.
NetBSDパッケージシステムは、
pkgtools/pkglint
を含んでいます。このツールはこれらのファイルの内
容をチェックするのを助けてくれます。一度インストールしてしまえば、このツー
ルは非常に簡単に使うことができます。検査したいパッケージのディレクトリーに
移動し、pkglintを実行するだけです。
$
pkglint
looks fine.
指定されたコマンド行の引数(pkglint(1)を見てください)によっては、 より多くのチェックがおこなわれます。例えば pkglint -Call -Wall は、非常に徹底したチェックをおこないます。
パッケージのためのディレクトリーと、 いくつかの追加のディレクトリーを作成します。
#
cd /usr/pkgsrc/lang
#
mkdir bison
#
cd bison
#
mkdir patches
Makefile
、DESCR
およびPLIST
を作り
(Chapter 11, パッケージコンポーネント - ファイル、ディレクトリー、およびコンテンツ参照)、distfile を取得しま
す。
#
make fetch
>> bison-1.25.tar.gz doesn't seem to exist on this system. >> Attempting to fetch from ftp://prep.ai.mit.edu/pub/gnu//. Requesting ftp://prep.ai.mit.edu/pub/gnu//bison-1.25.tar.gz (via ftp://orpheus.amdahl.com:80/) ftp: Error retrieving file: 500 Internal error >> Attempting to fetch from ftp://wuarchive.wustl.edu/systems/gnu//. Requesting ftp://wuarchive.wustl.edu/systems/gnu//bison-1.25.tar.gz (via ftp://orpheus.amdahl.com:80/) ftp: Error retrieving file: 500 Internal error >> Attempting to fetch from ftp://ftp.freebsd.org/pub/FreeBSD/distfiles//. Requesting ftp://ftp.freebsd.org/pub/FreeBSD/distfiles//bison-1.25.tar.gz (via ftp://orpheus.amdahl.com:80/) Successfully retrieved file.
distfileのチェックサムを
distinfo
へ作成します。
#
make makedistinfo
コンパイルします。
#
make
>> Checksum OK for bison-1.25.tar.gz. ===> Extracting for bison-1.25 ===> Patching for bison-1.25 ===> Ignoring empty patch directory ===> Configuring for bison-1.25 creating cache ./config.cache checking for gcc... cc checking whether we are using GNU C... yes checking for a BSD compatible install... /usr/bin/install -c -o bin -g bin checking how to run the C preprocessor... cc -E checking for minix/config.h... no checking for POSIXized ISC... no checking whether cross-compiling... no checking for ANSI C header files... yes checking for string.h... yes checking for stdlib.h... yes checking for memory.h... yes checking for working const... yes checking for working alloca.h... no checking for alloca... yes checking for strerror... yes updating cache ./config.cache creating ./config.status creating Makefile ===> Building for bison-1.25 cc -c -DSTDC_HEADERS=1 -DHAVE_STRING_H=1 -DHAVE_STDLIB_H=1 -DHAVE_MEMORY_H=1 -DHAVE_ALLOCA=1 -DHAVE_STRERROR=1 -I./../include -g LR0.c cc -c -DSTDC_HEADERS=1 -DHAVE_STRING_H=1 -DHAVE_STDLIB_H=1 -DHAVE_MEMORY_H=1 -DHAVE_ALLOCA=1 -DHAVE_STRERROR=1 -I./../include -g allocate.c cc -c -DSTDC_HEADERS=1 -DHAVE_STRING_H=1 -DHAVE_STDLIB_H=1 -DHAVE_MEMORY_H=1 -DHAVE_ALLOCA=1 -DHAVE_STRERROR=1 -I./../include -g closure.c cc -c -DSTDC_HEADERS=1 -DHAVE_STRING_H=1 -DHAVE_STDLIB_H=1 -DHAVE_MEMORY_H=1 -DHAVE_ALLOCA=1 -DHAVE_STRERROR=1 -I./../include -g conflicts.c cc -c -DSTDC_HEADERS=1 -DHAVE_STRING_H=1 -DHAVE_STDLIB_H=1 -DHAVE_MEMORY_H=1 -DHAVE_ALLOCA=1 -DHAVE_STRERROR=1 -I./../include -g derives.c cc -c -DXPFILE=\"/usr/pkg/share/bison.simple\" -DXPFILE1=\"/usr/pkg/share/bison.hairy\" -DSTDC_HEADERS=1 -DHAVE_STRING_H=1 -DHAVE_STDLIB_H=1 -DHAVE_MEMORY_H=1 -DHAVE_ALLOCA=1 -DHAVE_STRERROR=1 -g ./files.c cc -c -DSTDC_HEADERS=1 -DHAVE_STRING_H=1 -DHAVE_STDLIB_H=1 -DHAVE_MEMORY_H=1 -DHAVE_ALLOCA=1 -DHAVE_STRERROR=1 -I./../include -g getargs.c cc -c -DSTDC_HEADERS=1 -DHAVE_STRING_H=1 -DHAVE_STDLIB_H=1 -DHAVE_MEMORY_H=1 -DHAVE_ALLOCA=1 -DHAVE_STRERROR=1 -I./../include -g gram.c cc -c -DSTDC_HEADERS=1 -DHAVE_STRING_H=1 -DHAVE_STDLIB_H=1 -DHAVE_MEMORY_H=1 -DHAVE_ALLOCA=1 -DHAVE_STRERROR=1 -I./../include -g lalr.c cc -c -DSTDC_HEADERS=1 -DHAVE_STRING_H=1 -DHAVE_STDLIB_H=1 -DHAVE_MEMORY_H=1 -DHAVE_ALLOCA=1 -DHAVE_STRERROR=1 -I./../include -g lex.c cc -c -DSTDC_HEADERS=1 -DHAVE_STRING_H=1 -DHAVE_STDLIB_H=1 -DHAVE_MEMORY_H=1 -DHAVE_ALLOCA=1 -DHAVE_STRERROR=1 -I./../include -g main.c cc -c -DSTDC_HEADERS=1 -DHAVE_STRING_H=1 -DHAVE_STDLIB_H=1 -DHAVE_MEMORY_H=1 -DHAVE_ALLOCA=1 -DHAVE_STRERROR=1 -I./../include -g nullable.c cc -c -DSTDC_HEADERS=1 -DHAVE_STRING_H=1 -DHAVE_STDLIB_H=1 -DHAVE_MEMORY_H=1 -DHAVE_ALLOCA=1 -DHAVE_STRERROR=1 -I./../include -g output.c cc -c -DSTDC_HEADERS=1 -DHAVE_STRING_H=1 -DHAVE_STDLIB_H=1 -DHAVE_MEMORY_H=1 -DHAVE_ALLOCA=1 -DHAVE_STRERROR=1 -I./../include -g print.c cc -c -DSTDC_HEADERS=1 -DHAVE_STRING_H=1 -DHAVE_STDLIB_H=1 -DHAVE_MEMORY_H=1 -DHAVE_ALLOCA=1 -DHAVE_STRERROR=1 -I./../include -g reader.c cc -c -DSTDC_HEADERS=1 -DHAVE_STRING_H=1 -DHAVE_STDLIB_H=1 -DHAVE_MEMORY_H=1 -DHAVE_ALLOCA=1 -DHAVE_STRERROR=1 -I./../include -g reduce.c cc -c -DSTDC_HEADERS=1 -DHAVE_STRING_H=1 -DHAVE_STDLIB_H=1 -DHAVE_MEMORY_H=1 -DHAVE_ALLOCA=1 -DHAVE_STRERROR=1 -I./../include -g symtab.c cc -c -DSTDC_HEADERS=1 -DHAVE_STRING_H=1 -DHAVE_STDLIB_H=1 -DHAVE_MEMORY_H=1 -DHAVE_ALLOCA=1 -DHAVE_STRERROR=1 -I./../include -g warshall.c cc -c -DSTDC_HEADERS=1 -DHAVE_STRING_H=1 -DHAVE_STDLIB_H=1 -DHAVE_MEMORY_H=1 -DHAVE_ALLOCA=1 -DHAVE_STRERROR=1 -I./../include -g version.c cc -c -DSTDC_HEADERS=1 -DHAVE_STRING_H=1 -DHAVE_STDLIB_H=1 -DHAVE_MEMORY_H=1 -DHAVE_ALLOCA=1 -DHAVE_STRERROR=1 -I./../include -g getopt.c cc -c -DSTDC_HEADERS=1 -DHAVE_STRING_H=1 -DHAVE_STDLIB_H=1 -DHAVE_MEMORY_H=1 -DHAVE_ALLOCA=1 -DHAVE_STRERROR=1 -I./../include -g getopt1.c cc -g -o bison LR0.o allocate.o closure.o conflicts.o derives.o files.o getargs.o gram.o lalr.o lex.o main.o nullable.o output.o print.o reader.o reduce.o symtab.o warshall.o version.o getopt.o getopt1.o ./files.c:240: warning: mktemp() possibly used unsafely, consider using mkstemp() rm -f bison.s1 sed -e "/^#line/ s|bison|/usr/pkg/share/bison|" < ./bison.simple > bison.s1
すべてOKのようなので、ファイルをインストールします。
#
make install
>> Checksum OK for bison-1.25.tar.gz. ===> Installing for bison-1.25 sh ./mkinstalldirs /usr/pkg/bin /usr/pkg/share /usr/pkg/info /usr/pkg/man/man1 rm -f /usr/pkg/bin/bison cd /usr/pkg/share; rm -f bison.simple bison.hairy rm -f /usr/pkg/man/man1/bison.1 /usr/pkg/info/bison.info* install -c -o bin -g bin -m 555 bison /usr/pkg/bin/bison /usr/bin/install -c -o bin -g bin -m 644 bison.s1 /usr/pkg/share/bison.simple /usr/bin/install -c -o bin -g bin -m 644 ./bison.hairy /usr/pkg/share/bison.hairy cd .; for f in bison.info*; do /usr/bin/install -c -o bin -g bin -m 644 $f /usr/pkg/info/$f; done /usr/bin/install -c -o bin -g bin -m 644 ./bison.1 /usr/pkg/man/man1/bison.1 ===> Registering installation for bison-1.25
これでbisonを使用することができます。そして、pkg_delete bisonを実 行することでbisonを削除することもできます。もし、バイナリーパッケージが欲 しければ、以下のようにしてください。
#
make package
>> Checksum OK for bison-1.25.tar.gz. ===> Building package for bison-1.25 Creating package bison-1.25.tgz Registering depends:. Creating gzip'd tar ball in '/u/pkgsrc/lang/bison/bison-1.25.tgz'
もし、ソースやオブジェクトファイルが必要ないのであれば、 掃除してください。
#
make clean
===> Cleaning for bison-1.25
Table of Contents
#
make
===> Checking for vulnerabilities in figlet-2.2.1nb2 => figlet221.tar.gz doesn't seem to exist on this system. => Attempting to fetch figlet221.tar.gz from ftp://ftp.figlet.org/pub/figlet/program/unix/. => [172219 bytes] Connected to ftp.plig.net. 220 ftp.plig.org NcFTPd Server (licensed copy) ready. 331 Guest login ok, send your complete e-mail address as password. 230-You are user #5 of 500 simultaneous users allowed. 230- 230- ___ _ _ _ 230- | _| |_ ___ ___| |_|___ ___ ___ ___ 230- | _| _| . |_| . | | | . |_| . | _| . | 230- |_| |_| | _|_| _|_|_|_ |_|___|_| |_ | 230- |_| |_| |___| |___| 230- 230-** Welcome to ftp.plig.org ** 230- 230-Please note that all transfers from this FTP site are logged. If you 230-do not like this, please disconnect now. 230- 230-This archive is available via 230- 230-HTTP: http://ftp.plig.org/ 230-FTP: ftp://ftp.plig.org/ (max 500 connections) 230-RSYNC: rsync://ftp.plig.org/ (max 30 connections) 230- 230-Please email comments, bug reports and requests for packages to be 230-mirrored to ftp-admin@plig.org. 230- 230- 230 Logged in anonymously. Remote system type is UNIX. Using binary mode to transfer files. 200 Type okay. 250 "/pub" is new cwd. 250-"/pub/figlet" is new cwd. 250- 250-Welcome to the figlet archive at ftp.figlet.org 250- 250- ftp://ftp.figlet.org/pub/figlet/ 250- 250-The official FIGlet web page is: 250- http://www.figlet.org/ 250- 250-If you have questions, please mailto:info@figlet.org. If you want to 250-contribute a font or something else, you can email us. 250 250 "/pub/figlet/program" is new cwd. 250 "/pub/figlet/program/unix" is new cwd. local: figlet221.tar.gz remote: figlet221.tar.gz 502 Unimplemented command. 227 Entering Passive Mode (195,40,6,41,246,104) 150 Data connection accepted from 84.128.86.72:65131; transfer starting for figlet221.tar.gz (172219 bytes). 38% |************** | 65800 64.16 KB/s 00:01 ETA 226 Transfer completed. 172219 bytes received in 00:02 (75.99 KB/s) 221 Goodbye. => Checksum OK for figlet221.tar.gz. ===> Extracting for figlet-2.2.1nb2 ===> Required installed package ccache-[0-9]*: ccache-2.3nb1 found ===> Patching for figlet-2.2.1nb2 ===> Applying pkgsrc patches for figlet-2.2.1nb2 ===> Overriding tools for figlet-2.2.1nb2 ===> Creating toolchain wrappers for figlet-2.2.1nb2 ===> Configuring for figlet-2.2.1nb2 ===> Building for figlet-2.2.1nb2 gcc -O2 -DDEFAULTFONTDIR=\"/usr/pkg/share/figlet\" -DDEFAULTFONTFILE=\"standard.flf\" figlet.c zipio.c crc.c inflate.c -o figlet chmod a+x figlet gcc -O2 -o chkfont chkfont.c => Unwrapping files-to-be-installed.#
#
make install
===> Checking for vulnerabilities in figlet-2.2.1nb2 ===> Installing for figlet-2.2.1nb2 install -d -o root -g wheel -m 755 /usr/pkg/bin install -d -o root -g wheel -m 755 /usr/pkg/man/man6 mkdir -p /usr/pkg/share/figlet cp figlet /usr/pkg/bin cp chkfont /usr/pkg/bin chmod 555 figlist showfigfonts cp figlist /usr/pkg/bin cp showfigfonts /usr/pkg/bin cp fonts/*.flf /usr/pkg/share/figlet cp fonts/*.flc /usr/pkg/share/figlet cp figlet.6 /usr/pkg/man/man6 ===> Registering installation for figlet-2.2.1nb2#
Table of Contents
他の大規模プロジェクトと同様に、初心者の方にとって
pkgsrc のディレクトリー配置は非常に複雑なものです。
ftp.NetBSD.org
での基点ディレクトリーは /pub/pkgsrc/
です。
他のサーバーでは、基点ディレクトリーの場所は異なるかもしれませんが、
基点ディレクトリー以下の内容はどのサーバーでもすべて同じはずです。
このディレクトリーには、以下で説明するような、
いくつかのサブディレクトリーがあります。
distfiles
ディレクトリーは、
pkgsrc の各パッケージのアーカイブファイルのうち、
このサーバーにミラーされているものを多数含んでいます。
配布ファイルのファイル名にバージョン番号が明示的に含まれていなかったり、
一般的すぎる名前 (たとえば release.tar.gz
)
だったりする場合には、パッケージ名を冠したサブディレクトリーが使われます。
このディレクトリーは、
pkgsrc が対応している各種プラットフォーム用のバイナリーパッケージを含んでいます。
各プラットフォーム用のサブディレクトリーは OPSYS
/ARCH
/OSVERSION_TAG
のような形式になっています。これらの意味は以下のとおりです。
OPSYS
は、
当該パッケージが構築された対象のオペレーティングシステム名です。
この名前は uname コマンドの出力に合わせているので、
ふだん聞き慣れた名前とは違う名前になっていることがあります。
ARCH
は、
当該パッケージが構築された対象のプラットフォームのハードウェアアーキテクチャー名です。
ABI
(Application
Binary Interface) が複数あるプラットフォームでは、
ABI
も含めた名称になっています。
OSVERSION
は、
オペレーティングシステムのバージョンです。バージョン番号が頻繁に変わる場合
(たとえば NetBSD-current) は、たとえば
4.99.x
のように、頻繁に変わる部分を
x
に置き換えています。
TAG
は、安定版の枝の場合は
20
、
HEAD の場合は xx
Qy
head
です。後者は、
パッケージが定期的に更新されるものである場合にのみ使います。
そうでない場合は、たとえば head_20071015
のように、
pkgsrc のチェックアウト日を付け加えた形にします。
このような方式となっている理由は、pkgsrc の利用者がバイナリーパッケージを探すときに、 サーバー上のディレクトリーを辿って、 自分のマシンに最適なバイナリーパッケージを簡単に見つけられるからです。 利用者はたいてい、オペレーティングシステムとハードウェアアーキテクチャーを知っているので、 OPSYS と ARCH を最初にしています。これらを選べば、 OSVERSION と TAG の最適な組合せを選ぶことができます。 通常の場合、オペレーティングシステムのバージョンが違っても、 パッケージには互換性があるからです。
これらの各ディレクトリーには、
当該プラットフォーム用のバイナリーパッケージ全体が置かれています。
All
というディレクトリーがあり、
ここにすべてのバイナリーパッケージを含んでいます。
このほか、カテゴリー別のディレクトリーがあり、
バイナリーパッケージの実体へのシンボリックリンクを含んでいます。
ここには、構築できないプラットフォームがあるパッケージを修正したい方向けに、
バルクビルドの結果の報告が置いてあります。
サブディレクトリーの構造はSection C.3, “packages
: バイナリーパッケージ”と同じです。
このディレクトリーは pkgsrc “そのもの”、つまり、 ソースアーカイブからバイナリーパッケージを作る方法を定義したファイル一式を含んでいます。
pkgsrc
ディレクトリーは、
CVS リポジトリーのスナップショットを含んでおり、定期的に更新されます。
pkgsrc.tar.gz
ファイルは、
このディレクトリーと同じ内容を含んでおり、
全体をダウンロードできるようになっています。
四半期ごとの枝用のディレクトリーには、
さらに
pkgsrc-20
というファイルがあります。
これは、枝が分岐した時点の状態の pkgsrc を含んでいます。xx
Qy
.tar.gz
Table of Contents
本節では、この the pkgsrc guide そのものの編集に関する情報を掲載します。
the pkgsrc guide のソースコードは
pkgsrc/doc/guide/files
以下に置かれており、
これをもとに、以下のような数々のファイルが生成されます。
pkgsrc/doc/pkgsrc.txt
pkgsrc/doc/pkgsrc.html
http://www.NetBSD.org/docs/pkgsrc/pkgsrc.pdf: the pkgsrc guide の PDF 版。
http://www.NetBSD.org/docs/pkgsrc/pkgsrc.ps: the pkgsrc guide の PostScript 版。
the pkgsrc guide の編集手順は、以下のとおりです。
the pkgsrc guide (と、XML にもとづくその他の
NetBSD ドキュメンテーション)
の再生成に必要なパッケージがインストールされていることを確認します。
ASCII および HTML 版の生成に必要なのは meta-pkgs/netbsd-doc
、
PostScript および PDF 版の生成に必要なのは meta-pkgs/netbsd-doc-print
です。
各形式のドキュメンテーションの一貫性を保つために、
いずれのパッケージもインストールする必要があります。
cd doc/guide を実行して、 適切なディレクトリーに移動します。これ以降の手順は、 すべてこの場所でおこないます。
files/
以下にある
XML ファイルを編集します。
bmake を実行して、the pkgsrc
guide が妥当な XML であることを確認し、最終的な出力ファイルを構築します。
何かエラーが出た場合は、元のファイルを編集するだけで結構です。
作業ディレクトリーには、files/
以下のファイルを指すシンボリックリンクがあるだけだからです。
(cd files && cvs commit)
bmake clean && bmake を実行して、適切な RCS Id を含んだ出力ファイルを作り直します。
bmake regen を実行して、
pkgsrc/doc
および
htdocs
以下にそれぞれファイルをインストールして commit します。
章の追加、削除、または改名をした場合は、 htdocs ディレクトリー以下で cvs add や cvs delete を使って、 元のファイルとの対応を揃える必要があります。