Debian パッケージングチュートリアル
Lucas Nussbaum
packaging-tutorial@packages.debian.org

version 0.30 – 2024-03-16

Debian パッケージングチュートリアル

1 / 90このチュートリアルについて▶ 目的: Debianのパッケージ作成について、知る必要のあることの提供▶ 既存パッケージの修正▶ 自作パッケージの作成▶ Debian コミュニティとのやりとり▶ Debian のパワーユーザーになる▶ 最も重要な点を押さえているが不完全▶ 詳細なドキュメントを参照▶ ほとんどの内容は Debian 派生ディストリビューションにも適用可能▶ Ubuntu を含む

Debian パッケージングチュートリアル

2 / 90アウトライン
1

はじめに

2

ソースパッケージの作成

3

パッケージの構築とテスト

4

練習問題 1: grep パッケージの変更

5

高度なパッケージングの話題

6

Debian でのパッケージメンテナンス

7

まとめ

8

Additional practical sessions

9

練習問題の解答

Debian パッケージングチュートリアル

3 / 90アウトライン
1

はじめに

2

ソースパッケージの作成

3

パッケージの構築とテスト

4

練習問題 1: grep パッケージの変更

5

高度なパッケージングの話題

6

Debian でのパッケージメンテナンス

7

まとめ

8

Additional practical sessions

9

練習問題の解答

Debian パッケージングチュートリアル

4 / 90Debian▶ GNU/Linux ディストリビューション
▶ 「GNU の精神でオープンに」開発している第一のメジャーディストリビューション
▶ 非商用: 1,000 人以上のボランティアが協力して開発▶ 3つの主要機能▶ 品質 – 技術的利点の文化準備できた時にリリース▶ 自由 – 開発者とユーザーは、1993 年に成立した、
フリーソフトウェアの文化を促す社会契約で結ばれている。
▶ 独立 – Debian のお守りをしている (単一) 企業はない
また、オープンな意思決定プロセス (実行主義 + 民主主義)▶ 最高の アマチュア が、好きだからこそ成し遂げた

Debian パッケージングチュートリアル

5 / 90Debian パッケージ▶ .deb ファイル (バイナリパッケージ)▶ ソフトウェアをユーザーに配布する、とても強力で便利な方法▶ もっとも一般的なパッケージフォーマットのひとつ (もうひとつは RPM)
▶ ユニバーサル:▶ 30,000 のバイナリーパッケージ→ ほとんどのフリーソフトウェアがDebianでパッケージ化▶ 2 つの非 Linux (Hurd, KFreeBSD) を含む 12 の移植版 (アーキテクチャ)▶ 120 の Debian 派生ディストリビューションでも使用

Debian パッケージングチュートリアル

6 / 90deb パッケージフォーマット
▶ .deb ファイル: ar アーカイブ$ ar tv wget_1 .12 -2.1 _i386 . deb
rw -r - -r - - 0/0
4 Sep 5 15:43 2010 debian - binary
rw -r - -r - - 0/0
2403 Sep 5 15:43 2010 control . tar . gz
rw -r - -r - - 0/0 751613 Sep 5 15:43 2010 data . tar . gz

▶ debian-binary: deb ファイルフォーマットのバージョン "2.0\n"▶ control.tar.gz: パッケージについてのメタデータ
control, md5sums, (pre|post)(rm|inst), triggers, shlibs, . . .

▶ data.tar.gz: パッケージのデータファイル▶ .deb ファイルを手で作ることも可能
http://tldp.org/HOWTO/html_single/Debian-Binary-Package-Building-HOWTO/▶ しかし、ほとんどの人には不要
本チュートリアル: Debian のパッケージを Debian 流に作成

Debian パッケージングチュートリアル

7 / 90

必要なツール▶ Debian (ないし Ubuntu) システム (要 root アクセス)▶ いくつかのパッケージ:▶ build-essential: 開発者のマシンで利用前提となるパッケージに依存(パッケージの Build-Depends: コントロールフィールドに指定不要)▶ パッケージを作成する、基本的な Debian 特化ツールである
dpkg-dev への依存関係を含む▶ devscripts: Debian メンテナにとって便利なスクリプト群
debhelper, cdbs, quilt, pbuilder, sbuild, lintian, svn-buildpackage,git-buildpackage, . . . といった、その他たくさんのパッケージ (後述)
必要に応じてインストール。

Debian パッケージングチュートリアル

8 / 90一般的なパッケージングワークフロー
Debian ミラーサイト
apt-get source

Web

dget

upstream ソース
dh_make

ソースパッケージ

ここでほとんどの手作業を実行debuild (構築と lintian によるテスト) または dpkg-buildpackage
単一/複数のバイナリーパッケージ
アップロード (dput).deb

インストール (debi)

Debian パッケージングチュートリアル

9 / 90例: dash の再構築
1

2

3

dash を構築するのに必要なパッケージと devscripts のインストール
sudo apt-get build-dep dash(/etc/apt/sources.list に deb-src 行が必要)
sudo apt-get install --no-install-recommends devscripts
fakeroot
作業ディレクトリーを作成し、そこに移動
mkdir /tmp/debian-tutorial ; cd /tmp/debian-tutorial
dash のソースパッケージを入手
apt-get source dash(/etc/apt/sources.list に deb-src 行が必要)

4

5

6

パッケージの構築
cd dash-*debuild -us -uc (-us -uc は GPG によるパッケージ署名を無効化)
結果の確認▶ 新しい .deb ファイルが親ディレクトリーに
debian/ ディレクトリーを参照▶ パッケージング作業を行う場所
Debian パッケージングチュートリアル

10 / 90

アウトライン
1

はじめに

2

ソースパッケージの作成

3

パッケージの構築とテスト

4

練習問題 1: grep パッケージの変更

5

高度なパッケージングの話題

6

Debian でのパッケージメンテナンス

7

まとめ

8

Additional practical sessions

9

練習問題の解答

Debian パッケージングチュートリアル

11 / 90

ソースパッケージ▶ 1 つのソースパッケージから複数のバイナリーパッケージを生成
例: libtar のソースから libtar0 と libtar-dev のバイナリーパッケージを生成▶ 2種類のパッケージ: (よく判らなければ非ネイティブで)▶ ネイティブパッケージ: 通常 Debian 固有ソフトウェア (dpkg, apt)
▶ 非ネイティブパッケージ: Debian 外で開発されたソフトウェア▶ メインファイル: .dsc (メタデータ)▶ ソースフォーマットのバージョンに依存する他のファイル▶ 1.0, 3.0 (ネイティブ): package_version.tar.gz▶ 1.0 (非ネイティブ):▶ pkg_ver.orig.tar.gz: 上流ソース▶ pkg_debver.diff.gz: Debian 固有の変更を加えるパッチ▶ 3.0 (quilt):▶ pkg_ver.orig.tar.gz: 上流ソース▶ pkg_debver.debian.tar.gz: Debian の変更を格納した tarball(詳細は dpkg-source(1) を参照)
Debian パッケージングチュートリアル

12 / 90

