Product SiteDocumentation Site

第 15 章 Debian パッケージの作成

15.1. ソースを使ったパッケージの再ビルド
15.1.1. ソースの取得
15.1.2. 修正を行う
15.1.3. 再ビルドの開始
15.2. 最初のパッケージのビルド
15.2.1. メタパッケージやフェイクパッケージ
15.2.2. 単純なファイルアーカイブ
15.3. APT 用のパッケージリポジトリの作成
15.4. パッケージメンテナになる
15.4.1. パッケージを作るための知識
15.4.2. 受け入れ過程
Debian パッケージを標準的な方法で取り扱ってきた管理者がいずれは自分自身のパッケージを作成したり、既存のパッケージを変更したりする必要性を感じるということは極めて普通のことです。この章ではパッケージングに関する最も一般的な質問に答えたり、最良のやり方で Debian インフラをうまく使うために必要な要素を提供したりすることを目標にしています。運が良ければ、ローカルパッケージを取り扱った後、さらに進んで Debian プロジェクト自体に参加する必要性を感じるかもしれません。

15.1. ソースを使ったパッケージの再ビルド

いくつかの状況下では、バイナリパッケージの再ビルドが必要です。たとえば、管理者は特定のコンパイルオプションを付けてソフトウェアをソースからコンパイルすることで導入されるソフトウェアの機能を必要とする場合があります。そしてまた、インストール済みの Debian のバージョン用にパッケージングされたソフトウェアのバージョンが古い場合があります。ソフトウェアのバージョンが古い場合、管理者はテスト版不安定版などの Debian の新しいバージョンから取得したより新しいパッケージをビルドすることが多いです。こうすることで、新しいパッケージを安定版ディストリビューションで動かすことが可能です。この操作は「バックポート」と呼ばれています。いつも通り、バックポート作業の前に既にバックポートパッケージが公開されているか否かを注意深く確認するべきです。対象のパッケージに対する Debian Package Tracker を一読するだけでこの種の情報が明らかになります。

15.1.1. ソースの取得

Debian パッケージの再ビルドはパッケージのソースコードを取得することから始まります。最も簡単な方法は apt-get source source-package-name コマンドを使うことです。このコマンドを実行するには /etc/apt/sources.list ファイルの中に deb-src 行が必要で、さらに最新のインデックスファイルが必要です (たとえば apt-get update を実行する必要があります)。管理者が APT 設定を取り扱う章で説明した内容 (第 6.1 節「sources.list ファイルの内容」を参照してください) に従っている場合、これらの状況は既に満足されているはずです。しかしながら、apt-get source source-package-name コマンドは deb-src 行で言及されている Debian バージョンのソースパッケージをダウンロードする点に注意してください。もし他のバージョンのソースパッケージが必要な場合、Debian アーカイブミラーや Debian のウェブサイトから手作業でダウンロードする必要があるかもしれません。この場合には 2、3 個のファイルをダウンロードする必要があります (Debian Source Control 用に *.dsc 拡張子を持つファイル、*.tar.comp としばしば *.diff.gz*.debian.tar.comp 拡張子を持つファイル、ここで comp は使われている圧縮ツールに応じて gzbz2xz のうちのどれか 1 つです)。その後、dpkg-source -x file.dsc コマンドを実行します。*.dsc ファイルがある URL から直接利用できるならば、dget URL コマンドを使えばより簡単にすべてを取得することが可能です。dget コマンドは (devscripts パッケージに含まれます) 指定したアドレスから *.dsc ファイルを取得し、内容を解析し、ファイル内で参照されている単一もしくは複数のファイルを自動的に取得します。すべてのダウンロードが完了したら、dget コマンドはソースパッケージを展開します (これは -d または --download-only オプションが使われていない場合に限ります)。

15.1.2. 修正を行う

