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

目次

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

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

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

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

$ dpkg-buildpackage

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

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

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

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

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

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

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

あなたの GPG 秘密パスフレーズを2回入力するだけが必要なことです。[64] 自分自身のローカルでの使用のためだけに Debian パッケージを作っている場合は、.dsc ファイルと .changes ファイルに GPG 署名するためのプロンプトを以下のようにしてスキップ出来ます:

$ dpkg-buildpackage -us -uc

ノンネイティブパッケージの場合、パッケージビルド後の親ディレクトリー (~/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)によって ソースを展開する時に使われます。また、GPG で署名されているので、本当にあなた自身が作成したものかどうかを利用者が検証できます。

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

    この圧縮されたターボールには、あなたの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 をもとに生成されます。また、GPG で署名されているので、本当にあなた自身が作成したものかどうかを利用者が検証できます。

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

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

ネイティブパッケージの場合、一連の作業が終わった後の親ディレクトリー (~/gentoo) には以下のファイルが生成されているはずです。

  • mypackage_1.0.tar.gz

    これは、dpkg-source コマンドにより mypackage-1.0 ディレクトリーから作られたソースコード tar 玉です。(そのサフィックスは orig.tar.gz ではありません。)

  • mypackage_1.0.dsc

    これは、ノンネイティブ Debian パッケージと同様でソースコード内容の要約です。(Debian リビジョンはありません。)

  • mypackage_1.0_i386.deb

    これは、ノンネイティブ Debian パッケージと同様で完成したバイナリーパッケージです。(Debian リビジョンはありません。)

  • mypackage_1.0_i386.changes

    これは、ノンネイティブ Debian パッケージと同様で現パッケージバージョンでの全変更を記述します。(Debian リビジョンはありません。)

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 コマンドのカスタマイズは /etc/devscripts.conf~/.devscripts を用いて行います。少なくとも以下の設定をすると良いでしょう。

DEBSIGN_KEYID=Your_GPG_keyID
DEBUILD_LINTIAN_OPTS="-i -I --show-overrides"

これによって、パッケージは常にあなたのGPG鍵で署名され(これはスポンサーの作業にも適しています)、lintianコマンドで詳細にチェックされます。

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

$ debuild

もしあなたが Debian パッケージを自分自身のローカル使用のためにのみ作成している場合は、.dsc ファイルや .changes ファイルへのGPG 署名のプロンプトを次のようにするとスキップできます。

$ debuild -us -uc

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

$ 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:-yes}
    HOOKDIR=/var/cache/pbuilder/hooks
    

これにより、~/.gnupg/ディレクトリーにある、あなたのGPGキーで生成されたパッケージへの署名を許可します。

それでは、初めてのローカルpbuilder chroot システムを初期化しましょう。

$ 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.dsc
$ debsign foo_version_arch.changes

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

$ sudo pbuilder --update
$ pdebuild

ここで、あなたのローカル使用のためにのみ Debian パッケージをビルドしている場合、.dscファイルと .changes ファイルに GPG 署名をするプロンプトを以下のようにすればスキップできます:

$ AUTO_DEBSIGN=no 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 ファイルをアップロードしようとしても、おそらくうまくアップロードできないでしょう。



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