mercurial-buildpackageを使ってDebianパッケージを作成。

upstreamがmercurialで管理されているソフトウェアをDebianパッケージにするのに、mercurial-buildpackageを使ってみたのでそのメモです。

まずはパッケージの導入。

$ sudo apt-get install mercurial-buildpackage

upstream(今回はfuncparserlib)からcloning。

$ hg clone https://code.google.com/p/funcparserlib/
複製先ディレクトリ: funcparserlib
全チェンジセットを取得中
チェンジセットを追加中
マニフェストを追加中
ファイルの変更を追加中
154 のチェンジセット(443 の変更を 132 ファイルに適用)を追加(+1個のヘッド)
ブランチ default へ更新中
ファイル状態: 更新数 33、 マージ数 0、 削除数 0、 衝突未解消数 0

デフォルトのブランチはdefaultですが、

$ cd funcparserlib
$ hg branch
default
$ hg branches
default                      153:faefc873c619
0.3.x                        112:28528a73b122

funcparserlibは0.3.xがリリース用のブランチなので、0.3.xにチェックアウトします。

$ hg update 0.3.x
ファイル状態: 更新数 20、 マージ数 0、 削除数 14、 衝突未解消数 0

glogでチェンジセットが112になっていることを確認できます。

$ hg glog
(snip)
| o  チェンジセット:   113:f7bb0e84c0fe
| |  親:               111:004c67aabeb3
| |  ユーザ:           Andrey Vlasovskikh <andrey.vlasovskikh@gmail.com>
| |  日付:             Wed May 05 17:49:27 2010 +0400
| |  要約:             m
| |
| | @  チェンジセット:   112:28528a73b122
| | |  ブランチ:         0.3.x
| | |  親:               110:e568fcc9e6d6
| | |  ユーザ:           Andrey Vlasovskikh <andrey.vlasovskikh@gmail.com>
| | |  日付:             Tue Nov 29 23:03:05 2011 +0300
| | |  要約:             Switched from nosetests to unittest for compatibility
| | |
| o |  チェンジセット:   111:004c67aabeb3
| | |  親:               109:e33b53943458
| | |  ユーザ:           Andrey Vlasovskikh <andrey.vlasovskikh@gmail.com>
| | |  日付:             Mon Mar 15 12:43:18 2010 +0300
| | |  要約:             m
| | |
+---o  チェンジセット:   110:e568fcc9e6d6
| |    ブランチ:         0.3.x
| |    親:               108:f7b9c45450d7
| |    ユーザ:           Andrey Vlasovskikh <andrey.vlasovskikh@gmail.com>
| |    日付:             Tue Nov 29 23:03:03 2011 +0300
| |    要約:             Python 3 compatibility
| |
| o  チェンジセット:   109:e33b53943458
| |  親:               107:c2069a3825d2
| |  ユーザ:           Andrey Vlasovskikh <andrey.vlasovskikh@gmail.com>
| |  日付:             Sun Mar 14 13:18:09 2010 +0300
| |  要約:             Fixed #12: Positions in lexer error ouput are now 1-based instead of 0-based
| |
o |  チェンジセット:   108:f7b9c45450d7
| |  ブランチ:         0.3.x
| |  親:               106:4e1434e9013b
| |  ユーザ:           Andrey Vlasovskikh <andrey.vlasovskikh@gmail.com>
| |  日付:             Fri Nov 18 02:15:56 2011 +0300
| |  要約:             More information in exception objects (Issue 14)
| |
(snip)

なお最新のリリースの0.3.5のタグは、.hgtagsファイルで確認できます。

$ cat .hgtags
7d24cd9e4b75a85b1ee04f761e59857296d535d4 0.1
e68a2a1d0f55f07f9702dc4ee5da7f6f536402e8 0.2
8c9841ffcaa8b2b17ae93140aea89fd99526bed8 0.3
e5f9249d65bc6c9f8a5d219e31c3abd30167588a 0.3.1
23cf9ed9635b112fcb2247d960f4a918eaaad4bc 0.3.2
dfcce3e0b5765a393489570a41c7c95f5d8f1b15 0.3.3
ce8269e2e9ad9795f089b397efbec33758337016 0.3.4
2a094772c9e97ee5de5618f9c4479253fb357e4e 0.3.5

