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

目次

6.1. 完全な(再)ビルド
6.2. オートビルダー
6.3. debuildコマンド
6.4. pbuilderパッケージ
6.5. git-buildpackageコマンドとその仲間
6.6. 部分的な再ビルド
6.7. コマンド階層

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

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

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

$ 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 ファイルを署名します。秘密フレーズを2回入力する必要があります。 [64]

ノンネイティブパッケージの場合、パッケージビルド後の親ディレクトリー (~/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を実行するだけです。[65]

  • 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.dscgentoo_0.9.12-1_i386.changes ファイルを署名しなければいけません。

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

DEBSIGN_KEYID=Your_GPG_keyID

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

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

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

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

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

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

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

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

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

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

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

$ sudo pbuilder create

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

$ 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を使用して実行することができます: [70]

#!/bin/sh
set -e
install_packages() {
        apt-get -y --force-yes 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/updatesstable-proposed-updatesがリリースされた後、stableパッケージのアップデートが必要な場合があります。[71]そのような場合に、即座にアップデートしない言い訳として sid を使っているからというのは不十分です。pbuilderパッケージは、同じアーキテクチャーのほぼ全ての Debian 派生であるディストリビューションへのアクセスを手助けします。

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

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

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

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

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

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

  • git-import-dsc(1): 過去の Debian パッケージを Git レポジトリーにインポートする。

  • git-import-orig(1): 新アップストリーム tar を Git レポジトリーにインポートします。

  • git-dch(1): Debian changelog を Git のコミットメッセージから生成します。

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

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

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

  • Debian パッケージのソースツリーは、main

  • アップストリームのソースツリーは、upstream

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

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

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

$ fakeroot debian/rules binary

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

$ fakeroot debian/rules build

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

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

  • 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 buildpackgepbuilder 等のよりハイレベルなコマンドを用いることは完全なパッケージビルド環境を保証しますが、debian/rulesdpkg-buildpackage 等のよりローレベルのコマンドがそれらの下で実行されるかを理解することは必須です。



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

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

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

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

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

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

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

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

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

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

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

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

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