Freezeできない(Ubuntu 10.04 Lucid Lynx x84_64/Python2.6)

FreezeとはPythonスクリプトを1つのバイナリにまとめて実行形式にしてくれる、元祖Pythonの謹製ツールです。デフォルトではインストールされてないので、欲しい人はPythonソースコードの「python2.6-2.6.5/Tools/freeze」以下を見ればあります。ソースコード

sudo apt-get source Python2.6

で取得できます。
さて、タイトルの環境でfreezeを試したのですがハマった。わけわからん。
以下、ぶつかった壁とその解決方法

「/usr/lib/python2.6/config/config.c.in」がありません

これはfreeze.py実行中に出たエラー
ソースコードからconfig.c.inが必要なパスにコピーして使うことで無理やり解決。ファイルは「Modules/config.c.in」にあります。

Python.h 他がありません」

これはfreeze.py実行後のmake中に出たエラー
めんどくさいのでヘッダを全部持ってきた。

sudo cp /usr/lib/python2.6/Include/* <freeze.py実行後Makefileができたパス>

「libpython2.6.aがありません」

これもfreeze.py実行後のmake中に出たエラー。なんで無いのか理解できない。
これは上で用意したPythonソースコードをビルドして作りました。
まず、Pythonのビルドに必要なライブラリを準備する。

sudo apt-get build-dep python2.6

次にcofigureする。Pythonのソースフォルダに移動して

./configure

続けてmakeする。

make -s -j 2

めでたく、ソースフォルダのルートに「libpython2.6.a」ができている。これも必要な場所に置けば良い。

「config.o:(.data+0x○○): undefined reference to `○○○'」多発

これもfreeze.pyが作成したMakefileのmake中に発生した。
そろそろキレそう。Google先生もお手上げだったので、試しにfreeze.pyの実行を先ほどビルドしたpythonに切り替えてやり直してみる。

$BUILD_PATH/python freeze.py -p $BUILD_PATH hoge.py

上記の$BUILD_PATHには先ほどビルドしたPythonのあるパスが当てはまればなんでも良い。これで「udefined 〜〜〜」のメッセージが大幅に減った。

config.o:(.data+0x28): undefined reference to `init_warnings'
collect2: ld returned 1 exit status
make: *** [hello] エラー 1

このエラーはWebに落ちているものだ。このbugと同じ対策をfreeze.pyと同じディレクトリにある「makeconfig.py」にも施してやる。
再度、freeze.pyを実行することでバイナリ「hoge」が完成した。
解決した。
ってかバイナリでかっ!!サンプルなのに7MBもあるで

振り返り

実はLinuxでバイナリを自前で用意してビルドしたりするのはほとんど初めてだった。大分メジャーになったUbuntuでさえも、なんかの開発をやろうとしたらまだまだ結構大変なんだなと思う次第…