ソースパッケージの例 (wget_1.12-2.1.dsc)
Format : 3.0 ( quilt )Source : wget
Binary : wget
Architecture : any
Version : 1.12 -2.1
Maintainer : Noel Kothe < noel@debian . org >Homepage : http :// www . gnu . org / software / wget /Standards - Version : 3.8.4
Build - Depends : debhelper ( > > 5.0.0) , gettext , texinfo ,libssl - dev ( >= 0.9.8) , dpatch , info2man
Checksums - Sha1 :50 d4ed2441e67 [..]1 ee0e94248 2464747 wget_1 .12. orig . tar . gz
d4c1c8bbe431d [..] dd7cef3611 48308 wget_1 .12 -2.1. debian . tar . gz
Checksums - Sha256 :
7578 ed0974e12 [..] dcba65b572 2464747 wget_1 .12. orig . tar . gz
1 e9b0c4c00eae [..]89 c402ad78 48308 wget_1 .12 -2.1. debian . tar . gz
Files :
141461 b9c04e4 [..]9 d1f2abf83 2464747 wget_1 .12. orig . tar . gz
e93123c934e3c [..]2 f380278c2 48308 wget_1 .12 -2.1. debian . tar . gz

Debian パッケージングチュートリアル

13 / 90

既存のソースパッケージの入手▶ Debian のアーカイブから:▶ apt-get source package▶ apt-get source package=version▶ apt-get source package/release(sources.list に deb-src 行が必要)▶ インターネットから:▶ dget url-to.dsc▶ dget http://snapshot.debian.org/archive/debian-archive/
20090802T004153Z/debian/dists/bo/main/source/web/
wget_1.4.4-6.dsc(snapshot.d.o では、2005 年以降の Debian からのすべてのパッケージを提供)▶ (公開された) バージョン管理システムから:▶ debcheckout package▶ ダウンロードしたら dpkg-source -x file.dsc で展開
Debian パッケージングチュートリアル

14 / 90基本的なソースパッケージの作成▶ 上流ソースのダウンロード(上流ソース = ソフトウェアのオリジナル開発者からのもの)▶ <source_package >_<upstream_version >.orig.tar.gz に名前の変更(例: simgrid_3.6.orig.tar.gz)▶ tar を展開
▶ ディレクトリーを <source_package >-<upstream_version > に変更(例: simgrid-3.6)▶ cd <source_package >-<upstream_version > && dh_make(dh-make パッケージに収録)▶ dh_make の代わりに特定のパッケージ向けのものも:dh-make-perl, dh-make-php, . . .
▶ debian/ ディレクトリーにたくさんのファイルが作成

Debian パッケージングチュートリアル

15 / 90

debian/ 内のファイルパッケージングの作業は、すべて debian/ 以下の変更で行う▶ メインのファイル:▶ control – パッケージに関するメタデータ (依存関係 etc.)▶ rules – パッケージの構築方法を記載▶ copyright – パッケージの著作権情報▶ changelog – Debian パッケージの履歴▶ その他のファイル:▶ compat▶ watch▶ dh_install* targets*.dirs, *.docs, *.manpages, . . .

▶ メンテナースクリプト*.postinst, *.prerm, . . .

▶ source/format▶ patches/ – 上流ソースを変更する必要がある際に使用▶ ファイルのフォーマットは RFC 822 (メールヘッダー) を基にしたものもDebian パッケージングチュートリアル

16 / 90

debian/changelog▶ Debian パッケージの変更点一覧▶ パッケージの現在のバージョンの見方

1.2.1.1-5
Debian
上流
リビジョン
バージョン

▶ 手で編集するか dch を使用▶ 新リリースの changelog エントリ作成: dch -i▶ Debian や Ubuntu のバグ報告をクローズする特殊フォーマット
Debian: Closes: #595268; Ubuntu: LP: #616929▶ /usr/share/doc/package /changelog.Debian.gz にインストール
mpich2 (1.2.1.1 -5) unstable ; urgency = low* Use / usr / bin / python instead of / usr / bin / python2 .5. Allow
to drop dependency on python2 .5. Closes : #595268* Make / usr / bin / mpdroot setuid . This is the default after
the installation of mpich2 from source , too . LP : #616929+ Add corresponding lintian override .
-- Lucas Nussbaum < lucas@debian . org >Wed , 15 Sep 2010 18:13:44 +0200
Debian パッケージングチュートリアル

17 / 90

debian/control▶ パッケージのメタデータ▶ ソースパッケージ向け▶ このソースから構築される各バイナリーパッケージ向け▶ パッケージ名、セクション、優先度、メンテナー、アップロード担当、構築依存関係、依存関係、説明、ホームページ . . .
▶ Documentation: Debian Policy chapter 5
https://www.debian.org/doc/debian-policy/ch-controlfields
Source : wget
Section : web
Priority : important
Maintainer : Noel Kothe < noel@debian . org >Build - Depends : debhelper ( > > 5.0.0) , gettext , texinfo ,libssl - dev ( >= 0.9.8) , dpatch , info2man
Standards - Version : 3.8.4
Homepage : http :// www . gnu . org / software / wget /Package : wget
Architecture : any
Depends : $ { shlibs : Depends } , $ { misc : Depends }Description : retrieves files from the web
Wget is a network utility to retrieve files from the Web
Debian パッケージングチュートリアル

18 / 90

Architecture: all か any
2 種類のバイナリーパッケージ:▶ Debian のアーキテクチャごとに異なる内容のパッケージ▶ 例: C プログラム▶ debian/control に Architecture: any▶ または動作するアーキテクチャのみ:
Architecture: amd64 i386 ia64 hurd-i386▶ buildd.debian.org: アップロードした以外の全アーキテクチャを構築▶ package _version _architecture.deb という名前▶ 全アーキテクチャで同じ内容のパッケージ▶ 例: Perl ライブラリー▶ debian/control に Architecture: all▶ package _version _all.deb という名前
ソースパッケージは、Architecture: any と Architecture: all のバイナリ
ーパッケージが混在しても生成可能
Debian パッケージングチュートリアル

19 / 90

debian/rules▶ Makefile▶ Debian パッケージを構築するインターフェース▶ Documented in Debian Policy, chapter 4.8
https://www.debian.org/doc/debian-policy/ch-source#s-debianrules▶ 必要なターゲット:▶ build, build-arch, build-indep: すべての設定とコンパイルを実行▶ binary, binary-arch, binary-indep: バイナリーパッケージ構築▶ dpkg-buildpackage は、binary を呼び出して全パッケージの構
築、binary-arch を呼び出して Architecture: any パッケージのみの構築▶ clean: ソースディレクトリーのクリーンナップ

Debian パッケージングチュートリアル

20 / 90パッケージングヘルパー – debhelper▶ debian/rules に直接シェルのコードを記述可能▶ よりよい方法 (多くのパッケージが採用): パッケージングヘルパー 利用▶ 一番人気: debhelper (98% のパッケージが採用)▶ 目的:▶ 全パッケージで使われる標準ツールの共通タスクを分解▶ パッケージングバグを一度直して全パッケージに適用
dh_installdirs, dh_installchangelogs, dh_installdocs, dh_install, dh_installdebconf,
dh_installinit, dh_link, dh_strip, dh_compress, dh_fixperms, dh_perl, dh_makeshlibs,
dh_installdeb, dh_shlibdeps, dh_gencontrol, dh_md5sums, dh_builddeb, . . .

