Debianベースのシステムでパッケージを自作する

Debianパッケージの作成は、よく知らない人にすれば、実際よりもずっと難しく見える謎めいたプロセスである。その謎を少しでも解明できればと思い、この記事ではDebianパッケージを構築する2つの方法を取り上げる。標準のDebianパッケージングツールを使う方法と、CheckInstallユーティリティを使う方法だ。

この記事で取り上げるツール群はDebianとUbuntuでのパッケージ作成に用いたものだが、MEPIS、Xandros、Linspire、Freespireなど、Debianから派生した他のディストリビューションにも使えるだろう。紹介するツールや手法はこれらのディストリビューション全般にあてはまるはずだが、説明を簡単にするために、この記事では統一して「Debianパッケージ」という表現を用いることにする。

また、各ディストリビューションのパッケージングに関するポリシーの話には踏み込まないので、Debianのパッケージ管理システムを利用したディストリビューションへのパッケージ提供に興味があるなら、各ディストリビューションのWebサイトでパッケージポリシーに関する情報を参照してもらいたい。

簡単な方法

最も簡単なDebianパッケージの作成方法は、CheckInstallユーティリティを利用することだ。以前にも取り上げたことがあるが、ここで使い方をおさらいしておこう。まず、以下のようにしてCheckInstallパッケージをインストールする。

apt-get install checkinstall

次に、いつもどおりに./configuremakeを使ってプログラムのソースのコンパイルを行う。ただし、make installは実行せずにおく。

その代わりに、ソースディレクトリでcheckinstallを実行してプロンプトに従う。やるべきことは以上だ。あとはCheckInstallがシステム上でパッケージの作成とインストールを行ってくれる。パッケージの削除も簡単で、dpkg -r packagenameとするだけだ。複数のシステムにパッケージをインストールする場合は、各システムにパッケージをコピーしてdpkg -i packagename.debを実行すればよい。

真っ当な方法

とにかくできるだけ簡単にソースからインストールするアプリケーションを扱いたいというなら、CheckInstallは、手っとり早くパッケージを生成できるすばらしいツールだ。しかし、あくまでディストリビューションのポリシーに従ったパッケージを作成しようとするなら、CheckInstallによるパッケージではその保証を得ることはできない。

ディストリビューションにふさわしいパッケージを作りたければ、やはりネイティブのツールを利用する必要があるのだ。とは言っても、それほど難しい方法ではないので心配はいらない。

最初にすべきことは、次のようにして、パッケージの構築に必要なユーティリティと共にいくつかのパッケージをインストールすることだ。

apt-get install build-essential dh-make devscripts fakeroot

build-essentialパッケージは、GNU Make、GNU Compiler Collection、パッチといった、必須ではないが大抵はパッケージの構築に必要になるシステムパッケージを導入するメタパッケージである。dh-makeパッケージには、標準的なソースのtarballをDebianのポリシーに従った形式のアーカイブに変換するツール群が、debsciptsパッケージには、その名が示すように、開発者がDebianパッケージを作成するためのスクリプト群がそれぞれ含まれている。また、fakerootパッケージは、一般ユーザによるパッケージの構築を可能にする。

パッチを組み込む場合やDebianプロジェクトへのパッケージ提供を行う場合は、その他にもいくつかのパッケージのインストールが必要になることがある。おそらくパッチユーティリティは何らかの形でインストールしてあるだろうが、そうでない場合は、次のパッケージ群をインストールしておく。

apt-get install patch diff patchutils

また、Debianには、LintianLindaというポリシーの自動チェック・アプリケーションが用意されており、これらはDebianパッケージがDebianポリシーに従ったものになっているかどうかを調べてくれる。Lindaのほうがパッケージ内で検出されたエラーの説明がわかりやすいと思うので、まずはこちらを次のようにしてインストールすることをお薦めする。

apt-get install linda

サンプルの取得

