プログラムのメインディレクトリ (「gentoo-0.9.12」) の中に、 「debian」という名前の新しいディレクトリが作られています。 このディレクトリ内には様々なファイルが納められていますが、 パッケージの動作をカスタマイズするために、これらのファイルを これから編集していきます。 最も重要なファイルは「control」、「changelog」、「copyright」、 そして「rules」であり、これらのファイルはすべてのパッケージが 必ず用意しなければならないものです。
このファイルには dpkg と dselect がパッケージを管理するために 利用する様々な情報が納められています。 以下は dh_make が作ってくれる control ファイルのひな型です。
1 Source: gentoo 2 Section: unknown 3 Priority: optional 4 Maintainer: Josip Rodin <jrodin@jagor.srce.hr> 5 Standards-Version: 3.0.1 6 7 Package: gentoo 8 Architecture: any 9 Depends: ${shlibs:Depends} 10 Description: <insert up to 60 chars description> 11 <insert long description, indented with spaces>
(行番号は筆者が書き加えました)
1-5 行目はソースパッケージの管理情報です。1行目はソースパッケージの 名前です。
2 行目はディストリビューションにおいてこのパッケージが所属する セクションです。 既にお気づきかも知れませんが、Debian はいくつかのセクションに 分割されています。セクションには main (完全にフリーなソフトウェア)、 non-free (実際の所フリーであるとはいえないソフトウェア)、そして contrib (それ自身はフリーなソフトウェアであるけれども、non-free な ソフトウェアが無ければ使えないもの) があります。 更に、これらの下にはどんなパッケージが含まれているのか簡単に説明する ような名前の付いた、論理的なサブセクションがいくつか 存在しています。 つまり、管理者専用のプログラムのために「admin」、基本的なツールの ために「base」、プログラマーのためのツールが含まれる「devel」、文書の 「doc」、ライブラリの「libs」、電子メールを読み書きするための リーダやデーモンのための「mail」、ネットワーク関係のアプリケーション やデーモンの「net」、X11 用のプログラムのための「x11」など、そして さらに多くのものが用意されています。
ここでは x11 に変更しておきましょう。
3行目はこのパッケージがこのパッケージをインストールする ユーザにとってどれくらい重要なものかを示しています。 セクション(Section) と優先度 (Priority) は、実際には dselect が パッケージをソートするときとデフォルトを選ぶときにしか 使われません。そしてこれらのフィールドは (よくあることですが) 我々の FTP メンテナたちによって上書きされることが あります。 これらのフィールドに何を設定すべきかについては、ポリシーマニュアル の説明を読んでください。
この gentoo は通常の優先度を持つパッケージなので、 ここでは optional のままにしておきましょう。
4 行目はメンテナの名前と電子メールアドレスです。
5 行目はこのパッケージが準拠している Debian ポリシー基準の バージョン (インストールされている debian-policy パッケージの 2 つのメジャーバージョン) です。
もしパッケージを生成するために標準的でないコンパイラ、または その他のツールが必要なら、ここ (5 行目と 6 行目(空行) の間) に 「Build-Depends」行を追加して、必要なパッケージをそこに記載して おきましょう。これについての詳細は、パッケージングマニュアル (8.7 節) および「build-essential」パッケージの附属文書を参照して ください。
7 行目はバイナリパッケージの名前です。
8 行目にはバイナリパッケージをコンパイル可能な CPU アーキテクチャ
を記述します。 ここを「any」のままにしておけば、
dpkg-gencontrol(1)
が、このパッケージを
コンパイルしたマシンに合わせて適当に埋めてくれます。
(パッケージのポーティングについては、開発者レファレンスを参照して ください。)
あなたのパッケージが特定のアーキテクチャに依存しないのであれば
(例えば、シェルや Perl のスクリプトであるとか、あるいは
文書のパッケージである場合) ここを「all」に変更し、パッケージの
生成に「binary-arch」ではなく「binary-indep」を使う方法について の説明をあとで
「rules」ファイル, Section 4.4
の項で読んでおいてください。
9 行目は Debian パッケージ管理システムの最も強力な機能のひとつ を示しています。 それぞれのパッケージは様々な形で相互に関係情報を持つことができます。 パッケージ間の関係には、Depends: すなわち「依存」の他に、Recommends:、 Suggests:、Pre-depends:、Conflicts:、Provides:、Replaces: が あります。
dpkg、dselect、APT (そしてそのフロントエンド) などの
パッケージ管理ツールは、通常これらの関係を処理する場合に、 同じ動作をします。
そうでない場合については、追々説明していきます。 (dpkg(8)
、
dselect(8)
、 apt(8)
、 console-apt(8)
、
gnome-apt(8)
を参照してください)。
以下にこれらの依存関係が通常持つ意味を説明します。
パッケージはここで指定したパッケージをインストールしない限り インストールされません。 あなたのプログラムが特定のパッケージに依存していて、そのパッケージが 存在しない限り全く動作しない (または非常に重大な問題が発生する) 場合には、これを使いましょう。
dselect はここで指定されたパッケージがインストールされていない限り あなたのパッケージをインストールしません。 dpkg と APT の場合には、無視してインストールすることが可能です。 厳密に言えばあなたのプログラムの動作に必須ではないけれど、 一緒に使うことがほぼ前提となっているようなパッケージは ここで指定しましょう。
dselect はあなたのプログラムをインストールする際に、 ここで指定したパッケージをインストールするかどうかユーザに質問します。 dpkg と APT はこの指定を無視します。 必要というわけではないが、あなたのプログラムと一緒に使うと 便利というパッケージについては、ここで指定しておきましょう。
これは Depends: よりも強い関係を示します。 ここで指定されたパッケージがあらかじめインストールされ、かつ 適切に設定されていない限り、あなたのパッケージは インストールされません。 これを使う前に、まずは debian-devel メーリングリストで 相談しましょう。できるだけ使わないようにしましょう。 早い話が、使っちゃいけません。:-)
ここで指定されたすべてのパッケージが削除されない限り、 あなたのパッケージはインストールされません。特定のパッケージが 存在しているとあなたのプログラムが動作しない (または非常に重大な 問題が起きる) 場合には、これを使います。
ほぼ同じ機能を持つパッケージが複数あって、選択の余地があるような 場合のために仮想パッケージ名というものが定義されています。 仮想パッケージ名の一覧は、ファイル /usr/share/doc/debian-policy/virtual-package-names-list.text.gz にあります。 あなたのプログラムが既存の仮想パッケージに相当する機能を 提供する場合には、これを使います。
あなたのプログラムが他のパッケージに含まれるファイルを 上書きする場合、または他のパッケージ全体を完全に置き換えて しまう場合 (この場合は Conflicts: も一緒に指定してください) には、 これを使います。 指定されたパッケージに含まれる (上書き対象の) ファイルは、 あなたのプログラムをインストールする前に削除されます。
これらのフィールドはすべて共通の書式で記述します。 指定したいパッケージ名をコンマで区切って並べてください。 もしいくつか選択肢があれば、それらのパッケージ名を 縦棒 | (パイプ記号)で区切って並べてください。 あるバージョンより上でなければダメ、などというようにパッケージの バージョン番号によって制限を加えることも可能です。 これを指定したい場合にはそれぞれのパッケージ名の後で丸カッコ(パーレン) を開き、以下の関係式に続けてバージョン番号を指定してください。 使用できる関係式は <<、<=、=、>=、 >>で、それぞれ 「指定されたものより古いバージョンのみ」、 「指定されたもの以前か指定のバージョン」、 「指定のバージョンのみ」 「指定されたもの以降か指定のバージョン」、 「指定されたものより新しいバージョンのみ」 を意味します。
最後に、知っておかなければいけない機能をもうひとつ。 それは $(shlibs:Depends)
で、例えば libc6 や xlib6g のような
あなたのプログラムが利用している共有ライブラリの名前すべてが
dh_shlibdeps(1)
によって自動的に 調べられ、その結果は
dh_gencontrol(1)
によってこの記述と 置換されます。
これを使えば、あなた自身が自分で共有ライブラリを調べて記述する
必要はありません。 以上の説明から、今回は 9
行目をそのままにしておくことができます。
ここで 10 行目に gentoo が「提案」するパッケージの一覧を 追加します。 gentoo は「file」プログラム/パッケージによって提供される機能をいくつか 利用することができるので、ここではそれだけを記載しておきましょう。
11 行目はこのパッケージに関する簡潔な説明です。多くの人々は 一行半角 80 文字幅のスクリーンでこれを見ますから、 半角 60 文字以上にしてはいけません。 今回は「A fully GUI configurable GTK+ file manager」としました。
12 行目はこのパッケージに関する詳細な説明文です。 ここでは一つの段落でパッケージについてより詳しく説明するように してください。それぞれの行は空白で始めなければいけません。 また空白行を入れてはいけませんが、先頭の空白の後に . (半角ピリオド) を書くことで、それらしく見せることができます。 また、説明文の後に空白行があってはいけません。
以下が修正後の control ファイルです。
1 Source: gentoo 2 Section: x11 3 Priority: optional 4 Maintainer: Josip Rodin <jrodin@jagor.srce.hr> 5 Standards-Version: 3.0.1 6 7 Package: gentoo 8 Architecture: any 9 Depends: ${shlibs:Depends} 10 Suggests: file 11 Description: A fully GUI configurable GTK+ file manager 12 gentoo is a file manager for Linux written from scratch in pure C. It 13 uses the GTK+ toolkit for all of its interface needs. gentoo provides 14 100% GUI configurability; no need to edit config files by hand and re- 15 start the program. gentoo supports identifying the type of various 16 files (using extension, regular expressions, or the 'file' command), 17 and can display files of different types with different colors and icons. 18 . 19 gentoo borrows some of its look and feel from the classic Amiga file 20 manager "Directory OPUS" (written by Jonathan Potter).
このファイルにはパッケージの上流 (upstream) に関する リソース (URI など)、著作権、およびライセンスなどの情報を記載します。 このファイルの書式はポリシーに規定されていませんが、内容については (6.5 節に) 規定されています。 dh_make はデフォルトとして以下のようなひな型を作成します。
1 This package was debianized by Josip Rodin jrodin@jagor.srce.hr on 2 Wed, 11 Nov 1998 21:02:14 +0100. 3 4 It was downloaded from <fill in ftp site> 5 6 Upstream Author(s): <put author(s) name and email here> 7 8 Copyright: 9 10 <Must follow here>
(行番号は筆者が書き加えました)
ここでファイルに追加すべき重要なことは、あなたがこのソフトウェアを 入手した場所と、実際に有効な著作権表示およびライセンスです。 原則としてライセンスは全文を含めなければなりません。 ただし、もしプログラムのライセンスが GNU GPL または LGPL、BSD、 あるいは Artistic などの良く知られたフリーソフトウェアのライセンス であって、どの Debian システムにも存在するディレクトリ /usr/share/common-licenses/ の中の適切なファイルを参照することで ライセンスの内容をすべて示すことができる場合に限って、 全文をここに引用する必要はありません。 gentoo は GNU 一般使用許諾 (GPL) に従って配布されていますから、 こんな風に変更しましょう。
1 This package was debianized by Josip Rodin jrodin@jagor.srce.hr on 2 Wed, 11 Nov 1998 21:02:14 +0100. 3 4 It was downloaded from http://www.obsession.se/gentoo/ 5 6 Upstream Author(s): Emil Brink <emil@obsession.se> 7 8 This software is copyright (c) 1998-99 by Emil Brink, Obsession 9 Development. 10 11 You are free to distribute this software under the terms of 12 the GNU General Public License. 13 On Debian systems, the complete text of the GNU General Public 14 License can be found in /usr/share/common-licenses/GPL file.
(行番号は筆者が書き加えました)
これは必須のファイルです。パッケージングマニュアル (3.2.3 節) にはこのファイルのための特別な書式が規定されています。 この書式は dpkg やその他のプログラムによってあなたのプログラムの バージョン番号、レビジョン、ディストリビューション、それに緊急度 (urgency) を識別するために利用されます。
あなたが行なったすべての変更をきちんと記載しておくことは 良いことであり、その意味でこのファイルはまた、パッケージメンテナ であるあなたにとっても重要なものです。 あなたのパッケージをダウンロードした人々は、 このファイルを見ることで、ユーザが最初に知っておくべき このパッケージに関する解決されていない問題があるかどうかを 知ることができます。 このファイルはバイナリパッケージ中に 「/usr/share/doc/gentoo/changelog.Debian.gz」として保存されます。
dh_make がデフォルトとして生成する changelog はこんな感じです。
1 gentoo (0.9.12-1) unstable; urgency=low 2 3 * Initial Release. 4 5 -- Josip Rodin <jrodin@jagor.srce.hr> Wed, 11 Nov 1998 21:02:14 +0100 6 7 Local variables: 8 mode: debian-changelog 9 End:
(行番号は筆者が書き加えました)
1 行目はパッケージ名、バージョン、ディストリビューション、 そして緊急度 (urgency) です。 ここに書くパッケージ名はソースパッケージの名前と一致していなければ なりません。 またディストリビューションは (今の時点では) 「unstable」または 「experimental」のどちらかにすべきであり、緊急度は「low」より 高いものに変更するべきではありません :-)
3-5 行目はログエントリで、ここにこのリビジョンのパッケージで
行われた変更を記述します (上流プログラムそのものの変更点では ありません -
その目的のためには、上流作者によって作成され、
/usr/share/doc/gentoo/changelog.gz としてインストールされる
専用のファイルが存在しています)。
新しい行はアスタリスク(「*」)で始まる最初の行の直前に挿入します。 この操作は
dch(1)
、や emacs(1)
(7-10 行目は Emacs
エディタ用のモード情報です) を使うと
便利ですが、その他の普通のテキストエディタを使って実行しても
もちろん構いません。 最終的にこんな風になればよいわけです。
1 gentoo (0.9.12-1) unstable; urgency=low 2 3 * Initial Release. 4 * This is my first Debian package. 5 * Adjusted the Makefile to fix $DESTDIR problems. 6 7 -- Josip Rodin <jrodin@jagor.srce.hr> Wed, 11 Nov 1998 21:02:14 +0100 8 9 Local variables: 10 mode: debian-changelog 11 End:
(行番号は筆者が書き加えました)
パッケージの新バージョンをリリースする際には、バージョン番号を 増やさなければいけません。 これは単に「dch -i」を実行するか、あるいは 「dch -v <version>-<revision>」によって明示的に バージョン番号を指定して、その後で好みのエディタを使って 必要なコメントを記載していきます。 ヒント: 規定の書式で日時を入力する簡単な方法。 「822-date」または「date -R」を使いましょう。
新バージョンについての情報は changelog ファイルの先頭に追加されます。 作業後 changelog はこんな風になります。
1 gentoo (0.9.12-2) unstable; urgency=low 2 3 * Fixed a glitch in the menu file. 4 5 -- Josip Rodin <jrodin@jagor.srce.hr> Wed, 11 Nov 1998 22:15:39 +0100 6 7 gentoo (0.9.12-1) unstable; urgency=low 8 9 * Initial Release. 10 * This is my first Debian package. 11 * Adjusted the Makefile to fix $DESTDIR problems. 12 13 -- Josip Rodin <jrodin@jagor.srce.hr> Wed, 11 Nov 1998 21:02:14 +0100 14 15 Local variables: 16 mode: debian-changelog 17 End:
(行番号は筆者が書き加えました)
あとから パッケージの更新, Section 6.4 の中で新しいパッケージの バージョンとレビジョンについてもっと詳しく説明します。
さて、今度は dpkg-buildpackage(1)
が
実際にパッケージを作成するために使う「rules」ファイルを 調べる必要があります。
このファイルは「make -f」で実行されるため、実はもう一つの Makefile
といったものですが、上流ソースに含まれる Makefile とは 違います。
すべての「rules」ファイルは、他の Makefile と同じく、ソースから プログラムを構築する方法を記述したいくつかのルールによって 構成されています。 それぞれのルールはいくつかのターゲット、ファイル名、 あるいは実行されるべき動作の名前(つまり「build:」や「install:」) によって構成されます。 実行したいルールは、コマンドライン引数として指定します (例えば「./debian/rules build」または「make -f rules install」と いうように)。ターゲット名の後には、依存関係、そのルールが 依存しているプログラムやファイルの名前を指定できます。 この後には、いくらでもコマンドを記述できます (各行を <タブ>で始めてください!) 空行があると、そこで一つのルールが終り、次のルールが 始まります。複数の空行、および「#」 (ハッシュ) で始まる行は 行の終りまでコメントと見なされ、無視されます。
以上を読んでもわけが分からないかもしれませんが、dh_make が デフォルトとして作成する「rules」ファイルを実際に読んでみると、 理解できるようになるでしょう。 また、info コマンドの「make」エントリーに、より詳細な説明が あるので、読んでおくと良いでしょう。
dh_make によって作成された rules ファイルについて知っておくべき 最も重要なことは、これが単なる提案であり、サンプルに過ぎない、と いうことです。 単純なパッケージに対してはこのままでも使えるでしょうけれど、 もっと複雑なパッケージの場合には、必要に応じて追加したり 省略したりすることをためらってはいけません。 あなたが変えてはいけないのはたった一つ、rules ファイル内に 記述された各ルールの名前だけです。 すべてのツールがパッケージングマニュアルに規定されたように これらの名前を参照するので、ルールの名前を変更してしまうと うまくパッケージを生成できなくなってしまいます。
1 #!/usr/bin/make -f 2 # Made with the aid of dh_make, by Craig Small 3 # Sample debian/rules that uses debhelper. GNU copyright 1997 by Joey Hess. 4 # Some lines taken from debmake, by Christoph Lameter. 5 6 # Uncomment this to turn on verbose mode. 7 #export DH_VERBOSE=1 8 9 # This is the debhelper compatability version to use. 10 export DH_COMPAT=1 11 12 build: build-stamp 13 build-stamp: 14 dh_testdir 15 16 # Add here commands to compile the package. 17 $(MAKE) 18 19 touch build-stamp 20 21 clean: 22 dh_testdir 23 dh_testroot 24 rm -f build-stamp 25 26 # Add here commands to clean up after the build process. 27 -$(MAKE) clean 28 29 dh_clean 30 31 install: build-stamp 32 dh_testdir 33 dh_testroot 34 dh_clean -k 35 dh_installdirs 36 37 # Add here commands to install the package into debian/tmp. 38 $(MAKE) install DESTDIR=`pwd`/debian/tmp 39 40 # Build architecture-independent files here. 41 binary-indep: build install 42 # We have nothing to do by default. 43 44 # Build architecture-dependent files here. 45 binary-arch: build install 46 # dh_testversion 47 dh_testdir 48 dh_testroot 49 # dh_installdebconf 50 dh_installdocs 51 dh_installexamples 52 dh_installmenu 53 # dh_installemacsen 54 # dh_installpam 55 # dh_installinit 56 dh_installcron 57 dh_installmanpages 58 dh_installinfo 59 # dh_undocumented 60 dh_installchangelogs 61 dh_link 62 dh_strip 63 dh_compress 64 dh_fixperms 65 # You may want to make some executables suid here. 66 dh_suidregister 67 # dh_makeshlibs 68 dh_installdeb 69 # dh_perl 70 dh_shlibdeps 71 dh_gencontrol 72 dh_md5sums 73 dh_builddeb 74 75 binary: binary-indep binary-arch 76 .PHONY: build clean binary-indep binary-arch binary install
(行番号は筆者が書き加えました)
1 行目は、シェルや Perl のスクリプトでおなじみの表現でしょう。 これは、このファイルが /usr/bin/make によって処理されることを オペレーティングシステムに指示しています。
12 行目から 19 行目までは「build」 (およびその子供である 「build-stamp」) ルールを記述しており、その中でプログラムを コンパイルするためにアプリケーション自身の Makefile を実行 しています。
21 行目から 29 行目までに記述されている「clean」ルールは、 パッケージの生成過程によって自動生成されたバイナリその他の 不要なファイルをすべて削除します。 このルールはどんな時でも (たとえソースツリーが 削除 されてしまっている状態でも!) きちんと動作しなければいけません。 このため、強制オプションを使うか (たとえば rm なら「-f」)、 返り値を無視する (コマンド名の前に「-」を追加) などの措置を 講じてください。
インストール方法を記述する「install」ルールは 31行目から 始まります。このルールは基本的にプログラム自身の Makefile に 記述されている「install」ルールを実行しますが、 インストール先は `pwd`/debian/tmp ディレクトリです - このために gentoo の Makefile の中で $(DESTDIR) を ルートインストールディレクトリとして指定しておいたのです。
コメントにもあるように、41 行目の「binary-indep」ルールは アーキテクチャに依存しないパッケージを生成するために使われます。 今回の例はそのようなパッケージではないため、ここでするべきことは 何もありません。 もしあなたのパッケージが「Architecture: all」なら、パッケージを 生成するために必要なコマンドをすべてこのルールの中で指定し、 その代りに次のルール (「binary-arch」) を空にしておかなければ いけません。
さあ、次のルール - 「binary-arch」の番です。45 行目から 73 行目に かけて記述されたこのルールでは、あなたのパッケージが Debian ポリシー に適合するよう、debhelper パッケージに収録されているいくつかの小さな ユーティリティを実行して、これから生成するパッケージ中のファイルに 対してさまざまな操作を行ないます。
これらのユーティリティの名前は dh_ で始まり、残りの部分は そのユーティリティが実際に行なう内容に関する説明となっています。 これらはほとんど読めばすぐわかるような簡単なものですが、 以下に説明を追加しておきます。
dh_testdir(1)
はあなたが正しい ディレクトリ
(つまり、ソースディレクトリのトップレベル) に いるかどうかをチェックします
dh_testroot(1)
は binary* ターゲット と clean
ルールの実行に必要なルート権限をあなたが持っているかどうか チェックします。
dh_installmanpages(1)
は ソースツリーの中に見つかったすべての man
ページをパッケージに コピーします。(注意: これは
DWIM、つまり書いたとおりの意味です。) ((訳注: DWIM の意味については jargon
を参照のこと))
dh_strip(1)
はデバッグ用ヘッダを
実行形式ファイルおよびライブラリから取り除き、それらのサイズを 小さくします。
dh_compress(1)
は man ページと サイズが 4 kB より大きな附属文書を
gzip で圧縮します。 ((訳注: 附属文書のうち圧縮形式の画像ファイルと HTML
ファイルは サイズに関わらず圧縮されません。既に圧縮済みのファイルも、
二重に圧縮されることはありません。))
dh_installdeb(1)
はパッケージに 関連するファイル
(例えばメンテナースクリプトなど) を debian/tmp/DEBIAN
ディレクトリにコピーします。
dh_shlibdeps(1)
はライブラリや
実行形式ファイルが依存している共有ライブラリを判定します。
dh_gencontrol(1)
は control
ファイルに必要な情報を追加し、インストールします。
dh_md5sums(1)
はパッケージ中の すべてのファイルに対して MD5
チェックサムを計算します。
これらすべての dh_* スクリプトが実際にはそれぞれ何をするのか、 また他にはどんなオプションが使えるのか、などのさらに詳しい情報に ついては、それぞれの man ページを参照してください。 また、ここでは取り上げませんでしたが、非常に便利だと思われる dh_* スクリプトが他にもいくつか用意されています。 これらに関しては、必要に応じて debhelper の説明書を読んでみて ください。
binary-arch セクションの中にある、不要な処理を実行している行は すべてどんどんコメントにしてしまうべきです。gentoo の場合には、 testversion、emacsen、pam、init、cron、manpages、info、undocumented、 suidregister, makeshlibs、そして perl に関する行を、単に gentoo が これらの処理を必要としていないという理由によってコメントにします。 また、今回の場合、60 行目に「FIXES」を追加する必要があります。 上流開発者 (upstream) の changelog (変更履歴) ファイルの名前が FIXES だからです。
最後の 2 行は (説明しなかった他の行と同様に) 多少なりとも 必要なものです。これらについては make のマニュアルや パッケージングマニュアルの中に説明があります。 今のところは、必ず知っておかなくてはいけないような重要な項目 というわけではありません。
jrodin@jagor.srce.hr
mhatta@debian.or.jp