Chapter 19. パッケージを動くようにする

Table of Contents

19.1. 一般的な操作
19.1.1. パッケージの移植性
19.1.2. mk.conf から利用者が設定可能な変数を捕まえる方法
19.1.3. ユーザーとの対話
19.1.4. ライセンスの処理
19.1.5. 制限つきパッケージ
19.1.6. 依存性の処理
19.1.7. 他のパッケージとの衝突の処理
19.1.8. 構築することができない、あるいはすべきでないパッケージ
19.1.9. 一旦インストールしたら削除すべきでないパッケージ
19.1.10. セキュリティー問題を持つパッケージへの対処
19.1.11. 既存パッケージ修正時に、バージョンを上げるにはどうするか
19.1.12. パッケージのファイル中の各種テキストを置換する (SUBST の枠組)
19.2. fetch 相での問題を修正する
19.2.1. distfileのダウンロードが単純にできないパッケージ
19.2.2. '古い'名前のまま更新されたdistfileの取り扱い
19.3. configure 相での問題を修正する
19.3.1. 共有ライブラリー - libtool
19.3.2. すでにlibtoolをサポートしているGNUパッケージでlibtoolを使う
19.3.3. GNU Autoconf/Automake
19.4. プログラミング言語
19.4.1. C, C++ および Fortran
19.4.2. Java
19.4.3. perl スクリプトを含むパッケージ
19.4.4. 他のプログラミング言語
19.5. build 相での問題を修正する
19.5.1. C および C++ のコードの条件つきコンパイル
19.5.2. コンパイラーのバグへの対処方法
19.5.3. undefined reference to ...
19.5.4. メモリーが不足する
19.6. install 相での問題を修正する
19.6.1. 必要なディレクトリーを作成する
19.6.2. ドキュメンテーションのインストール場所
19.6.3. 最高得点ファイルをインストールする
19.6.4. パッケージを DESTDIR に対応させる
19.6.5. その他のインタープリターへのパスがハードコードされているパッケージ
19.6.6. perl モジュールをインストールするパッケージ
19.6.7. infoファイルをインストールするパッケージ
19.6.8. マニュアルページをインストールするパッケージ
19.6.9. GConf のデータファイルをインストールするパッケージ
19.6.10. scrollkeeper/rarian のデータファイルをインストールするパッケージ
19.6.11. X11 のフォントをインストールするパッケージ
19.6.12. GTK2 のモジュールをインストールするパッケージ
19.6.13. SGML または XML のデータをインストールするパッケージ
19.6.14. MIME データベースの拡張をインストールするパッケージ
19.6.15. intltool を使うパッケージ
19.6.16. 起動スクリプトをインストールするパッケージ
19.6.17. TeX モジュールをインストールするパッケージ
19.6.18. エミュレーションによるバイナリーの実行に対応したパッケージ
19.6.19. ハイカラーテーマのアイコンをインストールするパッケージ
19.6.20. デスクトップファイルをインストールするパッケージ
19.7. パッケージに問題があるという印をつける

19.1. 一般的な操作

19.1.1. パッケージの移植性

pkgsrc の目玉の一つは、多くのプラットフォームで動作することです。 そのため、pkgsrc のパッケージの移植性をできるかぎり高めることが重要になります。 本章では、pkgsrc の作業に際して、 注意が必要となる具体的な事項を説明します。

19.1.2. mk.conf から利用者が設定可能な変数を捕まえる方法

pkgsrc の利用者は、MAKECONF によって参照されるファイル (標準では mk.conf) でいくつかの変数を上書きして、pkgsrc の設定をすることができます。 このような変数を make(1) のプリプロセッサーディレクティブ (たとえば .if.for) の内部で使いたい場合は、 利用者の設定が読み込まれる場所より前で ../../mk/bsd.prefs.mk をインクルードする必要があります。

しかし、変数によっては、 まだ定義されていない変数への参照を含んでいることがあるために、 ../../mk/bsd.prefs.mk をインクルードした後では完全に定義することができないものがあります。 シェルコマンドの場合は、変数の実態はマクロであり、 使われるときにしか展開されないので、このことは問題にはなりません。 ただし、前述したプリプロセッサーディレクティブの内部や、 依存性を記した行 (target: dependencies のような形式の行) においては、読み込み時に変数が展開されます。

Note

各変数が読み込み時に使用可能か、 実行時にのみ使用可能かを網羅した一覧は、現在のところありませんが、 準備をしているところです。

19.1.3. ユーザーとの対話

時々、パッケージがユーザーとの対話を必要とする場合がありますが、 そのような状況は何通りもありえます:

  • distfile の取得時に、パッケージによっては、 ユーザー名とパスワードの入力や web ページ上のライセンスへの同意のような、 利用者の対話を必要とするものがあります。

  • distfile の展開時に、 パッケージによってはパスワードを要求することがあります。

  • パッケージの構築前の設定の補助

  • 構築過程の最中の補助

  • パッケージのインストール中の補助

どの段階で対話が必要になるかをpkgsrcの機構に知らせるため、 INTERACTIVE_STAGE 定義が用意されており、 パッケージのMakefileで定義します。 たとえば以下のようにします。

INTERACTIVE_STAGE=      build
    

複数の段階を指定することもできます:

INTERACTIVE_STAGE=      configure install
    