パッケージの作成にとりかかる前に、他のパッケージがどのような構成になっているかを見ておくとよいだろう。大抵のことは例を見ながら覚えるほうが楽であり、今回のケースではほとんど手間をかけずに公式パッケージの構成を参照することができる。すでにそうしたパッケージが/var/cache/aptにたくさんあるはずなので、わざわざ新しいパッケージをダウンロードしてくる必要はない。

パッケージの中身を確認するには、作業ディレクトリにそのパッケージをコピーしてar -x packagename.debを実行する。すると、control.tar.gz、data.tar.gz、テキスト形式のdebian-binaryというの3つのファイルが得られる。このうちdebian-binaryファイルはDebianファイル形式のバージョンを記したもので、その中身は2.0と書かれた1行きりのはずだ。

アーカイブcontrol.tar.gzには、パッケージのコントロールファイル、インストールまたは削除の処理のさまざまな段階で実行されるスクリプト、パッケージのアーカイブ内にある各ファイルのMD5チェックサムを記したテキストファイルが含まれる。また、data.tar.gzには、ご想像のとおり、実際にインストールされるファイルが収められている。

公式Debianパッケージ内にポリシーに反するエラーがないかどうかのチェックは、次のようにLindaを使って行うこともできる。

linda packagename.deb

以下に、CheckInstallで生成したquadkonsokeのパッケージに対してLindaを実行したときの出力結果を示す。

E: quadkonsole; Description starts with package name.
E: quadkonsole; Package is in section checkinstall, which is unknown.
E: quadkonsole; Package does not contain a copyright file.
W: quadkonsole; File /usr/share/doc/quadkonsole/COPYING is considered to be an extra license file.

それぞれ、Eで始まる行はエラーを、Wで始まる行は警告を示すが、さらに詳しいことについてはlindaのmanページで確認してほしい。

パッケージの作成

いよいよ、皆さんお待ち兼ねのパッケージ作成に入るとしよう。まず必要になるのは、作業ディレクトリとパッケージ化するソフトウェアのソースである。ここでは、rabidbunyというパッケージのバージョン1.0を例にとって話を進める。つまり、rabidbuny-1.0という作業ディレクトリと、その下にはこれから作成にかかるパッケージのソースが必要になるわけだ。

これらの用意が済んだら、rabidbuny-1.0ディレクトリに移り、次のようにdh-makeスクリプトを実行する。

dh_make -e user@domain.com -s -n

すると、以下のようなプロンプトが現れる。


Maintainer name : Your Name
Email-Address   : user@domain.com
Date            : Tue, 14 Feb 2007 11:26:03 -0700
Package Name    : rabidbunny
Version         : 1.0
License         : blank
Type of Package : Single
Hit <enter> to confirm:

-eオプションは、dh-makeスクリプトに電子メールアドレスを渡す。また、-sオプションは単一のバイナリパッケージを作成することを、-nオプションはネイティブのDebianパッケージを作成することをスクリプトに伝える。一部のプロジェクトでは、これらのオプションの変更が必要になることがあるが、この記事では簡単なシングルパッケージの作成を行うことにする。

どの項目にも問題がなければ、そのままEnterキーを押せばよい。dh-makeスクリプトによってソースディレクトリ内にdebianというディレクトリが作成されるので、パッケージの構築を行う前にこのディレクトリのファイルをいくつか編集する必要がある。編集の順序は気にしなくてよいが、まずはこのパッケージのバージョンに関する情報を記述するchangelogファイルから始めるとしよう。次のようになっているはずなので、必要に応じて編集を行う。

rabidbunny (1.0-1) unstable; urgency=low

  *Initial package

  -- Your Name <user@domain.com> Tue, 14 Feb 2007 11:26:03 -0700

changelogファイルのサンプルを見たければ、/usr/share/docのchangelog.Debian.gzファイルからどれでも好きなものを参照すればよい。