▶ debian/rules から呼ばれる▶ コマンドパラメーターや debian/ のファイルで設定可能
package.docs, package.examples, package.install, package.manpages, ...

▶ パッケージセット用のサードパーティーヘルパー: python-support,
dh_ocaml, . . .
▶ debian/compat: Debhelper compatibility version▶ Defines precise behaviour of dh_*
▶ New syntax: Build-Depends: debhelper-compat (= 13)
Debian パッケージングチュートリアル

21 / 90

debhelper を用いた debian/rules (1/2)#!/ usr / bin / make -f# Uncomment this to turn on verbose mode .
# export DH_VERBOSE =1
build :$ ( MAKE )# docbook - to - man debian / packagename . sgml > packagename .1
clean :
dh_testdir
dh_testrootrm -f build - stamp configure - stamp$ ( MAKE ) clean
dh_cleaninstall : build
dh_testdir
dh_testroot
dh_clean -k
dh_installdirs# Add here commands to install the package into debian / package$ ( MAKE ) DESTDIR = $ ( CURDIR )/ debian / packagename install
Debian パッケージングチュートリアル

22 / 90

debhelper を用いた debian/rules (2/2)# Build architecture - independent files here .
binary - indep : build install# Build architecture - dependent files here .
binary - arch : build install
dh_testdir
dh_testroot
dh_installchangelogs
dh_installdocs
dh_installexamples
dh_install
dh_installman
dh_link
dh_stripdh_compress
dh_fixperms
dh_installdeb
dh_shlibdeps
dh_gencontrol
dh_md5sums
dh_builddeb
binary : binary - indep binary - arch
. PHONY : build clean binary - indep binary - arch binary install configure
Debian パッケージングチュートリアル

23 / 90

CDBS▶ debhelper では、まだ無駄がたくさん▶ 共通機能を分解する第 2 レベルヘルパー▶ 例: ./configure && make && make install での構築や CMake での構築▶ CDBS:▶ 2005 年に GNU make マジックを発展させたものをベースに導入▶ ドキュメント: /usr/share/doc/cdbs/▶ Perl, Python, Ruby, GNOME, KDE, Java, Haskell, . . . をサポート▶ でも嫌いな人が:▶ パッケージ構築のカスタマイズが難しい場合がある:"makefile と環境変数の絡みあった迷宮"▶ 素の debhelper より遅い (無意味な dh_* をたくさん呼び出す)#!/ usr / bin / make -f
include / usr / share / cdbs /1/ rules / debhelper . mk
include / usr / share / cdbs /1/ class / autotools . mk
# add an action after the build
build / mypackage ::/ bin / bash debian / scripts / foo . sh
Debian パッケージングチュートリアル

24 / 90

Dh (Debhelper 7, dh7)
▶ CDBS キラー として 2008 年に導入
▶ dh_* を呼び出す dh コマンド▶ オーバーライドのみを列挙するシンプルな debian/rules▶ CDBS よりもカスタマイズが簡単▶ 文書: man ページ (debhelper(7), dh(1)) + DebConf9 talk のスライド
http://kitenet.net/~joey/talks/debhelper/debhelper-slides.pdf#!/ usr / bin / make -f%:
dh $@override_dh_auto_configure :d h _ a u t o _ c o n f i g u r e -- -- with - kitchen - sinkoverride_dh_auto_build :make world

Debian パッケージングチュートリアル

25 / 90

Classic debhelper vs CDBS vs dh▶ Mind shares:
Classic debhelper: 15%

CDBS: 15%

dh: 68%▶ どれを学ぶべき?
▶ おそらく少しづつでもすべて▶ dh や CDBS を使うには debhelper を知る必要▶ CDBS パッケージを変更するかも▶ 新しいパッケージにはどれを使うべき?
▶ dh (これだけマインドシェアが上昇)▶ See https://trends.debian.net/#build-systems

Debian パッケージングチュートリアル

26 / 90

アウトライン
1

はじめに

2

ソースパッケージの作成

3

パッケージの構築とテスト

4

練習問題 1: grep パッケージの変更

5

高度なパッケージングの話題

6

Debian でのパッケージメンテナンス

7

まとめ

8

Additional practical sessions

9

練習問題の解答

Debian パッケージングチュートリアル

27 / 90パッケージの構築▶ apt-get build-dep mypackage
構築依存関係 をインストール (Debian にパッケージあり)または mk-build-deps -ir (まだアップロードされていないパッケージ)▶ debuild: 構築、lintian によるテスト、GPG での署名
▶ dpkg-buildpackage を直接呼び出すのも可能▶ 通常は dpkg-buildpackage -us -uc▶ クリーン & 最小の環境でパッケージを構築するのが良い▶ pbuilder – chroot 内でパッケージを構築するヘルパー
よいドキュメント: https://wiki.ubuntu.com/PbuilderHowto(最適化: cowbuilder ccache distcc)▶ schroot と sbuild: Debian 構築デーモンで使用(pbuilder ほどシンプルではないが LVM スナップショットが取れる
https://help.ubuntu.com/community/SbuildLVMHowto を参照)
▶ .deb ファイルと .changes ファイルを生成▶ .changes: 何を構築したかを説明 (パッケージのアップロードに使用)
Debian パッケージングチュートリアル

28 / 90パッケージのインストールとテスト▶ ローカルでパッケージをインストール: debi (インストール時の情報に.changes を利用)
▶ パッケージの内容一覧: debc ../mypackage<TAB>.changes▶ 旧バージョンのパッケージとの比較:
debdiff ../mypackage_1_*.changes ../mypackage_2_*.changes
もしくはソースパッケージの比較:
debdiff ../mypackage_1_*.dsc ../mypackage_2_*.dsc▶ lintian によるパッケージのチェック (静的解析):
lintian ../mypackage<TAB>.changes
lintian -i: エラーの詳細情報を表示
lintian -EviIL +pedantic: もっと問題を表示▶ Debian にパッケージをアップロード (dput) (要設定)▶ Manage a private Debian archive with reprepro or aptly
Documentation:
https://wiki.debian.org/HowToSetupADebianRepository
Debian パッケージングチュートリアル

29 / 90

アウトライン
1

はじめに

2

ソースパッケージの作成

3

パッケージの構築とテスト

4

練習問題 1: grep パッケージの変更

5

高度なパッケージングの話題

6

Debian でのパッケージメンテナンス

7

まとめ

8

Additional practical sessions

9

練習問題の解答

Debian パッケージングチュートリアル

30 / 90

練習問題 1: grep パッケージの変更
1

2

3
4

Go to http://ftp.debian.org/debian/pool/main/g/grep/ anddownload version 2.12-2 of the package▶ ソースパッケージを自動展開しなければ
dpkg-source -x grep_*.dsc として展開
debian/ の中を見よ。
▶ このソースパッケージからの、バイナリーパッケージの生成数は?
▶ このパッケージで利用しているパッケージヘルパーは?
パッケージを構築せよ
今度はパッケージの変更をしよう。changelog エントリーを追加し、バージョン番号を増加せよ。

5

今度は、perl-regexp サポートを無効にせよ (./configure オプション)

6

パッケージを再構築せよ

7

元のパッケージと新しいものを debdiff で比較せよ

8

