2011年2月1日火曜日

Debian パッケージのAPTリポジトリ登録への手順

SDPA は既に Debian パッケージとなっていて、
unstable では apt-get で入手できる。
しかし、Debian の apt に登録されるまでの手順は
英語や略称が多くて、日本人にはわかりづらい。

そこで、自分がどこで苦労したかなど、各ステップを
まとめておくと、今後 Debian パッケージをaptに
登録する人の役に立つと思うので、簡単にまとめておく。

Debian パッケージになるとほぼ自動的に Ubuntu パッケージにも
なるので Ubuntu パッケージよりも Debian パッケージを
作るほうが楽である。

なお、時間が経つと実際の作業内容は変更されることが
考えられるので、それぞれのステップで確認が
必要である。

(間違いなどがあるかもしれないので、そのときには
指摘してもらえたら修正します。)


***** 大まかな流れ ******

1. 既にパッケージとして存在していないか確認する
2. ITP をメーリングリストに投稿する
3. ソースファイルの準備
4. configure の整理
5. gpg の鍵の作成
6. deb パッケージの作成
7. mentors のアカウント作成とパッケージアップロード
8. mentor とのやりとり
9. unstable の apt へと登録される
10. 他のアーキテクチャでのバグを修正

このうち、予想以上に手間暇がかかるのが
5 の gpg の鍵の作成である。
これは、実際に人にあって鍵を確認してもらう
必要があるためである。
(そうでなければ、どこの誰とも解からない人の
パッケージが登録されてしまうため)

**** 1. 既にパッケージとして存在していないか確認する ****

すでに登録されているパッケージは作る必要がないので、
これをあらかじめ確認しておく。
確認するには、
http://www.debian.org/distrib/packages
に行って、
「パッケージディレクトリを検索」を検索のところで
パッケージ名を入力する。
検索対象としては「パッケージ説明文」を選択する。
(「パッケージ名のみ」だと同じパッケージを違った
名前で登録されていると見落としがちになる。)
また、ディストリビューションとしては、「すべて」にする。
ここでヒットしていなければ、とりあえずパッケージとしては
まだ作成されていない。

さらに、「現在作業中のパッケージ」
http://www.debian.org/devel/wnpp/being_packaged
や「作成の要求がきているパッケージ」
http://www.debian.org/devel/wnpp/requested
についてもあらかじめチェックしておく。

**** 2. ITP をメーリングリストに投稿する ****

ITP とは、Intend To Package の略であり、
つまり、「自分がパッケージ化します」という
宣言をすることである。
一度宣言したら、自分でパッケージ化する責任が
あるので、よくよく考えてから宣言する。

また、パッケージ化するにはライセンスの確認が
避けられないので、Debian に登録できるライセンスを
確認する。
GPL のライセンスであれば特に問題ないが、
GPL のライセンスのときには GPL のライセンス条項を
http://www.gnu.org/licenses/gpl.html
http://sourceforge.jp/projects/opensource/wiki/licenses%252FGNU_General_Public_License_version_3.0
などで確認しておく。

他にも、Debian フリーソフトウェアガイドライン
http://www.debian.or.jp/community/devel/debian-policy-ja/policy.ja.html/ch-archive.html#s-dfsg
の条項を確認しておく。基本的にはこの条項をクリアできないと
Debian パッケージにはなれない。

また、Debian ポリシーマニュアルは必ず一通り目を通す。
http://www.debian.or.jp/community/devel/debian-policy-ja/policy.ja.html/index.html
最初はよくわからない単語が多いが、ここを参照することが
頻発するので、今の段階で単語の意味が解からなくても
「そういえばポリシーマニュアルに載っていたかも」
と気づくだけで、かなり作業が楽になる。
あとで debuild でエラーなどが出るときには、
ここがとても参考になる。

Ubuntu のパッケージングガイドも参考になる。
https://wiki.ubuntulinux.jp/UbuntuPackagingGuideJa
だいたいの概略を Ubuntu のガイドで把握してから
Debian のポリシーマニュアルを読む、というのも
効率的である。

