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).

You can get a listing of the files depending on each of the libraries, using the --depending flag:

$ delocate-listdeps --depending scipy-0.14.0b1-cp34-cp34m-macosx_10_6_intel.whl
/usr/local/Cellar/gfortran/4.8.2/gfortran/lib/libgcc_s.1.dylib:
    scipy/interpolate/dfitpack.so
    scipy/special/specfun.so
    scipy/interpolate/_fitpack.so
    ...

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.3.0

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

Source distributions (sdists)

Source distribution for delocate 0.3.0
File Size Uploaded
delocate-0.3.0.zip 65.0 kB Details
delocate-0.3.0.tar.gz 49.8 kB Details

Built distributions (wheels)

Table of built distributions (wheels) for delocate 0.3.0
File Interpreter ABI Platform
delocate-0.3.0-py27-none-any.whl Python 2.7 none any Details
delocate-0.3.0-py3-none-any.whl Python 3 none any Details

Total release size: 225.9 kB

Release files / delocate-0.3.0.zip

Download URL delocate-0.3.0.zip
Size 65.0 kB
Tags Source
SHA-256 checksum
How to use checksums
6497d63ba0cbeebcd51be68387bbbac6a54ad06a5517b90be78f8f6cd4b229a5
BLAKE2b-256 checksum
How to use checksums
670ef3c5e508871b8330971e4831d3b3c5961c9d6f74f79a5665753d57bb0404
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No

Release files / delocate-0.3.0.tar.gz

Download URL delocate-0.3.0.tar.gz
Size 49.8 kB
Tags Source
SHA-256 checksum
How to use checksums
c3072bd38031f82f2bc25b55958ba3d46583c638c6746f51f9d9edf4b8c5383d
BLAKE2b-256 checksum
How to use checksums
25426c6b758da048196066066ddfc6b6c903bea66bfda6d0df0357c2e8663cf6
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No

Release files / delocate-0.3.0-py27-none-any.whl

Download URL delocate-0.3.0-py27-none-any.whl
Size 55.6 kB
Tags Python 2.7
SHA-256 checksum
How to use checksums
ca2ba7a400f327773fcccd1f4858e11c3265036838b30c7a6129b0c5892b68f9
BLAKE2b-256 checksum
How to use checksums
aa0423af51904ebb1f59658eeacc85ea0267f68936a535d85def4db38e7af2f2
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No

Release files / delocate-0.3.0-py3-none-any.whl

Download URL delocate-0.3.0-py3-none-any.whl
Size 55.6 kB
Tags Python 3
SHA-256 checksum
How to use checksums
1d4d28ac45f89663efff7fc5990c17c56fdeb849ab31c374ebe4d569c239973b
BLAKE2b-256 checksum
How to use checksums
6d0b84afc830ee065f19bcada9661277410da660bcfb5230230b2c1644a58859
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

This release

0.3.0 This release

4 release files

0.2.1

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