Python wheels are great. Building them across Mac, Linux, Windows, on multiple versions of Python, is not.
cibuildwheel
is here to help. cibuildwheel
runs on your CI server - currently it supports GitHub Actions, Azure Pipelines, Travis CI, AppVeyor, CircleCI, and GitLab CI - and it builds and tests your wheels across all of your platforms.
What does it do?¶
macOS Intel | macOS Apple Silicon | Windows 64bit | Windows 32bit | manylinux x86_64 | manylinux i686 | manylinux aarch64 | manylinux ppc64le | manylinux s390x | |
---|---|---|---|---|---|---|---|---|---|
CPython 2.7 | ✅ | ✅¹ | ✅¹ | ✅ | ✅ | ||||
CPython 3.5 | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | |
CPython 3.6 | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | |
CPython 3.7 | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | |
CPython 3.8 | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
CPython 3.9 | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
PyPy 2.7 v7.3.3 | ✅ | ✅ | ✅ | ||||||
PyPy 3.6 v7.3.3 | ✅ | ✅ | ✅ | ||||||
PyPy 3.7 (beta) v7.3.3 | ✅ | ✅ | ✅ |
¹ Only using a workaround with a newer compiler; Microsoft removed the 2008 compiler for Python 2.7 in April 2021.
- Builds manylinux, macOS 10.9+, and Windows wheels for CPython and PyPy
- Works on GitHub Actions, Azure Pipelines, Travis CI, AppVeyor, CircleCI, and GitLab CI
- Bundles shared library dependencies on Linux and macOS through auditwheel and delocate
- Runs your library's tests against the wheel-installed version of your library
Usage¶
cibuildwheel
runs inside a CI service. Supported platforms depend on which service you're using:
Linux | macOS | Windows | Linux ARM | |
---|---|---|---|---|
GitHub Actions | ✅ | ✅ | ✅ | ✅¹ |
Azure Pipelines | ✅ | ✅ | ✅ | |
Travis CI | ✅ | ✅ | ✅ | ✅ |
AppVeyor | ✅ | ✅ | ✅ | |
CircleCI | ✅ | ✅ | ||
Gitlab CI | ✅ |
¹ Requires emulation, distributed separately. Other services may also support Linux ARM through emulation or third-party build hosts, but these are not tested in our CI.
cibuildwheel
is not intended to run on your development machine. Because it uses system Python from Python.org on macOS and Windows, it will try to install packages globally - not what you expect from a build tool! Instead, isolated CI services like those mentioned above are ideal. For Linux builds, it uses manylinux docker images, so those can be done locally for testing in a pinch.
To get started, head over to the setup guide.