LoginSignup
2
1

More than 5 years have passed since last update.

Mac OS X 用 wheel パッケージユーティリティ delocate の紹介

Last updated at Posted at 2015-12-08

この記事は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

プラットフォームが追加されていることがわかります。

まとめ

まとめるのがだるくなったのでこれで終わります。

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1