これでパッケージのソースがソースパッケージとバージョンを基に名付けられたディレクトリ (たとえば samba-4.1.17+dfsg など) の中で利用できるようになりました。修正作業はこのディレクトリ内で行われます。
最初にパッケージのバージョン番号を変更します。こうすることで、再ビルドされたパッケージを Debian の提供する元パッケージと区別することが可能です。現在のバージョンが 2:4.1.17+dfsg-2 の場合、バージョン 2:4.1.17+dfsg-2falcot1 を作成することが可能です。これはパッケージの出自を明らかに示しています。このパッケージのバージョン番号は Debian が提供する元パッケージのバージョン番号よりも大きいため、このパッケージを元パッケージの更新として簡単にインストールできます。このような作業を極めて効果的に行うには、devscripts パッケージの提供する dch コマンド (Debian CHangelog) を dch --local falcot のように使います。これは最良の効果を発揮します。dch コマンドはテキストエディタ (sensible-editor。このエディタは VISUAL または EDITOR 環境変数で定義されているお気に入りのエディタです。そうでなければデフォルトエディタです) を起動します。ここで、再ビルドによって導入される変更の内容を記述してください。このエディタは dchdebian/changelog ファイルを変更したことを示します。
ビルドオプションの変更が必要な場合、debian/rules を修正します。debian/rules はパッケージビルド作業の各段階を動作させるものです。debian/rules が最も単純に書かれている場合、初期設定 (./configure …) や実際のビルド ($(MAKE) …make …) を実行するコマンドを簡単に見つけられるでしょう。ファイル内にこれらのコマンドが明示的に書かれていない場合、このファイルの内容は別のコマンドに対する作用を書いているのかもしれません。このような場合、デフォルト挙動を変える方法をより詳細に学ぶために文書を参照してください。dh を使っているパッケージのビルドオプションを変更する場合、dh_auto_configuredh_auto_build コマンドを再定義する必要があるかもしれません (これを行う方法に関する説明は各コマンドのマニュアルページをご覧ください)。
パッケージに対して行った変更の内容によっては、debian/control ファイルの内容もまた更新する必要があります。debian/control ファイルには生成されるパッケージの説明が含まれます。特に、debian/control ファイルにはパッケージのビルド時点で満足されなければいけない依存関係のリストを制御する Build-Depends 行が含まれます。Build-Depends 行で指定されているパッケージのバージョンはソースパッケージが提供されるディストリビューションに含まれるパッケージのバージョンと一致している場合が多いです。しかし、再ビルドを行うディストリビューションではここで指定されているバージョンが利用できないかもしれません。依存関係が本物か、それともビルド時にライブラリの最新版を試すことを保証するためだけ指定されているかを決定する自動的な方法はありません。Build-Depends 行を使うことが自動ビルドロボットにビルド中に与えられたパッケージバージョンを使うことを強制するための唯一の方法なので、Debian メンテナはバージョンを厳しく指定したビルド依存関係を使うことが多いです。
もしあなたが、指定されているビルド依存関係を緩めても問題ないと確信できる場合、手元で自由に依存関係を緩和することが可能です。対象のソフトウェアをビルドする標準的な方法について説明しているファイル (INSTALL と名付けられていることが多いです) を読むことは適切な依存関係を明らかにする助けになります。理想的に言えば、再ビルドに使うディストリビューションの要素を使ってすべての依存関係を満足させるべきです。しかしそれが無理ならば、対象のパッケージをバックポートする前に、再帰的に Build-Depends フィールドで言及されているパッケージを必ずバックポートしなければいけません。一部のパッケージはバックポートの必要がなく、ビルド作業中に現状のままインストールできます (特筆すべき例は debhelper です)。バックポート作業は気を付けないとすぐに複雑になる点に注意してください。それゆえ、バックポートは可能な限り厳密に必要最低限に留めるべきです。

15.1.3. 再ビルドの開始

ソースに対するすべての必要な変更が完了したら、実際のバイナリパッケージ (.deb ファイル) を生成します。すべてのプロセスは dpkg-buildpackage コマンドで管理されます。

例 15.1 パッケージの再ビルド

$ dpkg-buildpackage -us -uc
[...]
Build-Depends フィールドが更新されていなかったり、関連するパッケージがインストールされていなかった場合、dpkg-buildpackage コマンドは失敗します。そのような場合、dpkg-buildpackage-d オプションを指定して、依存関係確認を行わないようにすることも可能です。しかしながら、依存関係を明示的に無視すると後々の段階でビルド作業が失敗する恐れがあります。さらに悪いことに、パッケージが正常にビルドされたように見えても正しく動かない可能性があります。なぜなら一部のプログラムは必要なライブラリがビルド時に利用できない場合に一部の機能を自動的に無効化するからです。
しばしば、Debian 開発者は debuild などの高レベルプログラムを使います。debuild は通常通り dpkg-buildpackage を実行するだけでなく、生成されたパッケージの Debian ポリシーに対する妥当性を確認するプログラムも実行します。debuild スクリプトは、手元の環境変数がパッケージビルドを「汚染」しないように、ビルド環境を整えます。debuild コマンドは devscripts スイートに含まれるツールの 1 つで、メンテナの作業を簡単にするためのいくつかの一貫性と設定を共有します。