Skip to main content
https://travis-ci.org/matthew-brett/delocate.svg?branch=master

Delocate

OSX utilities to:

  • find dynamic libraries imported from python extensions

  • copy needed dynamic libraries to directory within package

  • update OSX install_names and rpath to cause code to load from copies of libraries

Provides scripts:

  • delocate-listdeps – show libraries a tree depends on

  • delocate-path – copy libraries a tree depends on into the tree and relink

  • delocate-wheel – rewrite wheel having copied and relinked library dependencies into the wheel tree.

The problem

Let’s say you have built a wheel somewhere, but it’s linking to dynamic libraries elsewhere on the machine, so you can’t distribute it, because others may not have these same libraries. Here we analyze the dependencies for a scipy wheel:

$ delocate-listdeps scipy-0.14.0b1-cp34-cp34m-macosx_10_6_intel.whl
/usr/local/Cellar/gfortran/4.8.2/gfortran/lib/libgcc_s.1.dylib
/usr/local/Cellar/gfortran/4.8.2/gfortran/lib/libgfortran.3.dylib
/usr/local/Cellar/gfortran/4.8.2/gfortran/lib/libquadmath.0.dylib

By default, this does not include libraries in /usr/lib and /System. See those too with:

$ delocate-listdeps --all scipy-0.14.0b1-cp34-cp34m-macosx_10_6_intel.whl
/System/Library/Frameworks/Accelerate.framework/Versions/A/Accelerate
/usr/lib/libSystem.B.dylib
/usr/lib/libstdc++.6.dylib
/usr/local/Cellar/gfortran/4.8.2/gfortran/lib/libgcc_s.1.dylib
/usr/local/Cellar/gfortran/4.8.2/gfortran/lib/libgfortran.3.dylib
/usr/local/Cellar/gfortran/4.8.2/gfortran/lib/libquadmath.0.dylib

The output tells me that scipy has picked up dynamic libraries from my homebrew installation of gfortran (as well as the system libs).

A solution

We can fix like this:

$ delocate-wheel -w fixed_wheels -v scipy-0.14.0b1-cp34-cp34m-macosx_10_6_intel.whl
Fixing: scipy-0.14.0b1-cp34-cp34m-macosx_10_6_intel.whl
Copied to package .dylibs directory:
/usr/local/Cellar/gfortran/4.8.2/gfortran/lib/libgcc_s.1.dylib
/usr/local/Cellar/gfortran/4.8.2/gfortran/lib/libgfortran.3.dylib
/usr/local/Cellar/gfortran/4.8.2/gfortran/lib/libquadmath.0.dylib

The -w flag tells delocate-wheel to output to a new wheel directory instead of overwriting the old wheel. -v (verbose) tells you what delocate-wheel is doing. In this case it has made a new directory in the wheel zipfile, named scipy/.dylibs. It has copied all the library dependencies that are outside the OSX system trees into this directory, and patched the python .so extensions in the wheel to use these copies instead of looking in /usr/local/Cellar/gfortran/4.8.2/gfortran/lib.

Check the links again to confirm:

$ delocate-listdeps fixed_wheels/scipy-0.14.0b1-cp34-cp34m-macosx_10_6_intel.whl
@loader_path/libgcc_s.1.dylib
@loader_path/libquadmath.0.dylib
@rpath/libgcc_s.1.dylib
@rpath/libgfortran.3.dylib
@rpath/libquadmath.0.dylib

So - system dylibs the same, but the others moved into the wheel tree.

This makes the wheel more likely to work on another machine which does not have the same version of gfortran installed - in this example.

Code

See https://github.com/matthew-brett/delocate

Released under the BSD two-clause license - see the file LICENSE in the source distribution.

travis-ci kindly tests the code automatically under Python 2.7, 3.3 and 3.4.

The latest released version is at https://pypi.python.org/pypi/delocate

Support

Please put up issues on the delocate issue tracker.

Metadata

Release files for delocate 0.2.1

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for delocate 0.2.1
File Size Uploaded
delocate-0.2.1.tar.gz 46.2 kB Details

Built distributions (wheels)

Table of built distributions (wheels) for delocate 0.2.1
File Interpreter ABI Platform
delocate-0.2.1-py34-none-any.whl Python 3.4 none any Details
delocate-0.2.1-py33-none-any.whl Python 3.3 none any Details
delocate-0.2.1-py2-none-any.whl Python 2 none any Details

Total release size: 214.4 kB

Release files / delocate-0.2.1.tar.gz

Download URL delocate-0.2.1.tar.gz
Size 46.2 kB
Tags Source
SHA-256 checksum
How to use checksums
d326c4375aa075e00be0c8471b2199f0dcbc7b7b0e7525ae7e21ba61ea97369e
BLAKE2b-256 checksum
How to use checksums
31436facc4d4418cc8a82c7369129d44ef89c7b6292cd3d4314e4ca2be50e753
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No

Release files / delocate-0.2.1-py34-none-any.whl

Download URL delocate-0.2.1-py34-none-any.whl
Size 58.1 kB
Tags Python 3.4
SHA-256 checksum
How to use checksums
8c2f9082475af40e72971560f7d5840066bc809b3f1d58c2153a64e43a943436
BLAKE2b-256 checksum
How to use checksums
6ec8116500a6723f22905644047c33f307c9ec16cffe73d51e8fdbc6aef8ac55
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No

Release files / delocate-0.2.1-py33-none-any.whl

Download URL delocate-0.2.1-py33-none-any.whl
Size 58.1 kB
Tags Python 3.3
SHA-256 checksum
How to use checksums
05fafd16ccb81675a430a9caf89e29cf7320c67a58a0508969dc2b87dadb54d8
BLAKE2b-256 checksum
How to use checksums
4c1d3b68a607fe15107aaa77ff916b693680c2f4103741904eddb49ddb198c45
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No

Release files / delocate-0.2.1-py2-none-any.whl

Download URL delocate-0.2.1-py2-none-any.whl
Size 52.0 kB
Tags Python 2
SHA-256 checksum
How to use checksums
4f758c9c68a427d86d514843f06bb6581adfaf8c107ec7c27d6321c88b859e8b
BLAKE2b-256 checksum
How to use checksums
51e7249bce1ff04d18abb5769cf360a75eb6d5319d56c16350501698c2636b43
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No

Release history Release notifications | RSS feed

0.13.0

2 release files

0.12.0

2 release files

0.11.0

2 release files

0.10.7

2 release files

0.10.6

2 release files

0.10.5

2 release files

0.10.4

2 release files

0.10.1

2 release files

0.10.0

2 release files

0.9.1

2 release files

0.9.0

1 release file

0.8.2

1 release file

0.8.1

1 release file

0.8.0

1 release file

0.7.4

1 release file

0.7.3

1 release file

0.7.2

1 release file

0.7.1

1 release file

0.7.0

1 release file

0.6.5

1 release file

0.6.4

3 release files

0.6.3

5 release files

0.6.2

5 release files

0.6.1

5 release files

0.6.0

4 release files

0.5.0

5 release files

0.4.0

5 release files

0.3.0

4 release files

This release

0.2.1 This release

4 release files

0.2.0

5 release files

0.1

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page