この記事はQiitaではなくADVENTARのPython Advent Calendar 2015の9日目になります。
delocate とは
delocateはOS X 用のwheelパッケージユーティリティです。
Matthew Brett 氏 作
下記のような機能を持っています
- wheelが依存しているライブラリを表示する
- wheel中に依存しているライブラリをコピーしリンクするよう書き換える
それでは実例を挙げてみます。
delocate-listdeps コマンドによる依存ライブラリの表示
実例にはE-Cellという細胞シミュレータの最新版のwheelファイルを用いてみます。
もしdelocateを行う前のwheelファイルをご自分でビルドしたいと思われた方は
https://github.com/ecell/ecell4-wheels/blob/master/.travis.yml
のdelocateを行う前までをご参照ください
まず delocate-listdeps コマンドを試してみます
> delocate-listdeps --all dist/ecell4-4.0.0b2-cp27-none-macosx_10_11_intel.whl
/usr/lib/libSystem.B.dylib
/usr/lib/libc++.1.dylib
/usr/local/Cellar/gsl/1.16/lib/libgsl.0.dylib
/usr/local/Cellar/gsl/1.16/lib/libgslcblas.0.dylib
/usr/local/Cellar/hdf5/1.8.16/lib/libhdf5.10.dylib
/usr/local/Cellar/hdf5/1.8.16/lib/libhdf5_cpp.11.dylib
ecell4-4.0.0b2-cp27-none-macosx_10_11_intel.whl というwheelファイルがhomebrewの
gslとhdf5に依存していることがわかります。
--all
オプション無しのデフォルトでは /usr/lib
と /System
中のライブラリを表示しません。
(OSXにおいてそれらの中のライブラリは共通で気にする必要が無いから、と思われます。)
delocate-wheel コマンドによる依存ライブラリのコピーと再リンク
上述のwheelパッケージはそのまま配布しても
- homebrewをデフォルトのパスにinstallしていて
- gslのversion1.16とhdf5の1.8.16をインストールしていて
- OSXのバージョンが10.11
の人しか使えません。
(正確には第3点目のみ、使えないというよりは「wheelのインストールができません」です。詳細は後述します)
wheelパッケージがダイナミックリンクの対象となるライブラリに delocate-listdeps
で確認したパスを期待しているからです。
これを環境に依存しないように書き換えるのが delocate-wheel
コマンドです。
実例で示します。
> delocate-wheel dist/ecell4-4.0.0b2-cp27-none-macosx_10_11_intel.whl
> delocate-listdeps dist/ecell4-4.0.0b2-cp27-none-macosx_10_11_intel.whl
@loader_path/.dylibs/libgsl.0.dylib
@loader_path/.dylibs/libgslcblas.0.dylib
@loader_path/.dylibs/libhdf5.10.dylib
@loader_path/.dylibs/libhdf5_cpp.11.dylib
@loader_path/libhdf5.10.dylib
@loader_path/libsz.2.0.0.dylib
delocate-wheel コマンドによってdylibが期待されるパスwheelのツリーの中に動かされていることがわかります。
期待されるパスが変わっているだけでなくdylibはwheelパッケージの中に含まれるようコピーされています。
(whlをzipにリネームし解凍するとわかります)
delocate-addplat コマンドによるプラットフォームの追加
delocate-wheel コマンドにより依存ライブラリをwheel中に含めることができましたが最後に前述した「OSXのバージョンが10.11」しかサポートできていない問題が残っています。
PEP 0427 で規定されているように
wheelのファイル名の最後のタグがプラットフォームを示すものだからです。
(今はこれがmacosx_10_11_intelとなっています。)
これにプラットフォームを追加するコマンドが delocate-addplat
です。
実例を示します。
> delocate-addplat --rm-orig -x 10_9 -x 10_10 dist/ecell4-4.0.0b2-cp27-none-macosx_10_11_intel.whl
> ls dist/
ecell4-4.0.0b2-cp27-none-macosx_10_11_intel.macosx_10_9_intel.macosx_10_9_x86_64.macosx_10_10_intel.macosx_10_10_x86_64.whl
プラットフォームが追加されていることがわかります。
まとめ
まとめるのがだるくなったのでこれで終わります。