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もあるで