吉田 俊
輔
|
この記事は Debian パッケージを作った経験が無い人むけに一番わかりやすいと思われる dh_make を使ったパッケージの作成 について説明しています。
前提知識としてはある程度 make(Makefile) を理解している必要がありますが、 多くはありません。 若干はこのドキュメント 中で説明します。
通常のパッケージシステムのメリットとして tar ボール (*.tar.gz などで圧縮されたアーカイブファイル) を使った場合に比較 して、 複数マシンへのインストール、 環境再現が簡単、 便利、 パッケージのアンインストール、 バージョンアップが容易といっ た点が挙げられます。
deb パッケージを作るメリットとしては、 それらに加え、 ソースファイルとパッチファイルの管理が簡単、 ビルドに必要な環 境(のパッケージ) を整備するのが簡単、 等のメリットが挙げられるでしょう。
もちろんパッケージを作りたい理由は人それぞれと思いますが、 自分の使いたいアプリ/機能がパッケージになっていないと いう理由が多いでしょう。
Debian Developer(Debian 開発者:DD) になるためと言う人もいるかもしれません。
dh_make コマンドは dh-make パッケージに含まれるコマンドで、 パッケージを作る際に一般的な内容のひな形を作ってくれ るツールです。
ソフトウェアのソースコードを展開したディレクトリの中で、 このコマンドを実行すると、 対話的 なやりとりを行ったあと、 ひな形として debhelper スタイルのディレクトリとファイルを準備しま す*1 。
deb パッケージを作る方法 (スタイル) についてはいくつかあります。 今回説明するのは dh_make の debhelper スタイルにつ いてです。 そのほかに同様に debhelper スタイルを使用した dpatch,CDBS,dbs,quilt,yada といったスタイルがあるそう です。
その他にもスクリプト言語向け等にもいくつかスタイルがあるようです。 debhelper スタイルは debian では もっとも一般的でシンプルなスタイルです。 現在の debian パッケージで採用しているパッケージの割合が もっとも多いと言われています。 基本的に dh_ コマンドを rules というファイルからから呼び出す形式となり ます。
dh_make が作成する、 debhelper スタイルのパッケージ作成に最低限必要なファイルとして以下の2つのディレクトリと、 4 つのファイルがあります。
まず、 作業に使うディレクトリ名の形式が決まっています。 その下に debian ディレクトリが作成され、 パッケージングに必 要なファイルはここにすべて置かれます。 必要なファイルについてはひな形が dh_make で準備されます。
softname-version/ (ディレクトリ名)
debian/ (Debian ディレクトリの存在=deb パッケージが作成可能) control (パッケージ情報:パッケージ名、 バージョンの記述) changelog (更新履歴) copyright (著作権情報の記述) rules (rules パッケージの作成方法を記述) |
以下は dh_make が準備するサンプルのファイルです。 これらも同様に dh_make で debian ディレクトリの下に準備されます。 必須ではありませんので、 必要に応じて利用します。
debian/
README.Debian(オリジナルとパッケージ化したときの差分情報) conffiles.ex(設定ファイル名のリスト) cron.d.ex(cron で実行するファイル名リスト) dirs docs init.d.ex(サービスの起動スクリプト) manpage.1.ex, manpage.sgml.ex(man ファイル) preinst.ex(インストール前のスクリプト) postinst.ex(インストール後のスクリプト) prerm.ex(アンインストール前のスクリプト) postrm.ex(アンインストール後のスクリプト) 等 |
db_make を使ったパッケージの新規作成の流れとしては以下のようになります。
$ dh_make
|
$ dch
|
$ dpkg-buildpackage(deb パッケージの作成)
|
通常、 tar ボール等で配布されているファイルを展開し、 その展開されたディレクトリ名を修正(リネーム) し ます。
dh_make でひな形を作るためには packagename-version の形式である必要がありますので、 上記の形式になっていない場 合は適切にリネームを行ってください。
dh_make でのひな形の作成です。
上記で適切な形式にリネームされたディレクトリに cd し、 dh_make を実行します。 その際、 可能ならライセンスの指定を 行った方が良いでしょう。 後々の手間が省けます。
また、 環境変数からメンテナ名とそのメールアドレスを取得しますので、 あらかじめ下記の環境変数を設定しておくことを おすすめします。 これも後々の手間が省けます。
dh_make を実行すると、 パッケージの種類を選択します。 今回の例では Single binary (s) を選択します。
その他、 許諾条件(ライセンス) の指定 (-c) も可能です。 指定できる許諾条件(ライセンス) は gpl、 lgpl、 artistic、 bsd です。
指定できるパッケージ種類は Single binary (s)/Multiple binary (m)/Library (l)/Kernel module (k)/cdbs (b) です。
環境変数は、 DEBFULLNAME(メンテナ名)、 DEBEMAIL(メールアドレス) で指定します。
次に、 debian/changelog の記述の記述について説明します。 まず、 このファイルはテキストファイルですが、 形式が厳密に決 まっており、 直接エディタで修正するのはおすすめしません。
たとえば、
$ dch -i
|
を使えば定型の形式部分は自動的に記入できるのでおすすめです。
次に、 debian/changelog の先頭にあるバージョン情報がこれから作成されるパッケージのバージョンとして使用されます。 必要なら修正を行ってください。
次がパッケージの状態ですが、 通常は unstable で問題ありません。
次は緊急度ですがこれも low で問題ないでしょう。
実際の変更履歴としての内容はアスタリスク (*) の後にコメントとして記述します。 その後の定型 dch が作成してくれる内 容をそのまま使うのが良いでしょう。
debian/changelog:
smp-mgzip (1.2c-1) unstable; urgency=low
* Initial release (Closes: #nnnn) <nnnn is the bug number of your ITP> -- yoshida syunsuke <koedoyoshida@gmail.com> Sun, 30 Mar 2008 22:21:28 +0900 |
control ファイルにパッケージ名や依存関係を記述します。
ここではソースパッケージとバイナリパッケージで分けて記載します。
Section には main (完全にフリーなソフトウェア)、 non-free (実際の所フリーであるとはいえないソフトウェア)、 そして contrib (それ自身はフリーなソフトウェアであるけれども、 non-free なソフトウェアが無ければ使えないもの) があります。 更に、 これらの下には各パッケージをおおまかに分類する論理的なサブセクションが用意されており、 そこに含ま れるパッケージの種類を簡単に説明するような名前がつけられています。 管理者専用のプログラムのため に「admin」 、 基本的なツールのために「base」 、 プログラマーのためのツールが含まれる「devel」 、 文 書の「doc」 、 ライブラリの「libs」 、 電子メールの読み書きに使うリーダや電子メールサーバを構築する ためのデーモンは「mail」 、 ネットワーク関係のアプリケーションやデーモンの「net」 、 他のどんな分類に もあてはまらないような X11 用のプログラムは「x11」 など、 そしてさらに多くのものが用意されていま す。 デフォルトは main ですので、 ここに記載すると main のサブセクションを指定するということになり ます。
Priority はこのパッケージをインストールすることがユーザにとってどれくらい重要なものかを示してい ます。
新規パッケージの場合、 優先度「optional」 (選択可能) としておけば、 通常は問題無いでしょう。
バイナリパッケージについては CPU 等のアーキティクチャに依存する物 (バイナリの実行ファイル等を含む場合) は any, ス クリプトやドキュメントなどアーキティクチャに依存しない場合は all を指定します。 その他の項目は必要なら修正してくだ さい。
debian/control:
Source: smp-mgzip(ソースパッケージ名)
Section: unknown(パッケージのセクション) Priority: extra(パッケージの重要度) Maintainer: yoshida syunsuke <koedoyoshida@gmail.com>(メンテナーの名前とメールアドレス) Build-Depends: debhelper (>= 5), autotools-dev(ビルドに必要なパッケージ) Standards-Version: 3.7.2(テンプレート作成に参照した Debian ポリシー標準のバージョン) Package: smp-mgzip(バイナリパッケージ名) Architecture: any(対応アーキティクチャ) Depends: ${shlibs:Depends}, ${misc:Depends}(パッケージの依存関係) Description: <insert up to 60 chars description>(パッケージの説明) <insert long description, indented with spaces> |
ファイルの著作権と許諾条件(ライセンス) についての記述です。
dh_make 実行時にライセンスを指定しておけばひな形が作成されます。 ソフトウェアによってはディレクトリやファイルご とに別のライセンスの場合もありますので、 注意してください。 debian/copyright
This package was debianized by yoshida syunsuke <koedoyoshida@gmail.com> on
Sun, 30 Mar 2008 22:21:28 +0900. It was downloaded from <fill in http/ftp site> Upstream Author: <put author(s) name and email here> Copyright: <put the year(s) of the copyright, and the names of the copyright holder(s) here> License: (中略) On Debian systems, the complete text of the GNU General Public License can be found in ‘/usr/share/common-licenses/GPL’. The Debian packaging is (C) 2008, yoshida syunsuke <koedoyoshida@gmail.com> and is licensed under the GPL, see above. |
debian/rules にはパッケージングを行うための手順を記述します。 Makefile 形式の記述方法ですが、 パッケージングの支援を する dh_xxx コマンド群 (devhelper パッケージ) を並べるのがほとんどです。 dpkg-buildpackage が期待している必須ター ゲットは:
build: (ビルド実行)
binary: (バイナリパッケージの生成、 通常 binary-indep と binary-arch の実行) binary-indep: (アーキティクチャ独立のバイナリパッケージ作成) binary-arch:(アーキティクチャ依存のバイナリパッケージ作成) |
dh_make のデフォルトの場合、 build ターゲットは build-stamp に依存している= build-stamp ターゲット (make、 コンパイ ル等の実作業) を呼び出します。
同様に build-stamp は config.status(configure の実行) に依存しています。
debian/rules build: build-stamp build-stamp: config.status dh_testdir # Add here commands to compile the package. $(MAKE) #docbook-to-man debian/smp-mgzip.sgml > smp-mgzip.1 touch $@ |
binary: binary-indep binary-arch
binary-indep: build install binary-arch: build install dh_testdir dh_testroot dh_installchangelogs ChangeLog (中略) dh_builddeb |
install: build
dh_testdir dh_testroot dh_clean -k --exclude ./mgzip.c.orig dh_installdirs # Add here commands to install the package into debian/smp-mgzip. $(MAKE) prefix=$(CURDIR)/debian/smp-mgzip/usr install |
Single binary (s) の場合、 Debian のパッケージングツールは$(CURDIR)/debian/(パッケージ名)/以下にあるファイルをま とめてパッケージにします。
「make install」 実行で$(CURDIR)/debian/(パッケージ名)/以下にインストールするようにオリジナルの tarball 等から展 開された、 Makefile を準備します。
元々の Makefile が提供されていればそれを修正すればよいでしょう。 無ければ Makefile を作成してください。 詳細な Makefile の作り方については書籍「make 改訂版」 を参照してください。
簡易なパッケージ作成のテストとして下記のコマンドを実行するとパッケージ作成が行われます。 $ dpkg-buildpackage -us, -uc -rfakeroot 上記のファイルが適切に作成されていれば、 以下のファイルが作成されます。
xxx-y.y.y_zzzz.deb(バイナリパッケージ)
ソースパッケージ xxx-y.y.y.dsc(ソース概要:control より生成) xxx-y.y.y_zzzz.diff.gz(パッケージ化用の差分) xxx-y.y.y.orig.tar.gz(オリジナルソースファイル) xxx-y.y.y_zzzz.changes(パッケージ変更点: control+changelog) 凡例: xxx:パッケージ名 y-y-y:バージョン, zzzz: Debian アーキテクチャ(i386,amd64,all, 等)) |
上記の例で dpkg-buildpackage に渡しているオプションの意味は以下の物です。
dpkg-buildpackage とよく似たプログラムに debuild があります。 違いとしては以下の点があります。
メリット dh_make で作ったばかりの設定ファイルでも deb を作成可能
デメリット一般ユーザで使用するときは-rfakeroot の指定が必要
メリット -rfakeroot 指定が省略可能、 ルールに従ったチェックの実行を行ってくれる。
デメリット各種ルールに従って設定ファイルを書かないとエラーや警告となる作成されるパッケージに関して は両方とも同じ
これまでの例で、 dpkg-buildpackage や debuild で指定した -us -us のオプションはファイルへの電子署名を省略するためのオ プションです。
パッケージを自分のみで使用する場合はともかく、 外部へ公開することも視野にいれるのであれば、 電子署名を行うのが適切で しょう。
debian パッケージに署名するには GnuPG で鍵を用意し、 パッケージ作成時に debuild、 dpkg-buildpackage を使用すると デフォルトでパッケージに署名が行われます。
パッケージ公開用のファイル (Packages.gz,Sources.gz) を作ります。
$ apt-ftparchive packages . | gzip -c9 > Packages.gz
$ apt-ftparchive sources . | gzip -c9 > Sources.gz |
apt-ftparchive コマンドは apt-utils パッケージに入っています。
ローカルで確認
sources.list(aptline) に以下のような記述を追加し apt-get update;apt-get install でインストールできるかを確認します
deb file:/usr/src/ ./
|
ネットワークで確認
ローカルで確認できたディレクトリ構成のまま、 そっくり http で公開します。 sources.list(aptline) も同様に記述します。
deb-src http://XXX ./
|
*.dsc,*.orig.tar.gz,*.diff.gz を入手して展開し、
$ dpkg-source -x XXX.dsc
$ cd 作成されたディレクトリ |
必要なら修正を実施してリビルドします
$ debuild (または dpkg-buildpackage)
|
第 39 回東京エリア Debian 勉強会 2008 年 4 月
____________________________________________________________________________________________