現在Debianパッケージとなっているfuncparserlib0.3.5は、Python2.7がデフォルトになってからビルドができないバグがあります。これは0.3.xのheadであるチェンジセット112では修正されているので、これをtarballにアーカイブします。doc/changes.mdとdoc/index.mdがsymlinkになっていますが、このままアーカイブするとmercurial-importorigおよびdebuild時にコケます。原因は、

http://twitter.com/#!/yy_y_ja_jp/status/176181847347298305:

@mkouhei mercurial-buildpackageが使ってるnekoがsymlink対応してない 6 days ago

とのことなので、この二つのsymlinkはアーカイブせずに-Xオプションで除外しておきます。

$ hg archive --prefix funcparserlib/ -r 112 -t tgz -X doc/Changes.md -X doc/index.md ../funcparserlib_0.3.5+hg~100.orig.tar.gz

このアーカイブしたファイルを元にmercurial-importorigを行います。

$ mkdir -p deb/funcparserlib
$ cd deb/funcparserlib
$ hg init
$ mercurial-importorig ../../funcparserlib_0.3.5+hg~100.orig.tar.gz
I: Reverting branch funcparserlib to state before import.

importができたらdh_makeを実行します。

$ dh_make -p funcparserlib_0.3.5+hg~100 -f ../../funcparserlib_0.3.5+hg~100.orig.tar.gz

Type of package: single binary, indep binary, multiple binary, library, kernel module, kerne
l patch?
 [s/i/m/l/k/n] s

Maintainer name  : Kouhei Maeda
Email-Address    : mkouhei@palmtb.net
Date             : Sun, 04 Mar 2012 02:29:27 +0900
Package Name     : funcparserlib
Version          : 0.3.5+hg~100
License          : blank
Type of Package  : Single
Hit <enter> to confirm:
Done. Please edit the files in the debian/ subdirectory now. You should also
check that the funcparserlib Makefiles install into $DESTDIR and not in / .

debian/*を編集後、debianディレクトリを登録しコミットします。

$ hg add debian
$ hg commit

Debianバージョン用のタグを設定します。

$ cat .hgtags
b4881fbed50135a62b070892f1f6fc2f91b81c5d funcparserlib_0.3.5+hg~112
$ mercurial-tagversion
$ cat .hgtags
b4881fbed50135a62b070892f1f6fc2f91b81c5d funcparserlib_0.3.5+hg~112
2e1787194ce0a880ef38e2ac09af5648a7cae27c funcparserlib_0.3.5+hg~112-1

mercurial-buildpackageコマンドでビルドすると、

$ mercurial-buildpackage

親ディレクトリにパッケージが生成されます。

$ ls -lrt ..
(snip)
-rw-r--r-- 1 user user  2837  34 04:50 funcparserlib_0.3.5+hg~112-1.debian.tar.gz
-rw-r--r-- 1 user user   978  34 04:50 funcparserlib_0.3.5+hg~112-1.dsc
drwxr-xr-x 9 user user  4096  34 04:50 funcparserlib
-rw-r--r-- 1 user user 30376  34 04:50 python-funcparserlib_0.3.5+hg~112-1_all.deb
-rw-r--r-- 1 user user  2241  34 04:50 funcparserlib_0.3.5+hg~112-1_amd64.changes
-rw-r--r-- 1 user user  4790  34 04:50 funcparserlib_0.3.5+hg~112-1_amd64.build

あとはいつもと同じようにpbuilderでチェックします。

$ cd ..
$ sudo pbuilder --build funcparserlib_0.3.5+hg~112-1.dsc

参考

リンク先はgit-buildpackageを使っていて、野良パッケージの作成が目的で、origファイルを消すという謎の手順がありますが、基本的な手順は参考になりました。

http://d.hatena.ne.jp/metalglue/20100409/1270798344