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が使えないのが難点だけどね。