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

*1:see Bug 198877 – setup.py bdist_rpm fails with "Installed (but unpackaged) file(s) found"

*2:Makefile 経由だとなぜかバージョンが unknown になってしまったような。