利用者は、BATCH 変数を設定して、 この定義がおこなわれているパッケージをとばすことができます。

19.1.4. ライセンスの処理

ソフトウェアの作者は、 そのソフトウェアをどのようなライセンスのもとでコピーすることができるかを、定めることができます。 これは著作権法にもとづくことであって、ライセンス選択の理由は 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 に対して、同じ目印のついた複数のパッケージのうち、 ひとつのパッケージだけは構築を続行するが、 それ以外のパッケージは構築を続行しない、 といった指定ができなくなるというものもあります。

19.1.5. 制限つきパッケージ

ライセンスによっては、ソフトウェアの再配布方法に制限があります。 パッケージが「自由」あるいは「オープンソース」でない限りは、 ライセンスの目印が必要なので、制限のあるパッケージにはすべてライセンスの目印がついているはずです。 その制限について記述しておくと、パッケージのツールは、 自動的に制限されたこと (たとえばバイナリーパッケージを 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 にミラーされません。

19.1.6. 依存性の処理

パッケージは他のパッケージに依存するかもしれません。そして、この依存性を定 義するためのいろいろな方法があります。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) で説明され ている各ワイルドカードを含めることができます。

  1. パッケージを構築または実行するために他のパッケージのバイナリーやライブラリーが必要で、 そのパッケージに buildlink3.mk ファイルがある場合は、 それを使ってください。

    .include "../../graphics/jpeg/buildlink3.mk"
    	
  2. パッケージを構築するために、他のパッケージのバイナリーが必要な場合は、 BUILD_DEPENDS 定義を使ってください。

    BUILD_DEPENDS+= scons-[0-9]*:../../devel/scons
    	
  3. パッケージがリンクのためのライブラリーを必要とし、 そのパッケージに buildlink3.mk ファイルがない場合は、 buildlink3.mk ファイルを作ってください。 DEPENDS を使うと、 インクルードファイルやライブラリーをコンパイラーから隠してしまうので、このような場合には不適切です。

  4. パッケージを実行するために、いくつかの実行可能ファイルが必要であり、かつ buildlink3.mk ファイルが存在しない場合は、 DEPENDS変数を使ってください。print/lyxパッケージを実行する時には、 teTeXパッケージ由来のlatex のバイナリーが実行可能でなければなりません。これ は、以下のように指定します。

    DEPENDS+=        teTeX-[0-9]*:../../print/teTeX
    	
  5. パッケージ依存関係にはワイルドカードを使うことができます。 ワイルドカード依存関係は、バイナリーパッケージを作る時には保持されること に注意してください。依存関係はバイナリーパッケージのインストール時にチェッ クされ、パターンにマッチするパッケージが使われます。ワイルドカード依存関係 は、注意を払って使うよう気を付けてください。

    tk-postgresqltk-*という DEPENDSにマッチするなどの曖昧なマッチの可能性を排除 するため、-*ではなく -[0-9]*を使うことをおすすめします。

    ワイルドカードは、 依存パッケージがあるバージョン以上でないと構築できないことを指定するのにも使えます。

    DEPENDS+=       ImageMagick>=6.0:../../graphics/ImageMagick
    	

    以上のように書いた場合、このパッケージは ImageMagick のバージョン 6.0 以上を使って構築されることを意味します。このような形式の依存関係は、たとえば、 依存先のコマンドラインオプションが変更された場合にでも、構築できることを保証することができます。

    あるバージョン以上のライブラリーに依存させる必要がある場合は、 the pkgsrc guide の buildlink の節をご覧ください。

    セキュリティー上の修正があった場合は、 パッケージ脆弱性ファイルを更新してください。 さらなる情報は、Section 19.1.10, “セキュリティー問題を持つパッケージへの対処”を参照してください。

パッケージの構築用に別のパッケージに含まれるファイルが必要な場合は、 関連する配布ファイルを DISTFILES に追加して、 必要なファイルが自動的に展開されるようにします。例としては print/ghostscript パッケージをご覧ください。 (このパッケージは、 構築の際に jpeg のソースがソースの状態で存在することに依存しています。)

19.1.7. 他のパッケージとの衝突の処理

パッケージは、すでにインストール済みの別のパッケージと衝突する可能性があり ます。例えば、パッケージが、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と衝突するでしょう。

19.1.8. 構築することができない、あるいはすべきでないパッケージ

環境によってはパッケージを構築しないよう指示するような理由がいくつかありま す。パッケージが、ほとんどのプラットフォームで構築および実行できる場合は、 NOT_FOR_PLATFORMとして例外を記述します。逆に、パッケージが一部のプラットフォー ムでしか構築および実行できない場合は、ONLY_FOR_PLATFORMを設定します。 ONLY_FOR_PLATFORMNOT_FOR_PLATFORM の値はいずれも、OS triples (OS-version-platform) であり、 グロブ形式のワイルドカードを使うことができます。

パッケージのなかには、あるオペレーティングシステムの特定のバージョンに強く依存するものがあります。 たとえば、LKM や sysutils/lsof などです。 このようなバイナリーパッケージは、同じ OS の別バージョンと後方互換ではないので、 FTP サーバーでは対象バージョン専用のディレクトリーにアップロードするようにします。 OSVERSION_SPECIFICyes に設定して、 パッケージに印をつけてください。この変数は、現在のところ、 パッケージシステム内部のどこでも使われませんが、 将来は使われることになるかもしれません。

