Mercurial のインストールを bdist_rpm で
Python のアプリケーション配布に distutils を利用している場合,setup.py
の引数として bdist_rpm
を与えると dist ディレクトリに RPM パッケージを生成してくれます。
% python setup.py bdist_rpm running bdist_rpm creating build creating build/bdist.linux-i686 creating build/bdist.linux-i686/rpm ...... snip snip snip ...... 実行中(--clean): /bin/sh -e /var/tmp/rpm-tmp.72448 + umask 022 + cd /home/dayflower/src/mercurial-1.0/build/bdist.linux-i686/rpm/BUILD + rm -rf mercurial-1.0 + exit 0 moving build/bdist.linux-i686/rpm/SRPMS/mercurial-1.0-1.src.rpm -> dist moving build/bdist.linux-i686/rpm/RPMS/i386/mercurial-1.0-1.i386.rpm -> dist moving build/bdist.linux-i686/rpm/RPMS/i386/mercurial-debuginfo-1.0-1.i386.rpm -> dist
あとは rpm -Uvh してやればいいだけ。
% sudo rpm -Uvh dist/mercurial-1.0-1.i386.rpm 準備中... ########################################### [100%] 1:mercurial ########################################### [100%]
RPM パッケージになっていると,アンインストールするときとか便利ですよね。
最近の RedHat 系 OS だと bdist_rpm
がうまくいかない
ところが実際に setup.py bdist_rpm
を実行すると下記のように怒られて RPM パッケージの生成に失敗してしまいます。
error: Installed (but unpackaged) file(s) found: ......
付属の Python の distutils で bdist_rpm から呼び出される install
ターゲットの引数がうまくないらしいです。なので対処します。対策方法は Fedora Core 5/6のpython setup.py bdist_rpmが壊れている – ログ取得ツール 参照((なぜ --optimize 1
すると OK になるのかわかりませんが。))。
ちなみに ~/.rpmmacros
に
%_unpackaged_files_terminate_build 0
という内容を書いても通るようにはなるみたい*1ですが……これだとパッケージに(エラーででてきた)ファイルが含まれなくなっちゃうんじゃないかなぁ。実際にためしていないのでわかりません。
Mercurial のパッケージ用に MANIFEST.in
ファイルを置く
んでこれでめでたく RPM パッケージを作れるようになったんですが,Mercurial のパッケージを作るとウェブ用のコンテンツ(テンプレートとか画像とか)がパッケージに含まれないんですよね。このままだとこのパッケージをインストールしてもウェブインタフェースがうまく使えません。
なので,対処するために setup.py bdist_rpm
するまえに配布物の展開ディレクトリに下記の内容で MANIFEST.in
ファイルを作ります。
recursive-include templates *
なんでこれでうまくいくのかは,調べたのがずいぶん昔なので忘れました。ともかく,
% rpm2cpio dist/mercurial-1.0-1.i386.rpm | cpio -t ./usr/bin/hg ./usr/lib/python2.4/site-packages/hgext/__init__.py ./usr/lib/python2.4/site-packages/hgext/__init__.pyc ./usr/lib/python2.4/site-packages/hgext/__init__.pyo ...... snip snip snip ...... ./usr/lib/python2.4/site-packages/mercurial/templates/atom/changelog.tmpl ./usr/lib/python2.4/site-packages/mercurial/templates/atom/changelogentry.tmpl ./usr/lib/python2.4/site-packages/mercurial/templates/atom/filelog.tmpl ...... snip snip snip ...... ./usr/lib/python2.4/site-packages/mercurial/version.py ./usr/lib/python2.4/site-packages/mercurial/version.pyc ./usr/lib/python2.4/site-packages/mercurial/version.pyo 7612 blocks
無事 templates ディレクトリ以下のファイルもパッケージに含まれるようになりました。
Mercurial の README には付属の Makefile を使うようインストラクションが書いてありますが,今回のような bdist_rpm
経由でもうまくいきました*2。