Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
1
Help us understand the problem. What is going on with this article?
@kozo2

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

More than 5 years have passed since last update.

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

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

まとめ

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

1
Help us understand the problem. What is going on with this article?
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
kozo2

Comments

No comments
Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account Login
1
Help us understand the problem. What is going on with this article?