新しく構築したパッケージをインストールせよ
Debian パッケージングチュートリアル

31 / 90

アウトライン
1

はじめに

2

ソースパッケージの作成

3

パッケージの構築とテスト

4

練習問題 1: grep パッケージの変更

5

高度なパッケージングの話題

6

Debian でのパッケージメンテナンス

7

まとめ

8

Additional practical sessions

9

練習問題の解答

Debian パッケージングチュートリアル

32 / 90

debian/copyright▶ ソースとパッケージの著作権・ライセンス情報▶ 伝統的にテキストファイル▶ New machine-readable format:
https://www.debian.org/doc/packaging-manuals/copyright-format/1.0/
Format : https :// www . debian . org / doc / packaging - manuals / copyright - format /1.0/
Upstream - Name : X Solitaire
Source : ftp :// ftp . example . com / pub / games
Files : *Copyright : Copyright 1998 John Doe < jdoe@example . com >License : GPL -2+
This program is free software ; you can redistribute it[...].
On Debian systems , the full text of the GNU General Public
License version 2 can be found in the file‘/ usr / share / common - licenses / GPL -2 ’.
Files : debian /*Copyright : Copyright 1998 Jane Smith < jsmith@example . net >License :[ LICENSE TEXT ]Debian パッケージングチュートリアル

33 / 90

上流ソースの変更
しばしば必要:▶ バグ修正や Debian 特有のカスタマイズを追加▶ 新しい上流リリースからバックポート
いくつか方法あり:▶ 直接ファイルを編集▶ シンプル▶ 変更のドキュメントや追跡する方法がない▶ パッチシステム利用▶ 上流へ変更を送り簡単に貢献▶ 派生物と変更を共有しやすく▶ Gives more exposure to the changes
http://patch-tracker.debian.org/ (down currently)

Debian パッケージングチュートリアル

34 / 90

パッチシステム▶ 原則: 変更点は debian/patches/ にパッチとして格納▶ 適用・非適用は構築時に▶ 過去: 複数の実装 – simple-patchsys (cdbs), dpatch, quilt▶ それぞれ以下の debian/rules ターゲットをサポート:▶ debian/rules patch: 全パッチ適用▶ debian/rules unpatch: 全パッチ非適用▶ More documentation: https://wiki.debian.org/debian/patches▶ 新ソースパッケージフォーマットはパッチシステム内蔵: 3.0 (quilt)▶ 推奨解決法▶ You need to learn quilt
https://perl-team.pages.debian.net/howto/quilt.html▶ devscripts にパッチシステム非依存ツール: edit-patch

Debian パッケージングチュートリアル

35 / 90パッチのドキュメント▶ パッチの先頭に標準ヘッダー▶ DEP-3 にドキュメント - Patch Tagging Guidelines
http://dep.debian.net/deps/dep3/

Description : Fix widget frobnication speeds
Frobnicating widgets too quickly tended to cause explosions .
Forwarded : http :// lists . example . com /2010/03/1234. html
Author : John Doe < johndoe - guest@users . alioth . debian . org >Applied - Upstream : 1.2 , http :// bzr . foo . com / frobnicator / revision /123
Last - Update : 2010 -03 -29--- a / src / widgets . c+++ b / src / widgets . c@@ -101 ,9 +101 ,6 @@ struct {Debian パッケージングチュートリアル

36 / 90

インストール・削除中に行われること▶ パッケージを伸張するだけでは不十分▶ システムユーザー追加/削除、サービス開始/停止、alternatives の管理▶ メンテナースクリプト で実施
preinst, postinst, prerm, postrm▶ 共通アクションの一部は debhelper で生成可能▶ ドキュメント:▶ Debian Policy Manual, chapter 6
https://www.debian.org/doc/debian-policy/ch-maintainerscripts▶ Debian Developer’s Reference, chapter 6.4
https://www.debian.org/doc/developers-reference/best-pkging-practices.html▶ https://people.debian.org/~srivasta/MaintainerScripts.html▶ ユーザーの入力▶ debconf で行わなければならない▶ ドキュメント: debconf-devel(7) (debconf-doc パッケージ)
Debian パッケージングチュートリアル

37 / 90

上流バージョンの監視▶ どこを監視するか debian/watch に指定 (uscan(1) 参照)
version =3
http :// tmrc . mit . edu / mirror / twisted / Twisted /(\ d \.\ d )/ \Twisted -([\ d \.]*)\. tar \. bz2▶ There are automated trackers of new upstream versions, that notify the
maintainer on various dashboards including
https://tracker.debian.org/ and https://udd.debian.org/dmd/▶ uscan: 手動チェック実行▶ uupdate: 最新の上流バージョンにパッケージを更新

Debian パッケージングチュートリアル

38 / 90バージョン管理システムでのパッケージング▶ パッケージング作業でブランチやタグの管理補助ツール:
svn-buildpackage, git-buildpackage▶ 例: git-buildpackage▶ upstreamブランチは upstream/version タグで上流ソースを追跡▶ master ブランチは Debian パッケージを追跡▶ アップロードごとに debian/version タグを打つ▶ pristine-tar ブランチで上流 tar ボールを再構築
Doc: http://honk.sigxcpu.org/projects/git-buildpackage/
manual-html/gbp.html▶ debian/control の Vcs-* フィールドにリポジトリの場所を▶ https://wiki.debian.org/Salsa
Vcs - Browser : https :// salsa . debian . org / debian / devscripts
Vcs - Git : https :// salsa . debian . org / debian / devscripts . git
Vcs - Browser : https :// salsa . debian . org / perl - team / modules / packages / libwww - perl
Vcs - Git : https :// salsa . debian . org / perl - team / modules / packages / libwww - perl . git▶ VCS 非依存インターフェース: debcheckout, debcommit, debrelease▶ debcheckout grep → Git からソースパッケージをチェックアウト
Debian パッケージングチュートリアル

39 / 90パッケージのバックポート▶ 目的: 旧システム上でパッケージの新バージョンを使用する
例: unstable 由来の mutt を Debian stable で利用▶ 全体的な考え方:▶ Debian unstable からソースパッケージ取得▶ Debian stable で構築・動作するよう修正▶ 時にたいしたことはない (変更不要)▶ 時に難しい▶ 時に不可能 (大量の解決不能な依存関係)▶ Debian プロジェクトで提供・サポートするバックポート
http://backports.debian.org/

Debian パッケージングチュートリアル

40 / 90

アウトライン
1

はじめに

2

ソースパッケージの作成

3

パッケージの構築とテスト

4

練習問題 1: grep パッケージの変更

5

高度なパッケージングの話題

6

Debian でのパッケージメンテナンス

7

まとめ

8

Additional practical sessions

9

練習問題の解答

Debian パッケージングチュートリアル

41 / 90

Debian archive and suites
security teamdeveloper
experimental
unstabletesting-proposed-updates

stable-proposed-updates

testing
stablereleasemanagement
securitystable-new

stable-updates

package uploads
package migrations between suites
development

test

internal

production

stablepoint
releasepreparation ofnext releasestablereleasestablebackports

oldstablearchive.d.oBased on graph by Antoine Beaupré. https://salsa.debian.org/debian/package- cycle

Debian パッケージングチュートリアル

42 / 90

Suites for development▶ New versions of packages are uploaded to unstable (sid)▶ Packages migrate from unstable to testing based on several criterias(e.g. has been in unstable for 10 days, and no regressions)▶ New packages can also be uploaded to:▶ experimental (for more experimental packages, such as when the
new version is not ready to replace the one currently in unstable)▶ testing-proposed-updates, to update the version in testing without
going through unstable (this is rarely used)

Debian パッケージングチュートリアル

43 / 90

Freezing and releasing▶ At some point during the release cycle, the release team decides to freeze
testing: automatic migrations from unstable to testing are stopped, andreplaced by manual review▶ When the release team considers testing to be ready for release:▶ The testing suite becomes the new stable suite▶ Similarly, the old stable becomes oldstable▶ Unsupported releases are moved to archive.debian.org▶ See https://release.debian.org/

Debian パッケージングチュートリアル

44 / 90

Stable release suites and management▶ Several suites are used to provide stable release packages:▶ stable: the main suite▶ security updates suite provided on security.debian.org, used by
the security team. Updates are announced on thedebian-security-announce mailing list▶ stable-updates: updates that are not security related, but that shouldurgently be installed (without waiting for the next point release):
antivirus databases, timezone-related packages, etc. Announced on
the debian-stable-announce mailing list
▶ backports: new upstream versions, based on the version in testing▶ The stable suite is updated every few months by stable point releases(that include only bug fixes)▶ Packages targetting the next stable point release are uploaded tostable-proposed-updates and reviewed by the release team▶ The oldstable release has the same set of suites
Debian パッケージングチュートリアル

45 / 90

Debian に貢献するさまざまな方法▶ 貢献の よくない 方法:
自分のアプリケーションをパッケージング
Debian を理解した気になる
3 いなくなる
1
2▶ 貢献の よりまし な方法:
▶ パッケージングチームに参加▶ パッケージ群にフォーカスした、たくさんのチーム▶ List available at https://wiki.debian.org/Teams▶ 経験豊富な貢献者から学ぶ、優れた方法▶ メンテナンスされていないパッケージ (メンテナー不在パッケージ)の引き取り▶ Debian に新しいソフトウェアを導入▶ 興味深い/便利なものならぜひ▶ すでに同じパッケージが Debian にないか?
Debian パッケージングチュートリアル

46 / 90メンテナー不在パッケージの引き取り▶ Debian にはメンテナンスされていないパッケージが大量にある▶ Full list + process: https://www.debian.org/devel/wnpp/▶ Installed on your machine: wnpp-alert
Or better: how-can-i-help▶ それぞれの状態:▶ Orphaned (メンテナー不在): このパッケージはメンテナンスされていない
気軽に引き取って▶ RFA: Request For Adopter (引き取り求む)
メンテナーが作業継続困難につき、引き取り手を探している。
気軽に引き取って。現メンテナーにメールするのが丁寧▶ ITA: Intent To Adopt (引き取り予定)
誰かがパッケージを引き取ろうとしている
手伝いを申し込むときに!
▶ RFH: Request For Help (助け求む)
メンテナーが助けを求めている▶ 非メンテナンスパッケージを未検出 →まだメンテナー不在ではない▶ 不明点は debian-qa@lists.debian.org や
irc.debian.org の #debian-qa で質問

Debian パッケージングチュートリアル

47 / 90パッケージの引き取り: 例
From : You < you@yourdomain >To : 640454 @bugs . debian . org , control@bugs . debian . org
Cc : Francois Marier < fran coi s@de bian . org >Subject : ITA : verbiste -- French conjugator
retitle 640454 ITA : verbiste -- French conjugatorowner 640454 !
thanksHi ,I am using verbiste and I am willing to take care of the package .
Cheers ,You▶ 元メンテナーに丁寧に連絡を (特にまだメンテナー不在ではなく RFA パ
ッケージの時)▶ 上流プロジェクトに連絡するとよい

Debian パッケージングチュートリアル

48 / 90

Debian に自分のパッケージを提供▶ Debian に自分のパッケージを提供するのに公式ステータスは不要
1reportbug wnpp で ITP バグ (Intent To Package パッケージング宣言) を送信2

ソースパッケージの準備

3

パッケージをスポンサーしてくれる Debian 開発者を探す▶ 公式ステータス (経験豊富なパッケージメンテナーの場合):▶ Debian Maintainer (DM):
Permission to upload your own packages
See https://wiki.debian.org/DebianMaintainer▶ Debian Developer (DD):
Debian プロジェクトメンバー (投票および任意のパッケージをアップロード)

Debian パッケージングチュートリアル

49 / 90

スポンサーを探す前にやっておくこと▶ Debian は 品質重視
▶ 一般的に スポンサーは忙しく、探すのは大変▶ スポンサーを探す前に、自分のパッケージは準備万端か確認▶ チェック項目:▶ 構築依存関係の不備はないか: クリーンな sid chroot できちんとパッ
ケージが構築できるか確認▶ pbuilder の利用を推奨▶ 自分のパッケージに lintian -EviIL +pedantic を実行▶ エラーは必ず修正。その他の問題も修正すべき▶ もちろん、詳細なパッケージのテストをしておく▶ 不明点は質問する

Debian パッケージングチュートリアル

50 / 90

どこで助けを探す?
必要とする助け▶ 疑問に対する助言や回答、コードレビュー▶ パッケージの準備ができたらスポンサーにアップロードしてもらう
助けはここから:▶ パッケージングチームの他のメンバー▶ List of teams: https://wiki.debian.org/Teams▶ Debian メンターグループ (パッケージがチームに合わない場合)▶ https://wiki.debian.org/DebianMentorsFaq▶ メーリングリスト: debian-mentors@lists.debian.org(偶然学ぶにもいい方法)▶ IRC: irc.debian.org の #debian-mentors▶ http://mentors.debian.net/▶ ドキュメント: http://mentors.debian.net/intro-maintainers▶ 地域化メーリングリスト (自分の言語で助けを求む)▶ debian-devel@lists.debian.or.jp▶ 全メーリングリスト: https://lists.debian.org/devel.html▶ ユーザーのメーリングリスト:
https://lists.debian.org/users.html
Debian パッケージングチュートリアル

51 / 90

さらなるドキュメント▶ Debian Developers’ Cornerhttps://www.debian.org/devel/
Links to many resources about Debian development▶ Guide for Debian Maintainers
https://www.debian.org/doc/manuals/debmake-doc/▶ Debian Developer’s Reference
https://www.debian.org/doc/developers-reference/
Mostly about Debian procedures, but also some best packaging practices (part 6)▶ Debian Policy
https://www.debian.org/doc/debian-policy/▶ すべてのパッケージが満たすべき要件▶ Perl, Java, Python, . . . の具体的なポリシー▶ Ubuntu パッケージングガイド
https://packaging.ubuntu.com/html/

Debian パッケージングチュートリアル

52 / 90メンテナー向け Debian ダッシュボード▶ Source package centric:
https://tracker.debian.org/dpkg▶ Maintainer/team centric: Developer’s Packages Overview (DDPO)
https://qa.debian.org/developer.php?login=pkg-ruby-extras-maintainers@lists.alioth.debian.org▶ TODO-list oriented: Debian Maintainer Dashboard (DMD)
https://udd.debian.org/dmd/

Debian パッケージングチュートリアル

53 / 90

バグ追跡システム (BTS) の利用▶ バグを管理する唯一の方法▶ バグを見る Web インターフェース▶ バグを変更する Email インターフェース▶ バグに情報を付加:▶ 123456@bugs.debian.org に送信 (送信者を含まない。含める場合は123456-submitter@bugs.debian.org を追加)
▶ バグの状態変更:▶ control@bugs.debian.org にコマンド送信▶ コマンドラインインターフェース: devscripts の bts コマンド
▶ Documentation: https://www.debian.org/Bugs/server-control▶ バグの報告: reportbug を利用▶ ローカルメールサーバー使用: ssmtp や nullmailer をインストール▶ または reportbug --template を使用し submit@bugs.debian.org
へ (手動で) 送信

Debian パッケージングチュートリアル

54 / 90

BTS の利用例:▶ Sending an email to the bug and the submitter:
https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=680822#10▶ Tagging and changing the severity:
https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=680227#10▶ Reassigning, changing the severity, retitling . . . :https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=680822#93▶ notfound, found, notfixed, fixed は バージョン追跡 される
https://wiki.debian.org/HowtoUseBTS#Version_tracking 参照▶ Using usertags: https://bugs.debian.org/cgi-bin/bugreport.cgi?msg=42;bug=642267
See https://wiki.debian.org/bugs.debian.org/usertags▶ BTS のドキュメント:▶ https://www.debian.org/Bugs/▶ https://wiki.debian.org/HowtoUseBTS

Debian パッケージングチュートリアル

55 / 90

Ubuntu の方が興味ある?
▶ Ubuntu では主に、Debian から分岐して管理▶ 特定のパッケージに注目しているわけではないが、Debian チームと協力▶ 通常はまず、Debian への新しいパッケージのアップロードを推奨
https://wiki.ubuntu.com/UbuntuDevelopment/NewPackages▶ おそらくもっと良い案:▶ Debian チームに参加し Ubuntu との橋渡し▶ 差異を縮小し Launchpad のバグの処理順を決める手伝い▶ Debian のツールの多くが助けに:▶ Developer’s Packages Overview のUbuntu 列▶ パッケージ追跡システムの Ubuntu ボックス
▶ PTS 経由での launchpad バグメール受信

Debian パッケージングチュートリアル

56 / 90

アウトライン
1

はじめに

2

ソースパッケージの作成

3

パッケージの構築とテスト

4

練習問題 1: grep パッケージの変更

5

高度なパッケージングの話題

6

Debian でのパッケージメンテナンス

7

まとめ

8

Additional practical sessions

9

練習問題の解答

Debian パッケージングチュートリアル

57 / 90

まとめ▶ Debian のパッケージングについて全体を見渡した▶ しかしもっと詳細なドキュメントが必要になる▶ ベストプラクティスは長年にわたって発展▶ よくわからなければ dh パッケージングヘルパーと 3.0 (quilt) フォーマットを使うフィードバック: packaging-tutorial@packages.debian.org

Debian パッケージングチュートリアル

58 / 90

法的事項

Copyright ©2011–2019 Lucas Nussbaum – lucas@debian.org
This document is free software: you can redistribute it and/or modify it under either(at your option):▶ The terms of the GNU General Public License as published by the Free Software
Foundation, either version 3 of the License, or (at your option) any later version.
http://www.gnu.org/licenses/gpl.html▶ The terms of the Creative Commons Attribution-ShareAlike 3.0 Unported License.
http://creativecommons.org/licenses/by-sa/3.0/

Debian パッケージングチュートリアル

59 / 90このチュートリアルへの貢献▶ 貢献:▶ apt-get source packaging-tutorial▶ debcheckout packaging-tutorial▶ git clone
https://salsa.debian.org/debian/packaging-tutorial.git▶ https://salsa.debian.org/debian/packaging-tutorial▶ 未修正バグ: bugs.debian.org/src:packaging-tutorial▶ フィードバックの送り先:▶ mailto:packaging-tutorial@packages.debian.org▶ このチュートリアルに何を追加すべき?
▶ もっと良くするには?
▶ reportbug packaging-tutorial

Debian パッケージングチュートリアル

60 / 90

アウトライン
1

はじめに

2

ソースパッケージの作成

3

パッケージの構築とテスト

4

練習問題 1: grep パッケージの変更

5

高度なパッケージングの話題

6

Debian でのパッケージメンテナンス

7

まとめ

8

Additional practical sessions

9

練習問題の解答

Debian パッケージングチュートリアル

61 / 90

練習問題 2: GNUjump のパッケージング
1

2

3

GNUjump 1.0.8 をhttp://ftp.gnu.org/gnu/gnujump/gnujump-1.0.8.tar.gz からダウンロードせよ
この Debian パッケージを作成せよ▶ パッケージを構築するため構築依存関係パッケージをインストール▶ Fix bugs
▶ パッケージの基本作業を確認▶ debian/control や他のファイルに記入して完成
楽しむこと

Debian パッケージングチュートリアル

62 / 90

Practical session 2: packaging GNUjump (tips)▶ To get a basic working package, use dh_make▶ To start with, creating a 1.0 source package is easier than 3.0 (quilt)(change that in debian/source/format)▶ To search for missing build-dependencies, find a missing file, and use
apt-file to find the missing package▶ If you encounter that error:/ usr / bin / ld : SDL_rotozoom . o : undefined reference to symbol ’ ceil@@GLIBC_2 .2.5 ’// lib / x86_64 - linux - gnu / libm . so .6: error adding symbols : DSO missing from command line
collect2 : error : ld returned 1 exit status
Makefile :376: recipe for target ’ gnujump ’ failed

You need to add -lm to the linker command line:
Edit src/Makefile.am and replacegn ujum p_LD FLAG S = $ ( all_libraries )by
gn ujum p_LD FLAG S = -Wl , - - as - needed
gnujump_LDADD = $ ( all_libraries ) - lm

Then run autoreconf -i
Debian パッケージングチュートリアル

63 / 90

練習問題 3: Java ライブラリーのパッケージング

1

Java のパッケージングについてのドキュメントを参照せよ:▶ https://wiki.debian.org/Java▶ https://wiki.debian.org/Java/Packaging▶ https://www.debian.org/doc/packaging-manuals/java-policy/▶ /usr/share/doc/javahelper/tutorial.txt.gz

2

http://moepii.sourceforge.net/ から IRClib をダウンロードせよ

3

パッケージを作成せよ

Debian パッケージングチュートリアル

64 / 90

練習問題 4: Ruby gem のパッケージング

1

Ruby のパッケージングについてのドキュメントを参照せよ:▶ https://wiki.debian.org/Ruby▶ https://wiki.debian.org/Teams/Ruby▶ https://wiki.debian.org/Teams/Ruby/Packaging▶ gem2deb(1), dh_ruby(1) (gem2deb パッケージ内)

2

3

Create a basic Debian source package from the peach gem:
gem2deb peach
きちんとした Debian パッケージになるよう改良せよ

Debian パッケージングチュートリアル

65 / 90

練習問題 5: Perl モジュールのパッケージング

1

Perl のパッケージングについてのドキュメントを参照せよ:▶ https://perl-team.pages.debian.net▶ https://wiki.debian.org/Teams/DebianPerlGroup▶ dh-make-perl(1), dpt(1) (pkg-perl-tools パッケージ内)

2

3

Acme CPAN ディストリビューションから基本的な Debian ソースパッケ
ージを作成せよ:dh-make-perl --cpan Acme
きちんとした Debian パッケージになるよう改良せよ

Debian パッケージングチュートリアル

66 / 90

アウトライン
1

はじめに

2

ソースパッケージの作成

3

パッケージの構築とテスト

4

練習問題 1: grep パッケージの変更

5

高度なパッケージングの話題

6

Debian でのパッケージメンテナンス

7

まとめ

8

Additional practical sessions

9

練習問題の解答

Debian パッケージングチュートリアル

67 / 90

解答
練習問題

Debian パッケージングチュートリアル

68 / 90

練習問題 1: grep パッケージの変更
1

2

3
4

Go to http://ftp.debian.org/debian/pool/main/g/grep/ anddownload version 2.12-2 of the package
debian/ の中を見よ。
▶ このソースパッケージからの、バイナリーパッケージの生成数は?
▶ このパッケージで利用しているパッケージヘルパーは?
パッケージを構築せよ
今度はパッケージの変更をしよう。changelog エントリーを追加し、バージョン番号を増加せよ。

5

今度は、perl-regexp サポートを無効にせよ (./configure オプション)

6

パッケージを再構築せよ

7

元のパッケージと新しいものを debdiff で比較せよ

8

新しく構築したパッケージをインストールせよ

Debian パッケージングチュートリアル

69 / 90

ソースの取得
1

Go to http://ftp.debian.org/debian/pool/main/g/grep/ anddownload version 2.12-2 of the package▶ Use dget to download the .dsc file:
dget http://cdn.debian.net/debian/pool/main/g/grep/grep_2.12-2.dsc▶ If you have deb-src for a Debian release that has grep version 2.12-2(find out on https://tracker.debian.org/grep), you can use: apt-get
source grep=2.12-2
or apt-get source grep/release (e.g. grep/stable)or, if you feel lucky: apt-get source grep
▶ grep のソースパッケージは以下の 3 ファイル:▶ grep_2.12-2.dsc▶ grep_2.12-2.debian.tar.bz2▶ grep_2.12.orig.tar.bz2
典型的な "3.0 (quilt)" フォーマット
▶ If needed, uncompress the source with
dpkg-source -x grep_2.12-2.dsc
Debian パッケージングチュートリアル

70 / 90パッケージを見回して構築
2

Look at the files in debian/▶ このソースパッケージからの、バイナリーパッケージの生成数は?
▶ このパッケージで利用しているパッケージヘルパーは?

▶ debian/control によると、このパッケージは grep という名前のバイナ
リーパッケージをひとつだけ生成する。
▶ debian/rules によると、このパッケージは CDBS や dh を使わず、classic debhelper でパッケージングされている。debian/rules で、さま
ざまな dh_* コマンドを呼び出していることがわかる。
3

パッケージを構築せよ▶ apt-get build-dep grep を使用して、構築依存のパッケージを取得▶ その後 debuild や dpkg-buildpackage -us -uc を実行 (1 分ほどかかる)

Debian パッケージングチュートリアル

71 / 90

changelog の編集

4

今度はパッケージの変更をしよう。changelog エントリーを追加し、バージョン番号を増加せよ。

▶ debian/changelog はテキストファイルである。手で編集して新エントリ
ーを追加する。
▶ また、dch -i を使用し、エントリーを追加しエディターを起動▶ 名前とメールアドレスは環境変数 DEBFULLNAME と DEBEMAIL で定義▶ その後、パッケージを再構築: 新バージョンのパッケージを構築▶ Package versioning is detailed in section 5.6.12 of the Debian policy
https://www.debian.org/doc/debian-policy/ch-controlfields

Debian パッケージングチュートリアル

72 / 90

Perl 正規表現の無効化と再構築

5

今度は、perl-regexp サポートを無効にせよ (./configure オプション)

6

パッケージを再構築せよ▶ ./configure --help をチェック: Perl 正規表現を無効にするオプション
は --disable-perl-regexp▶ debian/rules を編集して ./configure の行を探す▶ --disable-perl-regexp を追加▶ debuild や dpkg-buildpackage -us -uc で再構築

Debian パッケージングチュートリアル

73 / 90パッケージの比較とテスト

7

元のパッケージと新しいものを debdiff で比較せよ

8

新しく構築したパッケージをインストールせよ▶ バイナリーパッケージの比較: debdiff ../*changes▶ ソースパッケージの比較: debdiff ../*dsc▶ 新規構築パッケージをインストール:debi
または dpkg -i ../grep_<TAB>▶ grep -P foo がもう動作しない!
Reinstall the previous version of the package:▶ apt-get install --reinstall grep=2.6.3-3 (= 前バージョン)

Debian パッケージングチュートリアル

74 / 90

練習問題 2: GNUjump のパッケージング
1

2

3

GNUjump 1.0.8 をhttp://ftp.gnu.org/gnu/gnujump/gnujump-1.0.8.tar.gz からダウンロードせよ
この Debian パッケージを作成せよ▶ パッケージを構築するため構築依存関係パッケージをインストール▶ パッケージの基本作業を確認▶ debian/control や他のファイルに記入して完成
楽しむこと

Debian パッケージングチュートリアル

75 / 90

一歩ずつ. . .
▶ wget http://ftp.gnu.org/gnu/gnujump/gnujump-1.0.8.tar.gz▶ mv gnujump-1.0.8.tar.gz gnujump_1.0.8.orig.tar.gz▶ tar xf gnujump_1.0.8.orig.tar.gz▶ cd gnujump-1.0.8/▶ dh_make -f ../gnujump-1.0.8.tar.gz▶ パッケージのタイプ: 単一バイナリー (今回は)gnujump -1.0.8 $ ls debian /changelog
gnujump . default . excompatgnujump . doc - base . EX
control
init . d . ex
copyright
manpage .1. exdocs
manpage . sgml . exemacsen - install . ex manpage . xml . exemacsen - remove . exmenu . exemacsen - startup . ex postinst . ex
gnujump . cron . d . expostrm . expreinst . exprerm . ex
README . Debian
README . source
rulessourcewatch . ex

Debian パッケージングチュートリアル

76 / 90

一歩ずつ. . . (2)▶ debian/changelog, debian/rules, debian/control を見る(dh_make が自動記入)▶ debian/control では:
Build-Depends: debhelper (>= 7.0.50 ), autotools-dev
構築依存関係 = パッケージを構築するのに必要なパッケージの一覧▶ Try to build the package as-is with debuild (thanks to dh magic)▶ 構築できるまで構築依存関係を追加▶ ヒント: apt-cache search や apt-file を使ってパッケージを探す▶ 例:
checking for sdl - config ... nochecking for SDL - version >= 1.2.0... no[...]
configure : error : *** SDL version 1.2.0 not found !

→ libsdl1.2-dev を Build-Depends に追加しインストールする。
▶ ベター: pbuilder を使ってクリーンな環境で構築

Debian パッケージングチュートリアル

77 / 90

一歩ずつ. . . (3)▶ Required build-dependencies are libsdl1.2-dev,
libsdl-image1.2-dev, libsdl-mixer1.2-dev▶ Then, you will probably run into another error:/ usr / bin / ld : SDL_rotozoom . o : undefined reference to symbol ’ ceil@@GLIBC_2 .2.5 ’// lib / x86_64 - linux - gnu / libm . so .6: error adding symbols : DSO missing from command line
collect2 : error : ld returned 1 exit status
Makefile :376: recipe for target ’ gnujump ’ failed▶ This problem is caused by bitrot: gnujump has not been adjusted following
linker changes.
▶ If you are using source format version 1.0, you can directly change
upstream sources.
▶ Edit src/Makefile.am and replacegn ujum p_LD FLAG S = $ ( all_libraries )by
gn ujum p_LD FLAG S = -Wl , - - as - needed
gnujump_LDADD = $ ( all_libraries ) - lm

▶ Then run autoreconf -i
Debian パッケージングチュートリアル

78 / 90

一歩ずつ. . . (4)▶ If you are using source format version 3.0 (quilt), use quilt to prepare apatch. (see https://wiki.debian.org/UsingQuilt)▶ export QUILT_PATCHES=debian/patches▶ mkdir debian/patches
quilt new linker-fixes.patch
quilt add src/Makefile.am▶ Edit src/Makefile.am and replacegn ujum p_LD FLAG S = $ ( all_libraries )by
gn ujum p_LD FLAG S = -Wl , - - as - needed
gnujump_LDADD = $ ( all_libraries ) - lm

▶ quilt refresh▶ Since src/Makefile.am was changed, autoreconf must be called
during the build. To do that automatically with dh, change the dh callin debian/rules from: dh $ --with autotools-dev
to: dh $ --with autotools-dev --with autoreconf
Debian パッケージングチュートリアル

79 / 90

Step by step. . . (5)▶ The package should now build fine.
▶ Use debc to list the content of the generated package, and debi to installit and test it.
▶ lintian でパッケージのテスト▶ 厳格な必要条件ではないが、Debian にアップロードするパッケージは lintian-clean を推奨▶ lintian -EviIL +pedantic を使用してもっと問題を列挙できる▶ ヒント:▶ debian/ にある不要なファイルを削除▶ debian/control に記入▶ dh_auto_configure を上書きし、実行ファイルを /usr/gamesにインストール▶ Use hardening compiler flags to increase security.
See https://wiki.debian.org/Hardening
Debian パッケージングチュートリアル

80 / 90

Step by step. . . (6)▶ Debian でパッケージ化されているものと、自分のパッケージを比較:▶ データファイルを、第 2 のパッケージへ分割し、全アーキテクチャ
で同じ物にしている (→ Debian アーカイブの使用量を抑える)▶ .desktop ファイル (GNOME/KDE メニュー向け) をインストールし、Debian メニューに統合もしている▶ パッチを使用し、小さな問題を修正している

Debian パッケージングチュートリアル

81 / 90

練習問題 3: Java ライブラリーのパッケージング

1

Java のパッケージングについてのドキュメントを参照せよ:▶ https://wiki.debian.org/Java▶ https://wiki.debian.org/Java/Packaging▶ https://www.debian.org/doc/packaging-manuals/java-policy/▶ /usr/share/doc/javahelper/tutorial.txt.gz

2

http://moepii.sourceforge.net/ から IRClib をダウンロードせよ

3

パッケージを作成せよ

Debian パッケージングチュートリアル

82 / 90

一歩ずつ. . .

▶ apt-get install javahelper▶ 基本的なソースパッケージを作成: jh_makepkg▶ ライブラリー▶ なし▶ デフォルトのフリーなコンパイラー/ランタイム▶ debian/ の中を見て修正▶ dpkg-buildpackage -us -uc または debuild▶ lintian, debc, etc.
▶ 自分の結果と libirclib-java ソースパッケージを比較

Debian パッケージングチュートリアル

83 / 90

練習問題 4: Ruby gem のパッケージング

1

Ruby のパッケージングについてのドキュメントを参照せよ:▶ https://wiki.debian.org/Ruby▶ https://wiki.debian.org/Teams/Ruby▶ https://wiki.debian.org/Teams/Ruby/Packaging▶ gem2deb(1), dh_ruby(1) (gem2deb パッケージ内)

2

3

Create a basic Debian source package from the peach gem:
gem2deb peach
きちんとした Debian パッケージになるよう改良せよ

Debian パッケージングチュートリアル

84 / 90

一歩ずつ. . .
gem2deb peach:▶ rubygems.org から gem をダウンロード▶ ひと揃いの .orig.tar.gz アーカイブを作成し、tar を展開▶ gem のメタデータを基に Debian ソースパッケージを初期化▶ ruby-gemname という名前▶ Debian バイナリーパッケージの生成をしてみる (多分失敗)
dh_ruby (gem2deb に同梱) は Ruby 特有のタスク:▶ C の拡張を各 Ruby バージョン向けに構築▶ 宛先ディレクトリーにファイルをコピー▶ 実行スクリプトのシェバングを更新▶ Run tests defined in debian/ruby-tests.rb, debian/ruby-tests.rake,or debian/ruby-test-files.yaml, as well as various other checks

Debian パッケージングチュートリアル

85 / 90

一歩ずつ. . . (2)生成したパッケージを改良:▶ debclean を実行してソースツリーを掃除。debian/ を見る。
▶ changelog や compat が正しいか▶ Edit debian/control: improve Description▶ 上流ファイルを基に copyright ファイルを適切に記述▶ パッケージを構築せよ▶ Compare your package with the ruby-peach package in the Debianarchive

Debian パッケージングチュートリアル

86 / 90

練習問題 5: Perl モジュールのパッケージング

1

Perl のパッケージングについてのドキュメントを参照せよ:▶ https://perl-team.pages.debian.net▶ https://wiki.debian.org/Teams/DebianPerlGroup▶ dh-make-perl(1), dpt(1) (pkg-perl-tools パッケージ内)

2

3

Acme CPAN ディストリビューションから基本的な Debian ソースパッケ
ージを作成せよ:dh-make-perl --cpan Acme
きちんとした Debian パッケージになるよう改良せよ

Debian パッケージングチュートリアル

87 / 90

一歩ずつ. . .

dh-make-perl --cpan Acme:▶ CPAN から tarball をダウンロード▶ ひと揃いの .orig.tar.gz アーカイブを作成し、tar を展開▶ ディストリビューションのメタデータを基に Debian ソースパッケージを初期化▶ libdistname -perl という名前

Debian パッケージングチュートリアル

88 / 90

一歩ずつ. . . (2)生成したパッケージを改良:▶ debian/changelog, debian/compat, debian/libacme-perl.docs、および debian/watch は正しいはずです▶ debian/control を編集: Description を改良、および一番下の定型文を削除▶ debian/copyright を編集: 一番上の定型の段落を削除、Files: * stanzaに著作権の年を追加

Debian パッケージングチュートリアル

89 / 90

翻訳

このチュートリアルは倉澤望が日本語訳しました。
この翻訳についての意見・要望は<debian-doc@debian.or.jp> にお知らせください。

Debian パッケージングチュートリアル

90 / 90