パッケー ジをとばすべき場合(たとえば、そのパッケージが提供する機能が、すでにシステム で提供されている場合)は、 PKG_SKIP_REASONにそのことを説明するメッセージを設 定します。必要な条件が満たされていないせいでパッケージの構築が失敗するであ ろう場合は、PKG_FAIL_REASONにそのことを説明するメッセージを設定します。

19.1.9. 一旦インストールしたら削除すべきでないパッケージ

あるパッケージを、一旦インストールしたら削除できないようにするためには、 そのパッケージの Makefile で PKG_PRESERVE 定義を設定します。この定義を設定した pkgsrc エントリーから作られたバイナリーパッケージには、その旨が記録されます。 preserved 付きのパッケージは、 pkg_delete(1) を使っても、 -f オプションを付けない限りは削除されません。

19.1.10. セキュリティー問題を持つパッケージへの対処

脆弱性が発見された場合、そのことを localsrc/security/advisories/pkg-vulnerabilitiesに記載してcommitしてくださ い。このファイルを commit した後、同じディレクトリーで make upload して、ftp.NetBSD.org 上のファイルを更新してください。

脆弱性の修正を、パッチの適用によっておこなった場合は、修正後に PKGREVISION を上げます (もちろん、問題の修正を、 新しくリリースされたソフトウェアを使っておこなった場合は、 これは必要ありません)。

また、修正を安定版 pkgsrc 枝に適用したほうがよい場合は、 pullup 要求を提出してください。

ftp.NetBSD.org 上にすでに置かれているバイナリーパッケージは、 週次の cron ジョブによって半自動的に対処されます。

19.1.11. 既存パッケージ修正時に、バージョンを上げるにはどうするか

既存のパッケージに修正を加えたときに、PKGNAMEのバージョン番号を変えると便利 な場合があります。元の作者による将来のバージョンと衝突しないようにするため、 PKGREVISION=1 (2, ...)を設定して、パッケージのバージョンに nb1, nb2, ... という接尾辞をつけることができます。このnbは、パッケージのツール群からは.と 同様の扱いを受けます。たとえば、

DISTNAME=       foo-17.42
PKGREVISION=    9
    

とすると、PKGNAMEfoo-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 を上げる必要があります。

19.1.12. パッケージのファイル中の各種テキストを置換する (SUBST の枠組)

複数のファイルに含まれる同じテキストを置換したい場合や、 テキストの置換方法を変化させたい場合には、パッチだけでは実現できません。 そこで 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-patchpre-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 ファイル内でのみ文書化されています。

19.2. fetch 相での問題を修正する

19.2.1. distfileのダウンロードが単純にできないパッケージ

動的な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}"."
    

19.2.2. '古い'名前のまま更新されたdistfileの取り扱い

時々、ソフトウェアパッケージの作者がソフトウェアのリリース後に変更を加え、 変更後のdistfileを、バージョン番号を変えずに公開することがあります。このと き、pkgsrcにそのパッケージがすでに入っていると、チェックサムが一致しない ことになります。distfileの更新が意図されたものであって、 トロイの木馬などが仕込まれたのではないことを確認するため、 新しい distfile の内容と変更前の古い distfile の内容と比較してください。 新旧の distfile を比較したことと、何が変わったのかを、 commit メッセージに含めてください。 確認後、この問題の正しい回避策は、DIST_SUBDIR を一意な (普通は PKGNAME_NOREV にもとづく) ディレクトリー名に設定することです。 これを設定すると、このパッケージの DISTFILESPATCHFILES はすべて、 distfiles ディレクトリー以下の、設定した名前のサブディレクトリーに置かれます。 (詳細は、Section 19.1.11, “既存パッケージ修正時に、バージョンを上げるにはどうするか”をご覧ください。) この問題がよく起きる場合は、ディレクトリー名に PKGNAME を使ったり (これにより nbX サフィックスが含まれる)、 ${PKGNAME_NOREV}-YYYYMMDD のように日付を付けたりすることができます。 設定後は、distinfo ファイルを作り直すのを忘れないでください。 このファイルでは、ファイル名のなかに DIST_SUBDIR パスが含まれているからです。 この変更によって、インストールされるパッケージが以前のものと異なるものになる場合は、 PKGREVISION も上げます。 さらに、パッケージの正当な作者にメールを出して、 リリース後に、ファイル名を変えずに distfile の内容を変えるのはよろしくないやり方だと伝えてください。

19.3. configure 相での問題を修正する

19.3.1. 共有ライブラリー - libtool

pkgsrcはさまざまな種類のマシンをサポートします。それらはa.outとELFのような 異なるオブジェクトフォーマットを使い、共有ライブラリー、ダイナミックローディ ングの有無すらも異なります。これに対応するためにコマンドそのもの、およびオ プションがコンパイラー、リンカーなどに渡される必要があります。すべてのマシ ンで正しく動作させることは非常にむずかしく、テストのためにすべてのマシンを 持っていない場合は特にそうでしょう。 devel/libtoolパッケージはこれを助けます。 devel/libtoolはプラットフォームによらずに、 ソースファイルから、静的、動的なライブラリー両方を構築する方法 を知っているからです。

