debian パッケージを意識した upstream パッケージの作成

最終ゴール

オレオレ apt リポジトリにオレオレ deb パッケージを置いて,特定少人数に対して配布する.

今回のお題

例えば以下のようなコマンドがあるとする.

#!/bin/sh
echo 'hello'

このコマンドを提供する debian パッケージを作りたい.この debian パッケージの upstream にあたるパッケージはどのように作成すればよいだろうか?

パッケージ名

まずパッケージ名を決める必要があるが,パッケージ名に使ってよい文字などの規則はどこにあるだろうか?「debian パッケージ名の規則 - metalglue」に書いた通り,5. Control files and their fields — Debian Policy Manual v4.3.0.3 (5.6.1 Source) にあり,[a-z0-9][a-z0-9.+-]+ となる.大文字やアンダースコア _ が使えないことに注意.

ここではパッケージ名を my-hello とする.

バージョン

バージョン番号の付け方はどうしたらよいだろうか?「オープンソースソフトウェアの育て方」を通じて知った「Versioning Numbering Concepts - The Apache Portable Runtime Project」が参考になる.これによると,バージョン番号は . (ドット) で区切られた3つの数字で,MAJOR.MINOR.PATCH という構成を取る.ドットは小数点ではない.つまり例えば 3.1.9 の次のバージョンは 3.2.0 ではなく 3.1.10 である.

MAJOR と MINOR が同じなら PATCH が違っても機能が違ってはならない.PATCH が異なるバージョン間でアップグレードしてもダウングレードしてもバグでない挙動は同じでなくてはならない.平たく言うとバグフィックスによるバージョンアップである.

MAJOR が同じで MINOR が異なるバージョンにアップグレードしたときに,使えていた機能が使えなくなってはならない.一方,ダウングレードは安全に行えないかもしれない.

MAJOR が異なる場合は,アップグレードもダウングレードも安全に行えない可能性がある.

ここではバージョンを 0.0.1 とする.

ディレクトリ/ファイル構成

以下のようにする.

 my-hello/
 |-- Makefile
 `-- myhello

Makefile

普通,作成したコマンドは /usr/local/bin に,ライブラリなら /usr/local/lib にインストールされるように Makefile を記述する.今回の場合はどのような Makefile が都合がいいだろうか?

debian のパッケージ生成では,あるディレクトリを仮のルートとしてファイルをインストールし,それをアーカイブしてパッケージとする(Chapter 3. Modifying the source - 3.1 Installation in a subdirectory を参照).よって,任意のディレクトリをルートと考えてインストールできるようになっていることがのぞましい.

また,「Debian Policy Manual — Debian Policy Manual v4.3.0.3」によると,debian ではコマンドは /usr/bin に,ライブラリは /usr/lib にインストールすることになっている.この,/usr を基準にするか /usr/local を基準にするかが選択可能であることが望ましい.

これらを勘案し,また ldapscripts の upstream パッケージも参考にして,DESTDIR と PREFIX という変数でこれらを制御できるようにした.

DESTDIR =
PREFIX = /usr/local

all:

install: myhello
	install -d $(DESTDIR)$(PREFIX)/bin
	install $< $(DESTDIR)$(PREFIX)/bin

.PHONY: all install

以下のようにインストールする.

$ make install DESTDIR=/home/yourname/tmp PREFIX=/usr

疑問点

  • upstream パッケージの作者が debian 野郎の場合,自分で debian 用のファイル(パッケージディレクトリ中の debian/ ディレクトリの中身)を用意するだろう.こういう場合,README とか changelog とかはどこにおいておくのがいいんだろうか?
  • よくわからないので,今回は README, changelog のことは考えないことにする.