第6章 パッケージのビルド

# 第6章 パッケージのビルド

最新の内容とより実用的な例でこの入門書を書き換えたものが Guide for Debian Maintainers として入手できます。この新しい入門書を第一次的な入門書として使ってください。

これでパッケージをビルドする準備が整いました。

## 6.1. 完全な（再）ビルド

完全なパッケージの（再）ビルドを行うには、以下を確実にインストールして下さい。

- `build-essential`パッケージ

- `Build-Depends`に挙げられているパッケージ(参照「`control`」)

- `Build-Depends-indep`に挙げられているパッケージ(参照 「`control`」)

ソースディレクトリーで以下のコマンドを実行してください:

    $ dpkg-buildpackage -us -uc

このコマンドはバイナリーパッケージとソースパッケージをビルドする作業をすべて行ってくれます。これには以下の作業が含まれます:

- ソースツリーのクリーン (`debian/rules clean`)

- ソースパッケージのビルド (`dpkg-source -b`)

- プログラムのビルド (`debian/rules build`)

- バイナリーパッケージのビルド (`fakeroot debian/rules binary`)

- `.dsc` ファイルの作成

- dpkg-genchanges を使用し `.changes`ファイルを作成

満足なビルド結果の場合には、debsign コマンドを用いてあなたの秘密 GPG 鍵で `.dsc` と `.changes` ファイルを署名します。秘密フレーズを２回入力する必要があります。 [62]

ノンネイティブパッケージの場合、パッケージビルド後の親ディレクトリー (`~/gentoo`) に以下のファイルが生成されているはずです:

- `gentoo_0.9.12.orig.tar.gz`

  これは単に Debian 標準に合わせるために名前を変更しただけで、中身はオリジナルなソースコードの tar アーカイブです。これは元来、`dh_make -f ../gentoo-0.9.12.tar.gz` で作成されたということを覚えておいてください。

- `gentoo_0.9.12-1.dsc`

  これはソースコードの内容の概要です。このファイルはあなたの`control`ファイルから生成され、dpkg-source(1)によってソースを展開する際に使われます。

- `gentoo_0.9.12-1.debian.tar.gz`

  この圧縮された tar アーカイブには、あなたの`debian`ディレクトリーの中身が含まれています。オリジナルのソースコードに行った変更や追加などの情報は全て `debian/patches` 内に、quilt パッチとして保存されます。

  上記 3 つのファイルを使えば誰でも簡単にあなたのパッケージをスクラッチからビルドすることができます。3 つのファイルを任意の場所にコピーし、`dpkg-source -x gentoo_0.9.12-1.dsc`を実行するだけです。[63]

- `gentoo_0.9.12-1_i386.deb`

  これは、あなたが生成した完全なバイナリーパッケージです。他の全てのパッケージと同じく、dpkgを使ってインストールしたり削除したりできます。

- `gentoo_0.9.12-1_i386.changes`

  このファイルは現在のリビジョンパッケージにおける変更点をすべて記載したもので、Debian FTP アーカイブ管理プログラムによって、バイナリーおよびソースパッケージを FTP アーカイブにインストールするために利用されます。このファイルの一部は、`changelog` ファイルと `.dsc` をもとに生成されます。

  パッケージの保守管理を続けていくと、挙動の変更や新機能の追加をすることがあります。あなたのパッケージをダウンロードする人は、このファイルを見れば何が変わったのか、一目でわかります。また、このファイルの中身は Debian アーカイブ管理プログラムによって、debian-devel-changes@lists.debian.org メーリングリストへ流されます。

Debain FTP アーカイブ にアップロードする前に、`~/.gnupg/` ディレクトリー中にあるあなたの秘密 GPG 鍵で debsign コマンドを用いて`gentoo_0.9.12-1.dsc` と `gentoo_0.9.12-1_i386.changes` ファイルを署名しなければいけません。

以下の `~/.devscripts` ファイルを用いると、debsign コマンドはあなたが指定した秘密 GPG キー ID (パッケージをスポンサーする際に便利) で署名できます:

    DEBSIGN_KEYID=Your_GPG_keyID