以下に、libtoolをパッケージで使用するための7つの手順を記述します。

  1. USE_LIBTOOL=yesをパッケージのMakefileへ追加します。

  2. ライブラリーオブジェクトのために、${LIBTOOL} --mode=compile ${CC}${CC} に設定します。ライブラリーが、提供されたMakefileだけを使用して構築される のであれば、CCの定義にこれを追加するだけです。このコマンドひとつだけで、 PICと非PICのライブラリーオブジェクトを作成します。したがって、共有ライブ ラリーとそうでないライブラリーの構築規則を別々に記述する必要はありません。

  3. ライブラリーのリンクのためのarranlibld -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 ファイルだけを含めます。 これ以外のファイルは自動的に追加されます。

  4. 共有オブジェクト(.so)ファイル(すなわち、dlopen(3)でロードされるファイル であって、共有ライブラリーでは*ありません*)のリンク時には、ファイルにバー ジョンが加えられないようにするため、-module -avoid-versionを使ってくだ さい。

    PLISTファイルにはfoo.so の一覧が加わります。

  5. インストールするのライブラリーに依存するプログラムをリンクする時に、 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} -o someprog ../somelib/somelib.la
    	

    これで、ライブラリーを正しく扱う事ができます。

  6. ライブラリーをインストールするときに、install(1) あるいはcp(1)コマンドの前に ${LIBTOOL} --mode=installを書いて下さい。そしてライブラリーの名前を .laに変えてください。例えば、以下のように書く必要があります。

    ${LIBTOOL} --mode=install ${BSD_INSTALL_LIB} ${SOMELIB:.a=.la} ${PREFIX}/lib
    	

    これは、静的リンクのための.a、共有ライブラリー、必要なシンボリックリンク をインストールし、ldconfig(8)を実行します。

  7. PLISTには、 .la ファイルだけを含めます (これは、以前のものから変わった点です)。

19.3.2. すでにlibtoolをサポートしているGNUパッケージでlibtoolを使う

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)を依存ライブラリーと してインクルードする。このこと自体は、以下の二つのうちいずれかが行なわれ ている場合は、問題になりません。

    1. その共有オブジェクトが正しく命名されている。すなわち、 libfoo.laではなく libfoo.laとなっている。

    2. -dlopenオプションが実行形式のリンク時に使われている。

  • ルーチンの初期化を適切に呼ばずにlibltdlを使う。関数lt_dlinit()を呼んで、 マクロ LTDL_SET_PRELOADED_SYMBOLSを実行形式にインクルードするようにしましょ う。

19.3.3. GNU Autoconf/Automake

パッケージが、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を設定することができます。

19.4. プログラミング言語

19.4.1. C, C++ および Fortran

C, C++ および Fortran 言語用のコンパイラーは、 NetBSD の基本システムに附属しています。標準では、 pkgsrc はパッケージが C で書かれていると仮定し、それ以外のコンパイラーをすべて隠します (ラッパーの枠組による。Chapter 14, buildlink 方法論参照)。

パッケージがどの言語のコンパイラーを必要としているかを表すには、 USE_LANGUAGES 変数を設定します。使うことのできる値は、 現在のところ、c, c++, fortran (および、これらの任意の組合せ) です。標準では c になります。GNU の configure スクリプトを使うパッケージでは、 C++ で書かれているものであっても、通常は configure 相で C コンパイラーを必要とします。

19.4.2. Java

プログラムが Java で書かれている場合は、pkgsrc における Java の枠組を使います。パッケージは ../../mk/java-vm.mk をインクルードする必要があります。 この Makefile の断片は、以下の変数を用意してくれます。

  • USE_JAVA は、 JDK への依存性が追加されるかどうかを定義します。 USE_JAVArun に設定された場合は、 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 変数の定義が必要なプログラムでは、 この変数に適切な値を設定するために使うことができます。

19.4.3. perl スクリプトを含むパッケージ

perl スクリプトがパッケージに含まれる場合は、 USE_TOOLS 変数に perl を追加し、 適切なインタープリターへのパスが設定されるようにするために REPLACE_PERL を設定します。 REPLACE_PERL の値には、パスを調節する対象のスクリプトを WRKSRC からの相対位置として並べたリストを含めるようにします。 対象のスクリプト内に現れる */bin/perl はすべて、 perl の実行ファイルへのフルパスに置き換えられます。

特定のバージョンの perl が必要な場合は、 PERL5_REQD 変数をバージョン番号に設定します。 標準では 5.0 になります。

perl モジュールの扱いについては、 Section 19.6.6, “perl モジュールをインストールするパッケージ”をご覧ください。

19.4.4. 他のプログラミング言語

現在のところ、pkgsrc では、他のプログラミング言語に対する特別な扱いはありません。 その言語のコンパイラーのパッケージに buildlink3.mk ファイルがある場合は、 このファイルをインクルードします。このファイルがない場合は、 適切なコンパイラーのパッケージへの (構築時) 依存性を追加するだけです。

19.5. build 相での問題を修正する

パッケージ構築時に最もよくある障害は、 プラットフォームによっては必要なヘッダーファイル、関数やライブラリーがなかったり、 あるいは、ライブラリーで提供される関数がパッケージ作者の考えているものと違っていたりするものです。 そのようなことを回避するために、ほとんどの場合は、 ない関数を使わないようにしたり、代替の関数を提供したりするように ソースコードを書き換えることができます。

19.5.1. C および C++ のコードの条件つきコンパイル

