Chapter 10. 新しいパッケージを一から作る

Table of Contents

10.1. ありがちな種類のパッケージ
10.1.1. Perl モジュール
10.1.2. KDE アプリケーション
10.1.3. Python モジュールおよびプログラム
10.2. 例
10.2.1. www/nvu パッケージはいかに pkgsrc に追加されたか

あなたが pkgsrc にまだ入っていないパッケージを見つけた場合、 たいていはソースコードをどの URL からダウンロードできるかわかっているでしょう。 この URL をもとにして、 いくつかの段階を踏むだけでパッケージを作成することができます。

  1. 最初に、pkgtools/url2pkg および pkgtools/pkglint の両パッケージをインストールします。

  2. 次に、そのパッケージの属するカテゴリーとして、 最上層のディレクトリーをひとつ選びます。既存のもののかわりに、 専用のディレクトリー (local など) を作ってもかまいません。 このカテゴリーのディレクトリーの下に、パッケージ用にもうひとつディレクトリーを作り、 その中に移動します。

  3. プログラム url2pkg を実行します。 実行すると URL をたずねてきます。配布ファイル (たいていは .tar.gz ファイルです)の URL を入力して、 パッケージの基本的な要素が自動的に作られてゆくようすを観察します。 配布ファイルは自動的に展開され、 Makefile の詳しい内容の一部を自動的に書いてくれますが、 残りは手動でやる必要があるでしょう。

  4. パッケージの依存性を判断するため、展開されたファイルを調べます。 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"
    
  5. パッケージを使い物にするにはあと何をする必要があるかを確認するため、 pkglint を実行します。 pkglint のメッセージの意味がわからない場合は、 追加説明を出力してくれる pkglint --explain または pkglint -e を試してみてください。

  6. 多くの場合、パッケージはまだ構築できるようにはなっていません。 もっともありがちな場合については、次の節Section 10.1, “ありがちな種類のパッケージ”で説明しています。この説明に従えば、 おそらく先に進めるでしょう。

  7. bmake clean を実行して、 作業ディレクトリーから展開されたファイルを掃除します。 作業ディレクトリーには、展開されたファイルのほかにも、 キャッシュファイルその他のシステム情報が置かれており、 これらが残っていると Makefile 編集後に悪影響のあることがあります。

  8. ここで、bmake を実行してパッケージを構築します。 この段階では、さまざまな要因により構築がうまくいかないことがありますので、Chapter 19, パッケージを動くようにするを調べてください。

  9. パッケージがうまく構築できた場合、次にすることは、 パッケージのインストールです。bmake install を実行して、うまくいくようお祈りします。

  10. ここに至るまで、パッケージがインストールしたファイルの一覧を内容にもつ PLIST ファイルの内容は、 ほとんど空でした。bmake print-PLIST >PLIST を実行して、おそらく正しいであろう一覧を作成します。 作成したファイルを、お好きなテキストエディターを使って、 ファイルの一覧がそれらしいものになっているか確認します。

  11. 再度 pkglint を実行して、 作成した PLIST に余計なものが含まれていないか調べます。

  12. さきほど bmake install を実行した時に、 インストールされたファイルのデータベースにこのパッケージが登録されましたが、 ファイルの一覧は空のものが登録されています。これを修正するため、 bmake deinstall を実行してから bmake install を再度実行します。これで、このパッケージは PLIST のファイルの一覧とともに登録されます。

  13. bmake package を実行して、 インストールされたファイル一式からバイナリーパッケージを作成します。

10.1. ありがちな種類のパッケージ

10.1.1. Perl モジュール

簡単な Perl モジュールは、url2pkg を使って、依存性も含めて自動的に処理することができます。

10.1.2. KDE アプリケーション

KDE アプリケーションは、かならず meta-pkgs/kde3/kde3.mk をインクルードしてください。 これには、KDE パッケージでよくある設定が多数含まれています。

10.1.3. Python モジュールおよびプログラム

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

10.2. 例

10.2.1. www/nvu パッケージはいかに pkgsrc に追加されたか

10.2.1.1. 作り始めのパッケージ

私は 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 :-)

10.2.1.2. パッケージを機能するようにするための多くの問題を修正する

これで、パッケージが展開されたので、その内容を見ていきましょう。 このパッケージには 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.
[...]

そこで、gmakeUSE_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/gtk2x11/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 ディレクトリーにコピーします。 そして、はじめからやり直し、パッチをきれいに適用できるよう修正して、 またやり直します。これで、すべてうまくいきました。

10.2.1.3. パッケージをインストールする

$ bmake CHECK_FILES=no install
[...]
$ bmake print-PLIST >PLIST
$ bmake deinstall
$ bmake install