最終ゴール
オレオレ apt リポジトリにオレオレ deb パッケージを置いて,特定少人数に対して配布する.
今回のお題
前回「Septième Sens: Debian パッケージを意識した upstream パッケージの作成」で作成した upstream パッケージ my-hello を Debian 化するにあたって,最小限必要な構成はどのようなものだろうか?
作業ディレクトリ
Debian パッケージの生成作業は upstream パッケージの最上位ディレクトリで行う.
$ cd my-hello
$ mkdir debian
debian ディレクトリの中の情報を利用する dpkg-xxx などのコマンドは,作業ディレクトリとして debian ディレクトリではなく upstream パッケージの最上位ディレクトリが設定されていることを前提としている.
dh による debian/rules
今回は現時点でもっともモダンな方法であると考えられる dh コマンドを使って Debian 化してみる.man dh によるともっともシンプルな debian/rules は以下のようになる:
#!/usr/bin/make -f
%:
dh $@
debian/rules ファイルは実行可能でなければならない.
$ vi debian/rules
$ chmod +x debian/rules
ビルドを試してみる前に,やや天下りになるが,debian/compat というファイルに 7 を書き込んでおく必要がある.man debhelper によると,dh_xxx コマンドの動作モードが debian/compat ファイルの内容によって変わるからである.過去に dh_xxx を利用して作成したパッケージが dh_xxx の仕様変更によってビルドできなくなることを防ぐためにこのような仕様になっている.
$ echo 7 >| debian/compat
それでは実際にビルドを実行してみよう.ビルドのためのコマンドは Chapter 6. Building the package によると以下のようになる.
$ fakeroot debian/rules binary
dh binary
dh: cannot read debian/control: No such file or directory
失敗した.debian/control ファイルが必要だと言われている.
Debian Policy Manual - Control files and their fields を読むと,debian/control ファイルはメールヘッダのようなパラグラフ複数からなり,第1パラグラフで必須なのが Source:
と Maintainer:
, 第2パラグラフで必須なのが Package:
と Architecture:
と Description:
となっている.
Source: my-hello
Maintainer: Your Name <yourname@example.com>
Package: my-hello
Architecture: all
Description: say hello
This program says hello.
debian/control を上記の内容で作成し,ビルドしてみる.
$ fakeroot debian/rules binary
...
dh_installchangelogs
tail: cannot open `debian/changelog' for reading: No such file or directory
...
今度は debian/changelog が必要だと言われている.
debian/changelog ファイルは debchange コマンドで生成できる.
$ debchange --create
my-hello (0.0.1) UNRELEASED; urgency=low
* Initial release.
-- Your Name <yourname@example.com> Sun, 21 Feb 2010 22:35:59 +0900
実行するとエディタが起動するので,PACKAGE と VERSION という記述を my-hello と 0.0.1 に修正する.
$ fakeroot debian/rules binary
...
dh_auto_install
install -d /home/yourname/my-hello/debian/my-hello/usr/local/bin
install myhello /home/yourname/my-hello/debian/my-hello/usr/local/bin
...
dh_usrlocal
rmdir: failed to remove `debian/my-hello/usr/local/bin': Directory not empty
...
dh_usrlocal が失敗している,出力を読むと dh_auto_install で make install が実行され,debian/my-hello/usr/local/bin に実行ファイルがインストールされているのが問題なのがわかる.
man dh によると,特定の dh_xxx をオーバーライドするには override_dh_xxx ターゲットを定義すればよい.
#!/usr/bin/make -f
%:
dh $@
override_dh_auto_install:
make install DESTDIR=debian/my-hello PREFIX=/usr
debian/rules を上のように修正し,再度ビルドする.
$ debian/rules clean
$ fakeroot debian/rules binary
…
dpkg-deb: building package `my-hello' in `../my-hello_0.0.1_all.deb'.
となり .deb が生成された.
$ sudo dpkg -i ../my-hello_0.0.1_all.deb
$ myhello
hello
$ sudo dpkg -P my-hello
$ myhello
-bash: myhello: No such file or directory
まとめ
my-hello
|-- Makefile # DESTDIR と PREFIX
|-- debian/
| |-- changelog # debchange コマンド
| |-- compat # 7
| |-- control # Source:, Maintainer:, Package:, Architecture:, Description:
| `-- rules* # override_dh_xxx:
`-- myhello
ビルドコマンド
$ fakeroot debian/rules binary
リビルド
$ debian/rules clean
$ fakeroot debian/rules binary