また、copyrightファイルの編集も必要になるが、その記述方法は中身を見ればわかってもらえるはずだ。次に、debianディレクトリ内のcontrolファイルを編集する。このファイルは、パッケージの依存関係、メンテナの連絡先、パッケージの説明、パッケージの優先レベルといったパッケージ関連の情報を提供するものだが、詳細についてはDebianポリシーマニュアルを参照してもらいたい。

さらに、rulesファイルの編集が必要になることもある。ごく普通のプロジェクトであればおそらく変更の必要はないだろうが、必要な場合には必ずDebianのマニュアルを参照し、詳しい情報を確認すること。

debianディレクトリに多数の.exファイルが含まれていることに気付くかもしれないが、これらはあとで必要になるかもしれないサンプルだ。作成するパッケージの種類にもよるが、これらのファイルの多くは削除しても問題ない。例えば、対象アプリケーションがデーモンの場合、init.d.exファイルは必要ない。また、すでにmanページが存在する場合は、manpege.1.exを削除しても差し支えない。manページが存在しない場合は、このファイルをmanページのテンプレートとして編集することができる。

manページの作成が終わったら、対象パッケージの各manページを列挙したmanpagesというファイルが必要になる。例えば、rabidbunnyについてのmanページとしてrabidbunny.1とrabidbunnyrc.1の2つがdebianディレクトリ内にある場合、manpagesファイルには次の2行を記述すればよい。

debian/rabidbunny.1
debian/rabidbunnyrc.1

debianディレクトリにあるすべてのファイルの編集が終わったら、いよいよ最後の審判のときだ。次のようにしてdebuildユーティリティを実行し、パッケージの構築を行う。

debuild --linda -us -uc

これにより、ソースがコンパイルされ、Debianパッケージが作成される。-us -ucというオプションは、パッケージへの署名を行わないことを意味する。ただし、GPG鍵を所有している場合は、これらのオプションを省略するとよい。また、--lindaオプションは、Lintianの代わりにLindaを使ってパッケージのチェックを行うことを意味する。Lintianを使いたければ、このオプションは省略する。

パッケージのコンパイルが終わったあとで、Linda(またはLintian)が警告やエラーのメッセージを出力することがある。エラーの深刻さにもよるが、場合によっては変更を加えたうえでdebuildの再実行が必要になるかもしれない。

致命的なエラーが出なかった場合は、1つ上のディレクトリに新しいDebianパッケージができあがっているはずだ。最終テストとして、dpkgを使ってこのパッケージをインストールしてみよう。

dpkg -i rabidbunny_1.0.0_i386.deb

これがうまく行けば無事に目標達成だ。Lindaで重大なエラーが出ていなければ、このパッケージを他のユーザに配布することができ、さらにはDebianやUbuntu、またDebianのどの派生ディストリビューションに含めることも可能だろう。この記事を参考に、是非あなたもパッケージの作成を試してほしい。

そもそもポリシーとは何か

Debian、Ubuntuをはじめとする各ディストリビューションには、どのようにして複数のパッケージをまとめ、ディストリビューションに含めるかについての規則がある。Debianポリシーでは、パッケージの名前や構造からパッケージで認められるライセンスに至るまでのあらゆる項目がカバーされている。Debianポリシーのドキュメントは、(何千とまではいかないが)何百という個々の開発者の活動を調整するにはこうしたポリシーが必要なのだという点を理解していない限り、単にパッケージをリポジトリに入れる際に従うべき形式的手続きの集まりにしか見えないだろう。

Ubuntuパッケージの作成にも興味があるなら、Debianポリシーのドキュメントに加えてUbuntu WikiのUbuntuDevelopmentページも参照するとよい。なお、Linspire/Freespire、Xandros、MEPISの開発者コミュニティはDebianやUbuntuほど大規模ではないため、私の知る限り、パッケージポリシーに関する公式ガイドは存在しない。

NewsForge.com 原文