`.dsc` と `.changes` ファイルに記載されている長い数字の羅列は各ファイルの MD5/SHA1/SHA256 チェックサムです。パッケージをダウンロードした人は、sha1sum(1)、sha256sum(1)を使って整合性をテストすることができます。もし、数字が一致しない場合には、ファイルが壊れているか、あるいは何者かによって改ざんされていると分かるわけです。

## 6.2. オートビルダー

Debian は、様々なアーキテクチャー上で buildd デーモンを走らせているオートビルダーネットワークによって、色々な 移植版 をサポートしています。あなたがそれらを明示的に使う必要はありませんが、パッケージがどうなるのかを知っておくと良いでしょう。それでは、あなたのパッケージがどのように異なるアーキテクチャー向けに再ビルドされるのかを見ていきましょう。[64]

`Architecture: any` のパッケージは、オートビルダーシステムによって再ビルドされます。それは、以下を確実にインストールします。

- `build-essential`パッケージ

- `Build-Depends`に挙げられているパッケージ (参照 「`control`」)

そして、ソースディレクトリーで次のコマンドを実行します:

    $ dpkg-buildpackage -B

これは、別のアーキテクチャー上で、アーキテクチャー依存のバイナリーパッケージを生成する作業をすべて行ってくれます。これには以下の作業が含まれます:

- ソースツリーのクリーン (`debian/rules clean`)

- プログラムのビルド (`debian/rules build`)

- アーキテクチャー依存のバイナリーパッケージをビルド(`fakeroot debian/rules binary-arch`)

- gpg を使用したソース`.dsc`ファイルへの署名

- dpkg-genchangesおよびgpgを使用したアップロード用`.changes`ファイルの生成と署名

あなたのパッケージが他のアーキテクチャー用にも存在するのは、このためです。

`Build-Depends-indep`フィールドのパッケージは、通常のパッケージの場合はインストールを要求されますが (参照 「完全な（再）ビルド」)、オートビルダーシステムでは、アーキテクチャー依存のパッケージのみをビルドするのでこれらのインストールは必須ではありません。[65] オートビルダーを使用した場合と普通のパッケージングとのこの違いにより、`debian/control` ファイルの `Build-Depends` か `Build-Depends-indep` のどちらにパッケージを記載するかが決定されます。(参照 「`control`」)

## 6.3. debuildコマンド

dpkg-buildpackageによるビルドプロセス周辺は、debuildによりさらに自動化できます。debuild(1)を参照してください。

debuild コマンドは、Debian パッケージをビルドのあと静的チェックをする lintian コマンドを実行します。lintian コマンドは `~/.devscripts` を用いて以下のようにカスタマイズできます:

    DEBUILD_DPKG_BUILDPACKAGE_OPTS="-us -uc -I -i"
    DEBUILD_LINTIAN_OPTS="-i -I --show-overrides"

以下のようにすれば一般ユーザーアカウントから、簡単にソースをクリーンしパッケージを再ビルドできます:

    $ debuild

ソースツリーのクリーンも簡単です:

    $ debuild -- clean

## 6.4. `pbuilder`パッケージ

ビルド依存を確認するためのクリーンルーム (chroot) ビルド環境として、`pbuilder` パッケージが非常に便利です。[66] これを使うことで、異なるアーキテクチャー向けに `sid` 環境オートビルダーの下でのソースからのクリーンなビルドが保証され、常に RC (リリースクリティカル) に分類される重要度が serious (深刻)の FTBFS (Fails To Build From Source、ソースからのビルド失敗) バグを防ぎます。[67]

それでは、`pbuilder` をカスタマイズしてみましょう:

- `/var/cache/pbuilder/result`ディレクトリーを、ユーザーアカウントから書き込めるように設定してください。

- フックスクリプトを置くために、ユーザーからの書き込みが可能なディレクトリーを作成してください。例） ``/var/cache/pbuilder/hooks``

- `~/.pbuilderrc` か `/etc/pbuilderrc` に以下のように設定します。

      AUTO_DEBSIGN=${AUTO_DEBSIGN:-no}
      HOOKDIR=/var/cache/pbuilder/hooks

それでは、ローカル`pbuilder` の chroot システムを以下のようにして初期化しましょう:

    $ sudo pbuilder create