ここまでを確認したら、ITP をメールで宣言する。
詳しい方法は
http://www.debian.org/devel/wnpp/#l2
にあるが、SDPA の場合は
http://www.mail-archive.com/debian-wnpp@lists.debian.org/msg111640.html
のようなメールを送っている。
なお、新規パッケージは wnpp パッケージとして一度
登録されるが wnpp とは
Work-Needing and Prospective Packages
の略である。
ITP のメールを出すときのメールアドレスは、
今後のパッケージ登録でもメールアドレスを
使うので同じアドレスが使えるほうがよいと思う。

このメールアドレスは環境変数にも登録しておく。
~/.bashrc に
export DEBFULLNAME="フルネール"
export DEBEMAIL=example@example.com
のようにして名前とメールアドレスを登録しておく。

ITP が登録されると、Bug 番号が振られる、
自分にメールが届く。
(SDPA の場合は、Bug#59446 である。)
この番号は新規パッケージを作るときには
重要なので必ずメモしておく。

**** 3. ソースファイルの準備 ****

ソースファイルは必ず配布できないといけないので、
ソースファイルが入手できないものはパッケージ化できない。

ソースファイルが Debian でコンパイルできることを確認する。
Debian のパッケージとしては、まずは unstable の
ディストリビューションに登録されるので、unstable な
Debian を準備する。
もちろん、unstable なので、通常業務とは別に用意する。

SDPA のパッケージ作成では、vmplayer で仮想環境を作っている。
(最初はよくわからなかったので、5回ぐらい
インストールしなおしたりして、使い勝手のいい環境にしている。)
なお、pbuilder などでさらに内側で仮想環境を作るので、
仮想環境のディスク容量は 20GB は確保しておいたほうがよい。
SDPA はコマンドラインで動くパッケージであるが、
それでも仮想ディスク全体の使用容量が 10GB 以上になっている。
(/dev/sda1 が 10GB 以上使用している)
メモリは vmplayer に 4GB を使用させているが、
おそらく 2GB はあったほうがいいと思われる。
vmplayer に1GB でもパッケージは作成できるが、かなり厳しい。

Debian では、 stable をまずはインストールした。
さらに、/etc/apt/sources.list を修正し、lenny 用に
なっている箇所を sid とする。
このあと、
# apt-get update
# apt-get upgrade
で unstable になる。なお、Debian では、
sid ディストリビューションとは unstable
ディストリビューションのことを指すようである。

unstable に切替えたところで、必要なパッケージを
インストールする。
パッケージを作成するのに必要なパッケージは
pbuilder を入れるとそれといっしょに
ほぼほとんど入るので、まずは pbuilder を
インストールする。

# apt-get install pbuilder

今まで gcc などもインストールされていなければ、
この時点で 100 以上のパッケージがインストールされると思う。
いずれにしても、pbuilder はパッケージ化の確認に
必要なので必ずインストールする。

今後必要なパッケージが出てきた場合には、そのつど
インストールする。
なお、どのパッケージがどのファイルを持っているかは、
http://www.debian.org/distrib/packages#search_contents
で検索できる。
(ディストリビューションを unstable にして検索すること)

このあと、ソースファイルを一度コンパイルして
Debian でコンパイルできるか確認する。

**** 4. configure の整理 ****

SDPA は configure スクリプトを用いているので、
deb パッケージを作る際に CDBS が使えて楽であった。
ただし、configure スクリプトは必須ではない。
configure スクリプトを準備すると、
$ ./configure && make && make install
の3ステップでインストールができるようになる。
なお、configure スクリプトの作り方は、
http://www.spa.is.uec.ac.jp/~kinuko/slidemaker/autotools/
がとてもよくまとめてあり、SDPA の configure を
更新する際にも参考にしている。

**** 5. gpg の鍵の作成 ****

Debian パッケージを apt に登録するときには、
だれが作成したか、という情報を署名しなければならない。
これがないと、deb ファイルは作れるが、apt には
登録できない。

この署名は電子的に行われ、基本的には gpg という
暗号化ソフトウェアが利用される。
$ dpkg --list | grep gpg
として gpgv パッケージが見つかればすでに gpg は
インストール済みである。
これが見つからなければ、apt-get でインストールする。

gpg の鍵は RSA の 4096 ビットで作る必要がある。
実際の作り方は、
http://lists.debian.or.jp/debian-users/200909/msg00008.html
に詳しいので、これを参考にして作る。
これとあわせて
http://www.debian.org/events/keysigning.ja.html
も参考にする。とくに、最後の
「やってはいけないこと」は必ず目を通す。

このあと、自分の鍵のうち、公開鍵を鍵用のサーバーに
登録する。よく使われるのは2つなので、以下の2つに
登録する。

$ gpg --keyserver pgp.mit.edu --send-keys
$ gpg --keyserver gp.nic.ad.jp --send-keys

なお、pgp.mit.edu では名前などでも検索できるので、
他のひとの公開鍵を検索することも可能である。
(そうでなければ、パッケージについている電子署名を
確認できないので)

作成して登録した鍵については、サインパーティで
自分の鍵であることを示す。
詳細は、
http://lists.debian.or.jp/debian-users/200909/msg00008.html
http://www.debian.org/events/keysigning.ja.html
に書かれているが、Debian の人とあって、
「これが自分の鍵です」と宣言する必要がある。
サインパーティは何回か行われているので、
スケジュールがあえばサインパーティに参加するのが
いいと思われる。
サインパーティがいつ開催されるかは、Google などで
検索すると簡単に解かる。

SDPA の場合にはスケジュールがあわなかったので、
Debian の人にお願いして、新宿の喫茶店で
鍵の確認をしてもらった。
(「Debian の人」の個人名はここでは伏せておきます。
名前を出すのであれば本人の了承が必要だと思うので)
このときには、運転免許証やパスポートなどの
公的機関が発行している写真つきの証明書が必要である。
自分の鍵をプリントアウトしたものを持っていって、
自分の口で「これが自分の鍵です」と明言することになる。

なお、運転免許証などには住所など個人情報が掲載されて
いるので、鍵を確認する人が Debian の人であるか、
怪しい人ではないか、さきにインターネットの情報
などをチェックしておくべきである。
(と、確認してもらった際に教えてもらった。)

鍵を確認してもらうと、Debian の人から署名された鍵が
メールで送られてくる。これを自分の鍵に import して、
このあと自分の鍵を export して Debian の人に送り返す。
import, export については、以下に詳しい。
http://www.debian.org/events/keysigning.ja.html

これで自分の鍵が deb パッケージへの署名に
使える段階となる。
(パッケージへの署名自体は確認してもらわなくても
できるが、最終的に apt に登録するには確認が必要。)

**** 6. deb パッケージの作成 ****

ソースファイルがあるときの deb パッケージの作成方法は、
http://yoshimov.com/?page=Ubuntu%2Fdeb%A5%D1%A5%C3%A5%B1%A1%BC%A5%B8%A4%CE%BA%EE%C0%AE
が参考になった。
ただし、必要ソフトは pbuilder をインストールすれば、
他もほとんど同時にインストールされる。

とにかく、現在のソースファイルについて、
debian というサブディレクトリができていることが
重要である。
これを修正したうえで、パッケージをコンパイルする。

なお、ここからはソースファイルのディレクトリと
コンパイルするためのディレクトリは別にしたほうがよい。
つまり、パッケージ作成のためにコンパイルするときには
ソースファイルのディレクトリをまるごと別にコピーして、
そちらでコンパイルする。
こうすれば、コンパイルの過程で誤ってソースファイルを
変更してしまっても問題ない。
SDPA の場合には、コンパイルするときには、
一度コンパイルのためのディレクトリを全消去して、
ソースファイルからコピーし直している。

実際には、以下のような作業をシェルスクリプトで行っている。
(ほんとのスクリプトはもっといろんなことをできるように
設定している。)
$ cd ~
$ rm -rf ~/compile-test
$ cd ~/source-directory/
$ rm -f `find . | grep ~$` (emacsなどでの作業ファイルを削除)
$ autoreconf (configure ファイルを更新しなおす)
$ rm -f autom4te.cache (autoreconf の途中ファイルを削除)
$ cd ~/compile-test
$ cp -r ~/source-directory sdpa-7.3.5.dfsg
$ tar czf sdpa_7.3.5.dfsg.orig.tar.gz sdpa-7.3.5.dfsg
$ cd sdpa-7.3.5
$ debuild -us -uc (ここで -us -uc は署名しないようにするため)

なお、SDPA では通常のパッケージと Debian のパッケージでは、
内部に MUMPS を持っているかどうかで異なるため、
通常パッケージと異なることを示す "dfsg" をディレクトリ名や
ファイル名につけている。

debuild で実際にコンパイルしているわけであるが、
最初は失敗しまくるので電子署名は必要ではない。
きちんとコンパイルなどを通してから署名すれば十分である。

なお、debian/ ディレクトリについては、
http://www.debian.or.jp/community/devel/debian-policy-ja/policy.ja.html/
の4章と5章にその概要が書かれている。
ただし、ここに書かれている概要はあまり詳しくないので、
インターネットでの検索も重要であるし、
既にあるパッケージを参考にすることもある。

たとえば、SDPA のパッケージを作る際には、MUMPS のパッケージなどを
参考にした。この場合には
http://www.debian.org/distrib/packages
の「パッケージディレクトリを検索」で MUMPS が
http://packages.debian.org/sid/libmumps-4.9.2
にあることを見つけ、ページ右側の
「ソースパッケージをダウンロード」を確認する。

$ wget http://ftp.de.debian.org/debian/pool/main/m/mumps/mumps_4.9.2.dfsg-6.dsc
$ wget http://ftp.de.debian.org/debian/pool/main/m/mumps/mumps_4.9.2.dfsg.orig.tar.gz
$ wget http://ftp.de.debian.org/debian/pool/main/m/mumps/mumps_4.9.2.dfsg-6.debian.tar.gz

でダウンロードして、
$ dpkg-source -x mumps_4.9.2.dfsg-6.dsc
とすると、パッケージを展開できるので、これで
debian/ ディレクトリがどうなっているかを
知ることができる。

同様のことを他のパッケージにも行い、どのように
すれば debian/ ディレクトリが書けるかを
実例で把握できる。
なお、debin/rules は一般には長くなるが、
configure の場合には CDBS を利用すると
かなり簡単にできる。
(SDPA のパッケージを上記方法で確認すると解かる。)
CDBS については、
http://sugi.nemui.org/doc/cdbs/cdbs-trans-1st.html
を読むとよくわかるし、
http://cdbs-doc.duckcorp.org/
にマニュアルが整備されている。


なお、新規パッケージの場合は、ITP (Intend To Package)
のときのバグの番号を debian/changelog に書く必要がある。
SDPA では、debian/changelog の中の
* New package release (closes: #594463) が対応している。


$ debuild -uc -us
でコンパイルすると、最初のころはエラーがたくさん出るので、
これを修正する。
コンパイルが通るとパッケージを作成し、パッケージチェックが
行われる。
このチェックは lintian というプログラムが実行しており、
debian/ ディレクトリ以下のおかしいところが指摘される。
lintian が出す Warning や Error は Google で検索すると
すぐに情報が出てくるので、これに従って Warning, Error が
出てこないようになるまで、ひたすら修正する。
(lintian は debuild コマンドの最後のあたりで実行されるので、
debuild が終了したら出ているメッセージの最後の
30行程度にあるはずである。)

debuild が終了すると、
debuild を実行したディレクトリのひとつ上のディレクトリに
deb パッケージが作成されている。
(???.deb というパッケージと ???.dsc というパッケージの内容が
記されているファイル、???.changes というファイル更新状況を
まとめたファイル、そして ???.orig.tar.gz のソースファイル
があるはずである。)

どのようなファイルになっているかは、
$ dpkg-deb -c ???.deb
で確認できる。
また、
# dpkg -i ???.deb
とするとインストールすることもできるはずである。
ただし、間違った構成にしているとインストールの時点で
システムファイルに上書きしてしまう危険性もあるので、
十分に確認してから行う必要がある。
なお、アンインストールするには
# dpkg -r ???
である。

debuild でインストールなどを確認したら、次は
pbuilder での確認である。
pbuilder は Debian の中に仮想環境を作って、
その中でコンパイルが行われる。
apt に登録されるパッケージは、apt 側で
用意されているサーバでコンパイルされて
バイナリが生成されるので、pbuilder で失敗する
のであれば、サーバでのコンパイルも失敗する可能性が高い。
pbuilder の使いかたは、
http://www.debian.org/doc/maint-guide/ch-build.ja.html
の6.5章に詳しい。
つまり、ベースとなる環境を仮想的に構築して、
その中で必要なパッケージなどをインストールして、
コンパイルを試すのである。
$ sudo pbuilder --create
で初期化するが、これだけでだいぶ時間がかかる。
そのあと
$ sudo pbuilder --update
$ sudo pbuilder --build ???.dsc
で実際にチェックが行われる。
なお、createは一回でいいが、update は Debian の他の
パッケージがアップデートされたら、その情報を pbuilder に
取り込むため、ひさしぶりに build するのであれば
その前に update しておいたほうがよい。

pbuilder では、実際にパッケージの依存情報や
インストール、アンインストールがチェックされるので、
ここのエラーも確実に取り除く。

なお、pbuilder は仮想環境を mount しているので、
途中で kill などで強制終了すると mount がうまく
外れず、次回の pbuilder が行えないことがある。
mount をうまく外すか、よくわからなければ Debian 全体を
再起動して pbuilder --update をしたほうがよい。

ここまで来たら、以下のチェックリストで確認する。

[1] ./configure && make && make install でインストールできること
[2] debuild で *.deb が生成できて、このときに gcc, lintian が
error と warning を出さないこと
[3] debuild でビルドしたあとに、もう一度そのまま debuild で
連続してビルドできること
make clean などがうまく書かれていないと、ここでこける。
SDPA では、octave のファイルを make とは別にコンパイル
しているので(debian/rules の "build/sdpam::" のところ)、
これを消去するために、Makefile.am で
MOSTLYCLEANFILES を追加している。
[3] pbuilder --build *.dsc でエラーが出て止まらないこと
[4] piuparts を使ってパッケージのインストール、アンインストール
アップデートアップグレードのチェックをパスすること
ただし、piuparts 自体が発展途上なので、piuparts の
エラーで止まることもある。
[5] 実際にインストールして動作確認をする。

**** 7. mentors のアカウント作成とパッケージアップロード ****

Debian では作成したパッケージは mentors.debian.net に登録して、
mentor というチェックする人にチェックを受ける。
http://mentors.debian.net/cgi-bin/maintainer-intro
に入って、sign up でアカウントを作成する。
このときに、自分のgpgの公開鍵とメールアドレスを
登録する必要がある。
公開鍵は、sign up のページにあるとおり、
"gpg --export --armor your-email-address > public-key-file"
とすればよい。

mentors.debian.net でアカウントを作ったら、
アップロードするパッケージを作成する。
今回は、debuild に -uc -us をつけずに、そのまま
$ debuild
でコンパイルする。最後に gpg による電子署名が2回行われる。

できあがったら、
$ dput mentors ???.changes
によって、mentors.debian.org にアップロードする。
アップロードが完了すると、mentors.debian.org から
「完了した」という意味のメールがくる。
ファイルは、
http://mentors.debian.net/debian/pool/main/s/sdpa/
のように、パッケージの最初の文字ごとのディレクトリの
中にパッケージ名でディレクトリができて、
そこにアップロードされる。
なお、dput をすると、???.upload というファイルが
できる。これは dput で誤って何回もアップロードを
防ぐためのようである。もし、本当にアップロード
しなおさないといけないときには、このファイルは
削除して dput する。

アップロードすると、mentor になってくれる人を募集する
メールのテンプレートが表示されるので、これにしたがって
mentor になってくれる人を募集する。
これは RFS と呼ばれ、たとえば SDPA なら
http://www.mail-archive.com/debian-mentors@lists.debian.org/msg69737.html
というメールを出している。

mentor は基本的にボランティアであるため、いつの時点で
mentor になってくれる人が名乗り出てくれるか解からない。
とりあえず待つしかないのである。
聞いたところでは、日本人の場合は apt に登録しようとする人が
少ないようなので、日本人が mentorになってくれることが
多いそうである。日本人が mentor だと、あとのやりとりを
日本語でできる分、スムーズに行える。

**** 8. mentor とのやりとり ****

mentor がつくと、mentor とのやりとりが始まる。
パッケージのディレクトリ構成など、いろいろな点を
指摘してくれるので、それをひとつひとつ修正する。
SDPA パッケージの場合、ここで
sdpa, libsdpa-dev, sdpam の3つに分割することを
提案されており、それに従っている。

(SDPA の場合、サインパーティを自分が知らなかったので、
mentor についてもらってから gpg の確認を行っている。
ただし、本来は先にサインパーティに行ったほうがよい。)

SDPA では1ヶ月程度、ほぼ毎日メールでやりとりをして
修正をおこなった。
mentor の方はだいぶ丁寧に教えてくれるが、
もちろん何でもかんでも mentor に聞くのではなく
あらかじめ自分で調べてから、それでも解からない点を
mentor に聞くようにする。
ちなみに、一度パッケージ作りをすると、
mentor をしている人がとてもよくサポートしてくれる
ことも解かる。

mentor がチェックをして OK が出ると、Debian Developer
の人が Debian のサーバーに登録してくれる。
ここからは、Debian Developer の人達によるチェックが
始まる。日本人だけではないので、改良点についての指摘が
英語メールでくることもある。英語とはいっても
難しい英語ではないので、丁寧な気持ちで答えれば
なんとかなる。

**** 9. unstable の apt へと登録される ****

Debian Developer のチェックが終わると、apt に登録される。
ただし、登録までには2,3週間かかるようである。
この時点で、unstable で
# apt-get update
# apt-cache search sdpa
とすることで SDPA が apt に登録されたことを確認できる。
(登録された、ということはメールなどでは特には通知されない。)
もちろん、
# apt-get install sdpa
でインストールもできる。

ここで、
http://packages.debian.org/sid/sdpa
に SDPA が登録されているページができる。
また、逆に卒業したことなる mentors.debian.net からは
ファイルが削除される。

**** 10. 他のアーキテクチャでのバグを修正 ****

一度登録されると、他のアーキテクチャでのコンパイルなども
行われる。SDPA は amd64 でコンパイルなどを確認しているが、
i386 などが自動的にコンパイルされる。
他のアーキテクチャでもコンパイルできているかは、
http://packages.debian.org/sid/パッケージ名
で右のほうにある「メンテナ」の「QAページ」へと移動し、
「buildd」に移動すると確認できる。
ここで、maybe-successful であれば OK であるが、
maybe-failed が出た場合には修正する。

maybe-failed をクリックするとコンパイルログが
出てくる。ただし、config.log を入手するのは難しいので、
configure スクリプトの場合には、エラーが出たときに
どのようなエラーか詳細を出力するようにしておいたほうがよい。
SDPA では、configure.in で AC_MSG_ERROR を
出力するときには、どのようなコンパイルをして
失敗しているかを表示するようにしてある。

アーキテクチャによっては、ディレクトリ構成などが
異なることがありうるので、そのような場合には
http://packages.debian.org/
でどのディレクトリにファイルがあるかを確認し、
それを反映できるようにする。
SDPA の場合は、ATLAS のファイルがこれに相当する
ことがありうるので、debian/rules の
DEB_CONFIGURE_EXTRA_FLAGS で configure スクリプト
へのオプションを切替えるようにしている。

また、debian/ ディレクトリやソースなどを変更したら、
debian/changelog を修正することも忘れずに行う。
このときに、少しずつバージョンがあがる。
SDPA のときは、7.3.2, 7.3.3, 7.3.4 と3回
かかっている。

修正したファイルは、debuild でビルド、チェックをし、
そのあと dput で mentors.debian.net へアップロードする。
mentor の人にメールで再度チェックをお願いするが、
すでに一度アップロードされていれば修正は大きくないので、
最初のアップロードほどは大変ではない。

なお、Debian で登録されると、数日のうちに
Ubuntu にも登録される。

Ubuntu にも自動的にパッケージのページができて、SDPAなら
https://launchpad.net/sdpa
である。
なお、バイナリ生成のためにコンパイル中であれば、そのことも
launchpad に表示される。

************************************************

ここまでで apt への登録は一通りである。
あとは、新しいバージョンが出たら、修正を行い、
mentors.debian.net へアップロードし、mentor の方に
チェックを受けるサイクルとなる。




今日の作業内容:Debian パッケージについてまとめ 5h
今日のランチ:つかさ 鯖の塩焼
明日の予測作業時間:4h

0 件のコメント:

コメントを投稿