Consolidates the shared object dependencies across multiple wheels
Project description
Introduction
When multiple wheels depend on each other and share some .so files, it is possible to rely on auditwheel --exclude to make sure the .so is included in only one of the wheels to avoid duplicating the file in every package.
That allows Python wheels to share the same .so as far as at least one of them is loading them in memory. See https://github.com/pypa/auditwheel/issues/76 and https://github.com/pypa/auditwheel/pull/368 for discussions on the topic.
The problem with this approach is that the package where the .so is included will have the library name mangled by auditwheel, while the ones where it’s excluded will reference to the library with its original name.
Suppose you have libone.whl and libtwo.whl both depending on libfoo.so, and libone is a dependency of libtwo so you already know you can include libfoo.so only in libone.whl, you could do:
auditwheel repair dist/libone.whl auditwheel repair dist/libtwo.whl --exclude libfoo.so
In such case you would end up with the following wheels:
venv/lib/python3.10/site-packages/libone ├── __init__.py ├── _libone.cpython-310-aarch64-linux-gnu.so venv/lib/python3.10/site-packages/libone.libs └── libfoo-ef63151d.so venv/lib/python3.10/site-packages/libtwo ├── __init__.py ├── _libtwo.cpython-310-aarch64-linux-gnu.so
The problem would be that while _libone.cpython-310-aarch64-linux-gnu.so was patched by auditwheel to know about the libfoo-ef63151d.so name, _libtwo.cpython-310-aarch64-linux-gnu.so was not, and so still refers to the original name:
$ ldd venv/lib/python3.10/site-packages/libone/_libone.cpython-310-aarch64-linux-gnu.so libfoo-ef63151d.so => ../libone.libs/libfoo-ef63151d.so (0x0000ffff8f8f0000) $ ldd venv/lib/python3.10/site-packages/libtwo/_libtwo.cpython-310-aarch64-linux-gnu.so libfoo.so => not found
Which means that trying to import libtwo will fail with:
ImportError: libfoo.so: cannot open shared object file: No such file or directory
Which makes sense, because we actually provided libfoo-ef63151d.so and not libfoo.so.
To solve this problem consolidatewheels will patch all provided wheels to make sure that they share a single naming convention for libraries that were mangled.
After consolidatewheels is used, the final result would be:
$ ldd venv/lib/python3.10/site-packages/libone/_libone.cpython-310-aarch64-linux-gnu.so libfoo-ef63151d.so => ../libone.libs/libfoo-ef63151d.so (0x0000ffff8f8f0000) $ ldd venv/lib/python3.10/site-packages/libtwo/_libtwo.cpython-310-aarch64-linux-gnu.so libfoo-ef63151d.so => not found
which would work correctly as far as libone is imported _before_ libtwo as they will both look for libfoo-ef63151d.so which was loaded already by libone.
Install
Install with:
$ pip install consolidatewheels
Note that consolidatewheels requires patchelf to be available in the system, and it only works on Linux systems. But those are the same requirements that auditwheel has, so you are probably already satisfying them if you use auditwheel.
Usage
Usage instructions:
consolidate --help
Example:
consolidate libone.whl libtwo.whl --dest=./consolidated_wheels
For a more complex example and a testing environment, you can take a look at https://github.com/amol-/wheeldeps which uses consolidatewheels
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
File details
Details for the file consolidatewheels-0.2.tar.gz
.
File metadata
- Download URL: consolidatewheels-0.2.tar.gz
- Upload date:
- Size: 6.2 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/4.0.2 CPython/3.9.6
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | f7d20774536dcbbc76e20260588e16b14626f3dd3bc5cae8254827fd9c6fe315 |
|
MD5 | ec1e2a1ee4b50669bbffc85f2bbe2802 |
|
BLAKE2b-256 | b52e65054c2a364fec79d516510eed2930a61cdba895afe4789dda10052a5787 |
File details
Details for the file consolidatewheels-0.2-py3-none-any.whl
.
File metadata
- Download URL: consolidatewheels-0.2-py3-none-any.whl
- Upload date:
- Size: 7.2 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/4.0.2 CPython/3.9.6
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 6f897c527759dedac95ad53b9069bf01fcbc7e6f5cbf618a3c47d8807c9a79d7 |
|
MD5 | fc3bc2773340d32c6de403102ea919a7 |
|
BLAKE2b-256 | 6a8803000e0248cc438ece44e21e89b89379549ae7ec1223df27fb288dcaba05 |