bdist_dumb --relative を使って絶対パスを固定せずにインストールできるバイナリ配布物を作る

Python のバイナリパッケージは、Linux 環境ではあまり使われない。
ソースからインストールする文化があるのと、Unicode の内部表現を選択する configure オプションなどによってバイナリ互換性が失われるケースがあるからだ。

でも、同じLinuxディストリビューションを使ったマシンを複数台扱うケースもあるだろう。そういったケースでは、マシン間ではバイナリ互換性は確保される。そして、そのマシンのいくつかで python-dev (Redhat系なら python-devel) やその他パッケージのビルドに必要な -dev (-devel) パッケージがインストールされておらず、ソースからのインストールが難しいかもしれない。そんな場合にはバイナリパッケージが便利だ。

Python のバイナリパッケージ (bdist_*) には、標準ライブラリの dumb, deb, rpm や distribute によって使える egg というフォーマットがある。オプション無しで実行した場合、 egg のみが相対パスになっていて、 Python絶対パスに依存しない。virtualenv を使っている人にとってこれは大きなメリットだ。

だけど、 distribute は今後非推奨になっていくし、だからといってまだ packaging(distutils2) には新しいバイナリパッケージフォーマットが用意されていない。 distutils だけでインストールパスに依存しないバイナリパッケージが作れたら嬉しい。それを実現するのが bdist_dumb --relative だ。例として、 greenlet を bdist_dumb --relative してみる。

greenlet$ python setup.py bdist_dumb --relative
greenlet$ tar tf dist/greenlet-0.3.1.linux-x86_64.tar.gz 
./
./lib/
./lib/python2.7/
./lib/python2.7/site-packages/
...
./include/python2.7/greenlet/
./include/python2.7/greenlet/greenlet.h

見ての通り、 bdist_dumb はただの tarball なので、 Python のインストールディレクトリに cd して tar xf するだけでインストールできる。pipやeasy_installが使えないのが難点だけどね。

このブログに乗せているコードは引用を除き CC0 1.0 で提供します。