既に完全なソースパッケージがあれば、``foo`.orig.tar.gz`ファイル、``foo`.debian.tar.gz`ファイル、``foo`.dsc`ファイルが存在するディレクトリーで、ローカルの `pbuilder` の chrootシステムをアップデートし、バイナリーパッケージをその中でビルドしましょう:

    $ sudo pbuilder --update
    $ sudo pbuilder --build foo_version.dsc

新しくビルドした GPG 署名の無いパッケージは非ルート所有権で `/var/cache/pbuilder/result/` に置かれます。

`.dsc` ファイルや `.changes` ファイルへのGPG 署名は次のようにするとできます:

    $ cd /var/cache/pbuilder/result/
    $ debsign foo_version_arch.changes

更新されたソースツリーが既にあるが一致するソースパッケージを生成していない場合は、この代わりに、`debian` ディレクトリーが存在するディレクトリーで、以下のコマンドを発行します:

    $ sudo pbuilder --update
    $ pdebuild

`pbuilder --login --save-after-login`コマンドで、chroot環境にログインし、好きに設定することができます。シェルプロンプトから`^D` (Control-D)で抜けると、その環境を保存しておくことができます。

最新のlintianコマンドは`chroot`環境から次のように設定されたフックスクリプト``/var/cache/pbuilder/hooks`/B90lintian`を使用して実行することができます: [68]

    #!/bin/sh
    set -e
    install_packages() {
            apt-get -y --allow-downgrades install "$@"
            }
    install_packages lintian
    echo "+++ lintian output +++"
    su -c "lintian -i -I --show-overrides /tmp/buildd/*.changes" - pbuilder
    # use this version if you don't want lintian to fail the build
    #su -c "lintian -i -I --show-overrides /tmp/buildd/*.changes; :" - pbuilder
    echo "+++ end of lintian output +++"

`sid` 環境向けのパッケージを正しくビルドするには最新の `sid` 環境が必要です。`sid` にはあなたの環境全てを移行するには望ましくない問題を抱えていることが少なくありません。`pbuilder` パッケージはそのような状況への対処の助けとなります。

`stable/updates`や`stable-proposed-updates`がリリースされた後、`stable`パッケージのアップデートが必要な場合があります。[69]そのような場合に、即座にアップデートしない言い訳として `sid` を使っているからというのは不十分です。`pbuilder`パッケージは、同じアーキテクチャーのほぼ全ての Debian 派生であるディストリビューションへのアクセスを手助けします。

http://www.netfort.gr.jp/~dancer/software/pbuilder.html と pdebuild(1) と pbuilderrc(5) と pbuilder(8) を参照下さい。

## 6.5. git-buildpackageコマンドとその仲間

アップストリームがソースコード管理システム (VCS) [70] を使っているのであれば、同様に使用することを考えるべきです。それによって、マージとアップストリームパッチの取捨選択がより簡単になります。各 VCS 毎に Debian パッケージをビルドするための特別なラッパースクリプトのパッケージもいくつかあります。

- `git-buildpackage`: Git リポジトリ内の Debian パッケージの支援プログラム群です。

- `svn-buildpackage`: Debian パッケージを Subversion で管理するための支援プログラム群です。

- `cvs-buildpackage`: CVS ソースツリーのための Debian パッケージスクリプト群です。

Debian デベロッパーが alioth.debian.org 上の Git サーバーを用い Debian パッケージを管理するのに `git-buildpackage` を使うことがよくあります。[71] このパッケージはパッケージ活動を自動化する多くのコマンドを提供します。

- gbp-import-dsc(1): import a previous Debian package to a Git repository.

- gbp-import-orig(1): import a new upstream tar to a Git repository.

- gbp-dch(1): generate the Debian changelog from Git commit messages.

- git-buildpackage(1): Debian パッケージを Git レポジトリーからビルドします。

- git-pbuilder(1): Debian パッケージを Git レポジトリーから pbuilder/cowbuilder を持ちいてビルドします。

これらのコマンドはパッケージング活動を追跡する 3 つのブランチを使用します:

- Debian パッケージのソースツリーは、`main` 。

- アップストリームのソースツリーは、`upstream`。

- `--pristine-tar` オプションにより生成されるアップストリームtar アーカイブは、`pristine-tar`。[72]

`git-buildpackage` は `~/.gbp.conf` で設定できます。gbp.conf(5) を参照下さい。 [73]

## 6.6. 部分的な再ビルド