パッケージに最初から GNU configure スクリプトが附属している場合は、 構築の障害の修正方法としては、コードを変更せずに configure スクリプトを変更するのが望ましい方法です。configure スクリプトが附属しない場合は、 コンパイル対象のオペレーティングシステムやハードウェアアーキテクチャーに応じて必要なマクロを定義している C プリプロセッサーを役立てることができます。このマクロは、たとえば #if defined(__i386) のようにして調べることができます。 ほとんどすべてのオペレーティングシステム、ハードウェアアーキテクチャー、 およびコンパイラーには、独自のマクロがあります。 たとえば、__GNUC__, __i386__, __NetBSD__ の各マクロがすべて定義されている場合は、i386 互換 CPU 上の NetBSD を使っていることと、 コンパイラーが GCC であることがわかります。

以下に列挙するハードウェアおよびオペレーティングシステム用のマクロは、 使っているコンパイラーに依存します。 たとえば、Solaris 上でコードを条件付きコンパイルしたい場合、 __sun__ は SunPro コンパイラーでは定義されていないので使ってはいけません。 かわりに __sun を使います。

19.5.1.1. オペレーティングシステムを特定するための C プリプロセッサーマクロ

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

19.5.1.2. ハードウェアアーキテクチャーを特定するための C プリプロセッサーマクロ

i386        i386, __i386, __i386__
MIPS        __mips
SPARC       sparc, __sparc

19.5.1.3. コンパイラーを特定するための C プリプロセッサーマクロ

GCC         __GNUC__ (メジャーバージョン), __GNUC_MINOR__
MIPSpro     _COMPILER_VERSION (MIPSpro 7.41 なら 0x741)
SunPro      __SUNPRO_C (Sun C 5.7 なら 0x570)
SunPro C++  __SUNPRO_CC (Sun C++ 5.8 なら 0x580)

19.5.2. コンパイラーのバグへの対処方法

ソースファイルのなかには、コンパイラーのバージョンとアーキテクチャーの組合 せによって、また、ほとんどの場合は、最適化を有効にしたことも関係して、コン パイラーのバグを発現させるものがあります。よくある症状は、gccの内部エラーや、 ファイルのコンパイルが完了しないというものです。

たいていは、回避策として、MACHINE_ARCH とコンパイラーのバージョンを確認し、 問題のあるファイル・MACHINE_ARCH・コンパイラーの組合せに対して最適化を無効に し、そのことをpkgsrc/doc/HACKSに文書化しておくことが必要となります。 このファイルに多くの例が載っているので、参照してください。

19.5.3. undefined reference to ...

このエラーメッセージは、しばしば、 パッケージが必要な共有ライブラリーにリンクしていないことを表します。 以下の関数は、このエラーメッセージを何度も出すことがわかっているものです。

関数 ライブラリー 影響のあるプラットフォーム
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

このようなリンカーのエラーの修正は、多くの場合、 パッケージの MakefileLIBS.OperatingSystem+= -lfoo を追加してから bmake clean; bmake を実行すれば十分です。

19.5.3.1. 特殊な問題: SunPro コンパイラー

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 が参照されますが、この参照は通常は解決することができません。 この問題を解決するため、 パッケージに関数のインライン化を無効化するよう指示してみることができます。

19.5.4. メモリーが不足する

時には、コンパイラーの実行でオペレーティングシステム固有のソフトリミットに達するために、 パッケージの構築に失敗することがあります。 UNLIMIT_RESOURCES 変数を設定して、 pkgsrc に資源の制限を解除するよう伝えることができます。 現在のところ、使うことのできる値は、 datasizestacksize (あるいは両方) です。 この変数を設定すると、シェル組み込みの ulimit コマンドを実行した場合と同様に、それぞれ、 データセグメントのサイズとスタックのサイズの上限を、 ハードリミットまで引き上げます。

19.6. install 相での問題を修正する

19.6.1. 必要なディレクトリーを作成する

一部のプラットフォームに附属する BSD 互換の install は、 一度に複数のディレクトリーを作成することができません。 このため、 ${INSTALL_*_DIR} を使うときは、以下のようにします。

${INSTALL_DATA_DIR} ${PREFIX}/dir1
${INSTALL_DATA_DIR} ${PREFIX}/dir2
    

こうするかわりに、単に dir1 dir2INSTALLATION_DIRS 変数に追加するという方法もあります。 こうすると、適切な処理が自動的におこなわれます。

19.6.2. ドキュメンテーションのインストール場所

一般的には、ドキュメンテーションは ${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 のほうが好ましいのですが。)

19.6.3. 最高得点ファイルをインストールする

パッケージによっては (ほとんどは games カテゴリーのもの)、 システム上の各ユーザーが最高得点を記録できるように、 得点ファイルをインストールします。これを実現するために、 バイナリーは setgid してインストールし、得点ファイルは グループとオーナーのいずれかまたは両方を当該グループやオーナー (伝統的には "games" ユーザーおよびグループ) の所有とする必要があります。 SETGIDGAME, GAMEDATAMODE, GAMEGRP, GAMEMODE, GAMEOWN の各変数でこの挙動を制御します。詳細は mk/defaults/mk.conf に書かれています。

なお、games に setgid されたインストールは、標準では有効になっていません。 SETGIDGAME=YES を設定すると、 これに応じて他の各変数が設定されます。

