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

目次

6.1. 完全な(再)ビルド
6.2. オートビルダー
6.3. debuildコマンド
6.4. pbuilderパッケージ
6.5. git-buildpackage command and similar
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ファイルを作成

If the build result is satisfactory, sign the .dsc and .changes files with your private GPG key using the debsign command. You need to enter your secret pass phrase, twice. [63]

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

  • gentoo_0.9.12.orig.tar.gz

    This is the original upstream source code tarball, merely renamed to the above so that it adheres to the Debian standard. Note that this was created initially by the command 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を実行するだけです。[64]

  • 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 メーリングリストへ流されます。

The gentoo_0.9.12-1.dsc and gentoo_0.9.12-1_i386.changes files must be signed using the debsign command with your private GPG key in the ~/.gnupg/ directory, before uploading them to the Debian FTP archive. The GPG signature provides the proof that these files are really yours, using your public GPG key.

The debsign command can be made to sign with your specified secret GPG key ID (good for sponsoring packages) with the following in the ~/.devscripts file:

DEBSIGN_KEYID=Your_GPG_keyID

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

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

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

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

The debuild command executes the lintian command to make a static check after building the Debian package. The lintian command can be customized with the following in the ~/.devscripts file:

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

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

$ debuild

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

$ debuild clean

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

それでは、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を使用して実行することができます: [69]

#!/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 パッケージはそのような状況への対処の助けとなります。

You may need to update your stable packages after their release for stable-proposed-updates, stable/updates, etc. [70] For such occasions, the fact that you may be running a sid system is not a good enough excuse for failing to update them promptly. The pbuilder package can help you to access environments of almost any Debian derivative distribution of the same architecture.

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

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

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

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

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

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

  • 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[73]

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

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

$ 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 等のよりローレベルのコマンドがそれらの下で実行されるかを理解することは必須です。



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

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

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

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

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

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

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

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

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

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

[73] The --pristine-tar option invokes the pristine-tar command, which can regenerate an exact copy of a pristine upstream tarball using only a small binary delta file and the contents of the tarball that are typically kept in an upstream branch in the VCS.

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

[75] Environment variables that are normally configured to proper values are not set by this method. Never create real packages to be uploaded using this quick method.