大規模なパッケージの場合には、`debian/rules` をちょっといじるたびに、毎回最初からパッケージの再ビルドをやりなおすのは手間です。テスト目的であれば、以下の方法でアップストリームソースを再ビルドをせずに `.deb` ファイルを生成することができます。 [74]:

    $ fakeroot debian/rules binary

また、以下の方法を使えば生成可能かどうかをチェックすることができます:

    $ fakeroot debian/rules build

最終的にきちんとテストが完了したら、正しい手順に従ってパッケージを最初から再ビルドすることを忘れないでください。この方法でビルドした `.deb` ファイルをアップロードしようとしても、おそらくうまくアップロードできないでしょう。

## 6.7. コマンド階層

パッケージ作成に用いる多くのコマンドが、コマンド階層の中でお互いいかなる関係にあるかの簡単なまとめを以下に記します。同じ事をするのに多くの方法があります。

- `debian/rules` = パッケージビルド用のメンテナースクリプト

- dpkg-buildpackage = パッケージビルドツールの核

- debuild = dpkg-buildpackage + lintian (サニタイズした環境変数下でのビルド)

- pbuilder = Debian の chroot 環境ツールの核

- pdebuild = pbuilder + dpkg-buildpackage (chroot 中でビルド)

- cowbuilder = pbuilder 実行の加速

- git-pbuilder = pdebuild の使いやすいコマンドラインシンタックス (gbp buildpackge が使用)

- gbp = Debian ソースを git レポ下で管理

- gbp buildpackge = pbuilder + dpkg-buildpackage + gbp

gbp buildpackge や pbuilder 等のよりハイレベルなコマンドを用いることは完全なパッケージビルド環境を保証しますが、`debian/rules` や dpkg-buildpackage 等のよりローレベルのコマンドがそれらの下で実行されるかを理解することは必須です。

[62] GPG キーは信頼の網に連結するように Debian デベロッパーによって署名され、the Debian keyring に登録されていなければいけません。こうすることで Debian アーカイブにパッケージをアップロードして受け付けられるようになります。Creating a new GPG key と Debian Wiki on Keysigning を参照下さい。

[63] `3.0 (quilt)`ソースフォーマットでquiltパッチを当てないようにするには、上記コマンドに`--skip-patches`オプションをつけて実行します。または、通常の操作の後に、`quilt pop -a`を実行する方法もあります。

[64] 実際のオートビルダーシステムは、本稿の説明よりもかなり複雑なスキームによって実現しています。それらの詳細は、本稿の範囲を超えるため割愛します。

[65] `pbuilder`パッケージとは違い、オートビルダーによって使用される`sbuild`パッケージ下でのchroot環境では、最小システムを強制しないので、多くのパッケージがインストールされたままになるかもしれません。

[66] `pbuilder`パッケージはまだ進化の過程なので、実際の構成は、最新の公式ドキュメントで確認して下さい。

[67] Debian パッケージのオートビルドに関しては http://buildd.debian.org/ を参照下さい。

[68] `HOOKDIR=/var/cache/pbuilder/hooks` をここで仮定しています。フックスクリプトのサンプルは `/usr/share/doc/pbuilder/examples` ディレクトリーににあります。

[69] `stable` パッケージのそのようなアップデートには制限が課せられます。

[70] 詳しくは Version control systems を参照下さい。

[71] alioth.debian.org サービスの使い方は、Debian wiki Alioth に記載されています。

[72] `--pristine-tar` オプションは、小さなバイナリデルタと通常 VCS の `upstream` ブランチ中に保存された tar アーカイブの内容のみを用い完全に元通りの手付かずの tar アーカイブを再生成する pristine-tar コマンドを起動します。

[73] 以下は、上級者のみなさんの参考になるウェブ上で閲覧できる資料です。

- git-buildpackage を使っての Debian パッケージ作成 (`/usr/share/doc/git-buildpackage/manual-html/gbp.html`)

- debian packages in git

- Using Git for Debian Packaging

- git-dpm: Debian packages in Git manager

[74] その場合は、通常だと正しく設定される環境変数は設定されません。アップロード用のパッケージはこの簡易メソッドで生成しないでください。

第5章 `debian`ディレクトリーにあるその他のファイル |  | 第7章 パッケージのエラーの検証