このため、パッケージではファイルの所有やアクセス許可属性を決してハードコードせずに、 INSTALL_GAME および INSTALL_GAME_DATA の設定に応じて適切に設定されるようにします。

19.6.4. パッケージを DESTDIR に対応させる

パッケージが 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 に対応させるようにしてください。

19.6.5. その他のインタープリターへのパスがハードコードされているパッケージ

パッケージには perl 以外のインタープリターへのパスがハードコードされていることもあります。 スクリプトのインタープリターへのフルパスを適切なものにするため、 当該パッケージの Makefile で、 以下のような定義をする必要があります (ここでは例として tclsh を使います)。

REPLACE_INTERPRETER+=   tcl
REPLACE.tcl.old=        .*/bin/tclsh
REPLACE.tcl.new=        ${PREFIX}/bin/tclsh
REPLACE_FILES.tcl=      # パスを修正する必要がある tcl スクリプトを列挙します
# REPLACE_PERL と同様に、${WRKSRC} からの相対位置とします
    

Note

2006 年 3 月より前は、この各変数は _REPLACE.* および _REPLACE_FILES.* という名前でした。

19.6.6. perl モジュールをインストールするパッケージ

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でもおこなわれます。

19.6.7. infoファイルをインストールするパッケージ

パッケージによっては、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コマンドが必要な場合は、 パッケージの MakefileTEXINFO_REQD 変数を必要な最低バージョンに設定します。 デフォルトでは、 3.12 が最低限必要なバージョンとなります。 makeinfo コマンドがシステムにないか、 最低限必要なバージョンを満たさない場合は、 devel/gtexinfo パッケージへの構築時の依存関係が自動的に追加されます。

パッケージで提供されるソフトウェアの構築やインストールの過程では、 install-info コマンドを使ってはいけません。 info ファイルの登録は INSTALL スクリプトの仕事であって、 適切な makeinfo コマンドを使う必要があるからです。

pkgsrc の基盤は、以上のことを実現するため、 PATH のはじめのほうにあるディレクトリーに、 install-infomakeinfo を上書きするスクリプトを作成します。

install-info を上書きするスクリプトは、メッセージを記録すること以外、 何の効果もありません。makeinfo を上書きするスクリプトは、 メッセージを記録し、TEXINFO_REQD の値に従って、適切な makeinfo コマンドを実行するか、 または異常終了します。

19.6.8. マニュアルページをインストールするパッケージ

マニュアルページをインストールするパッケージはすべて、 マニュアルページを同じディレクトリー内にインストールして、 マニュアルページを共通のひとつの場所から探せるようにします。 pkgsrc では、この場所は ${PREFIX}/${PKGMANDIR} であり、パッケージ内ではこの表記を使うようにします。 PKGMANDIR の値は標準では man です。これ以外によく使われる値は、 share/man です。

Note

PKGMANDIR の独自設定には、 完全には対応していません。

PLIST ファイル内では、 マニュアルページのファイルの最上層ディレクトリーを、 単に man/ と書くことができます。 これは pkgsrc の枠組みが必要に応じて変換してくれます。 これ以外の場所の場合は、正確な PKGMANDIR を使って書く必要があります。

GNU_CONFIGUREyes に設定されているパッケージでは、 標準では ./configure --mandir スイッチを使って、マニュアルページをどこにインストールするかを設定します。 このパスは GNU_CONFIGURE_MANDIR で、 標準では ${PREFIX}/${PKGMANDIR} になります。

パッケージが GNU_CONFIGURE を使うが、 --mandir は使わない場合は、CONFIGURE_HAS_MANDIRno に設定することができます、 また、./configure スクリプトが標準的ではない --mandir の使い方をする場合は、 必要に応じて GNU_CONFIGURE_MANDIR を設定することができます。

圧縮したマニュアルページのインストールに関する情報は、 Section 13.5, “マニュアルページの圧縮” をご覧ください。

19.6.9. GConf のデータファイルをインストールするパッケージ

パッケージが、 GConf が使用する .schemas または .entries ファイルをインストールする場合は、 これらが確実にデータベースに登録されるようにするために、 いくつか特別な手順を踏む必要があります。

  1. GConf の buildlink3.mk ファイルではなく ../../devel/GConf/schemas.mk をインクルードします。 こうすると、インストールおよびアンインストール時に、 GConf のデータベースを再構築し、また、GConf のデータファイルのインストール場所を 標準的な configure 引数を使ってパッケージに伝えてくれます。 また、パッケージがデータベースに直接アクセスすることが一切できなくなります。

  2. パッケージが .schemas ファイルを必ず ${PREFIX}/share/gconf/schemas 以下にインストールするようにします。 ${PREFIX}/etc 以下にインストールするようになっている場合は、 手作業でパッケージを修正する必要があります。

  3. PLIST を確認し、etc/gconf ディレクトリー以下の項目をすべて削除します。 これらは自動的に処理されるものだからです。詳細は Section 9.13, “設定ファイルの置き場所を変更する方法は?”を参照してください。

  4. Makefile で、 GCONF_SCHEMAS 変数を定義します。変数値には パッケージがインストールする .schemas ファイルをすべて列挙します。このファイル名にディレクトリーを含めてはいけません。

  5. Makefile で、 GCONF_ENTRIES 変数を定義します。変数値には パッケージがインストールする .entries ファイルをすべて列挙します。 このファイル名にディレクトリーを含めてはいけません。

19.6.10. scrollkeeper/rarian のデータファイルをインストールするパッケージ

パッケージが、 scrollkeeper/rarian が使用する .omf ファイルをインストールする場合は、これらが確実にデータベースに登録されるようにするために、 いくつか特別な手順を踏む必要があります。

  1. rarian の buildlink3.mk ファイルではなく ../../mk/omf-scrollkeeper.mk をインクルードします。 こうすると、インストールおよびアンインストール時に、 scrollkeeper のデータベースを再構築してくれます。 また、パッケージがデータベースに直接アクセスすることが一切できなくなります。

  2. PLIST を確認し、libdata/scrollkeeper ディレクトリー以下の項目をすべて削除します。 これらは自動的に処理されるものだからです。

  3. PLIST から share/omf ディレクトリーを削除します。 これは rarian が処理します。(make print-PLIST で自動でおこなえます。)

19.6.11. X11 のフォントをインストールするパッケージ

パッケージがフォントファイルをインストールする場合は、 インストール時とアンインストール時に、 フォントのインストール先ディレクトリーにあるフォントデータベースを再構築する必要があります。 この処理は pkginstall の枠組を使って自動的におこなうことができます。

フォントのインストール先ディレクトリーを FONTS_DIRS.type 変数に列挙することができます。変数名中の type は、 ttf, type1, x11 のいずれかです。 また、データベースファイル fonts.dir は PLIST に含めてはいけません。

なお、フォント用のディレクトリーを新たに作らないようにしてください。 X サーバーがフォントを見つけるための設定をユーザーが手動でおこなう必要がないようにするため、 新しいディレクトリーではなく標準的なディレクトリーを使うようにします。

19.6.12. GTK2 のモジュールをインストールするパッケージ

パッケージが GTK2 の IM モジュールやローダーをインストールする場合は、 これらが確実に GTK2 のデータベースに登録されるようにするために、 いくつか特別な手順を踏む必要があります。

  1. gtk2 の buildlink3.mk ファイルではなく ../../x11/gtk2/modules.mk をインクルードします。 こうすると、インストールおよびアンインストール時に、GTK2 のデータベースを再構築してくれます。

  2. GTK2 の IM モジュールをインストールするパッケージでは、 GTK2_IMMODULES=YES を設定します。

  3. GTK2 のローダーをインストールするパッケージでは、 GTK2_LOADERS=YES を設定します。

  4. パッケージが GTK2 のデータベースディレクトリーを直接いじらないよう修正します。 データベースは以下のとおりです。

    • libdata/gtk-2.0/gdk-pixbuf.loaders

    • libdata/gtk-2.0/gtk.immodules

  5. PLIST を確認し、libdata/gtk-2.0 ディレクトリー以下の項目をすべて削除します。 これらは自動的に処理されるものだからです。

19.6.13. SGML または XML のデータをインストールするパッケージ

パッケージが、システム全体で使われるカタログへ登録する必要のある SGML または XML のデータファイル (DTD, sub-catalog など) をインストールする場合は、 いくつか特別な手順を踏む必要があります。

  1. パッケージの Makefile../../textproc/xmlcatmgr/catalogs.mk をインクルードします。 こうすると、インストールおよびアンインストール時に、 データファイルをシステム全体で使われるカタログに登録してくれます。

  2. SGML_CATALOGS を、このパッケージがインストールする SGML カタログをすべてをフルパス表記にしたものに設定します。

  3. XML_CATALOGS を、このパッケージがインストールする XML カタログをすべてをフルパス表記にしたものに設定します。

  4. SGML_ENTRIES を、SGML カタログに追加する 個々のエントリーに設定します。各エントリーは 3 個の文字列からなります。書き方の詳細は xmlcatmgr(1) (特に、'add' アクション用の引数) を参照してください。 なお、通常はこの変数を使うことはありません。

  5. XML_ENTRIES を、XML カタログに追加する 個々のエントリーに設定します。各エントリーは 3 個の文字列からなります。書き方の詳細は xmlcatmgr(1) (特に、'add' アクション用の引数) を参照してください。 なお、通常はこの変数を使うことはありません。

19.6.14. MIME データベースの拡張をインストールするパッケージ

パッケージが、.xml ファイルを ${PREFIX}/share/mime/packages 以下にインストールすることで MIME データベースを拡張する場合は、 データベースがこの新規ファイルについて確実に整合性を持つようにするために、 いくつか特別な手順を踏む必要があります。

  1. ../../databases/shared-mime-info/mimedb.mk をインクルードします (同じディレクトリーにある buildlink3.mk ファイルは、他の buildlink3.mk ファイルでインクルードするために予約されているので使いません) こうすると、インストールおよびアンインストール時に、MIME データベースを再構築してくれます。 また、パッケージがデータベースに直接アクセスすることが一切できなくなります。

  2. PLIST を確認し、share/mime ディレクトリー以下の項目のうち、 share/mime/packages 以下に置かれるファイル 以外のものをすべて削除します。 このディレクトリーについては update-mime-database プログラムが自動的に処理しますが、 除外したファイルはパッケージ依存のファイルなので、 ファイルをインストールしたパッケージが自分で削除する必要があります。

  3. PLIST から share/mime/* ディレクトリーをすべて削除します。 これらは shared-mime-info プログラムが処理します。

19.6.15. intltool を使うパッケージ

パッケージが構築時に intltool を使う場合は、 intltoolUSE_TOOLS に追加します。 こうすると、パッケージの配布ファイルに附属する intltool ではなく、 pkgsrc の intltool を強制的に使うようになります。

この仕組みは、intltool 構築時の依存関係を追跡して、 利用可能な最新版を使います。この方法を使うことで、 リリース後にできたバグ修正も適用することができます。

19.6.16. 起動スクリプトをインストールするパッケージ

パッケージに rc.d スクリプトが附属する場合、このスクリプトは、 標準では起動ディレクトリーにコピーされませんが、 mk.conf にオプション PKG_RCD_SCRIPTS=YES を追加指定すると、 パッケージのインストール時に、スクリプトが /etc/rc.d 以下にコピーされます。 また、パッケージのアンインストール時には、 自動的にスクリプトが削除されます。

19.6.17. TeX モジュールをインストールするパッケージ

パッケージが、TeX パッケージを texmf ツリーにインストールする場合は、 texmf ツリーの ls-R データベースを更新する必要があります。

Note

kpathsea のような主たる TeX パッケージ以外のパッケージは、 ${PREFIX}/share/texmf ではなく ${PREFIX}/share/texmf-dist 内にファイルをインストールするようにします。

  1. ../../print/kpathsea/texmf.mk をインクルードします。こうすると、インストール時とアンインストール時に ls-R を再構築してくれます。

  2. パッケージが ${PREFIX}/share/texmf-dist の texmf ツリー以外の texmf ツリーにファイルをインストールする場合は、 TEX_TEXMF_DIRS を、データベースの更新が必要となる texmf ツリーをすべて並べたリストに設定します。

    パッケージが、updmap を使って登録する必要があるフォントマップファイルもインストールする場合は、 ../../print/texlive-tetex/map.mk をインクルードしたうえで、 TEX_MAP_FILESTEX_MIXEDMAP_FILES のいずれかまたは両方を、 そのようなフォントマップファイルをすべて並べたリストに設定します。 こうすると、インストール時とアンインストール時に updmap が自動的に実行され、 TeX 出力ドライバー用のフォントマップファイルの有効化や無効化をしてくれます。

  3. PLIST には ls-R データベースは一切含めないようにします。 このデータベースは teTeX-bin パッケージによってのみ削除されるものだからです。

19.6.18. エミュレーションによるバイナリーの実行に対応したパッケージ

パッケージのなかには、あるオペレーティングシステム用のバイナリーを (エミュレーションに対応した) 別のオペレーティングシステム上で実行するための、 ライブラリーや実行ファイルを提供するものがあります。 例としては、NetBSD 上で Linux のバイナリーを実行するものがあげられます。

pkgtools/rpm2pkg は、Linux の rpm パッケージの展開やパッケージ化を補助するものです。

CHECK_SHLIBS を no に設定して、 インストールされた実行ファイル用のライブラリーを動的リンカーがすべて見つけられることを検査する check-shlibs ターゲットを抑止することができます。 この検査では標準の動的リンカーを実行するので、 エミュレーションパッケージに対しては検査が失敗します。 エミュレーションで使われるライブラリーは、 標準のディレクトリーには置かれていないからです。

19.6.19. ハイカラーテーマのアイコンをインストールするパッケージ

パッケージが、 share/icons/hicolor 以下に画像をインストールするか share/icons/hicolor/icon-theme.cache データベースを更新するかあるいはその両方をおこなう場合は、 テーマ用の共有ディレクトリーを適切に扱い、キャッシュデータベースを確実に再構築するために、 以下の手順を踏む必要があります。

  1. ../../graphics/hicolor-icon-theme/buildlink3.mk をインクルードします。

  2. PLIST を確認し、 テーマのキャッシュを参照するエントリーを削除します。

  3. PLIST が share/icons/hicolor 階層からアイコン用の共有ディレクトリーを削除しないようにします。 これは自動的に処理されるものだからです。

後の 2 点について、 PLIST がこれらを守っていることを確認する最良の方法は、 make print-PLIST を使って作り直すことです。

19.6.20. デスクトップファイルをインストールするパッケージ

パッケージが、.desktop ファイルを share/applications 以下にインストールし、そのファイルに MIME 情報が含まれている場合は、それらが MIME データベースに確実に登録されるようにするために、 以下の手順を踏む必要があります。

  1. ../../sysutils/desktop-file-utils/desktopdb.mk をインクルードします。

  2. PLIST を確認し、 share/applications/mimeinfo.cache ファイルを参照するエントリーを削除します。 これは自動的に処理されるものだからです。

最後の点について、 PLIST がこれらを守っていることを確認する最良の方法は、make print-PLIST を使って作り直すことです。

19.7. パッケージに問題があるという印をつける

場合によっては、パッケージの問題をすぐに解決できないことがあります。 この場合、パッケージが壊れていることを表すだけの目印をつけることができます。 これをおこなうには、BROKEN 変数を、 (RESTRICTED 変数と同様に) パッケージが壊れている理由に設定するだけです。 利用者がパッケージを構築しようとすると、 パッケージはその場でこのメッセージを表示して、 構築をしないようになります。

BROKEN となったパッケージは、 不定期的に pkgsrc から削除されます。