Skip to content

Commit 803c5e4

Browse files
mayeutjoerick
andauthored
feat: add musllinux support (PEP 656) (#768)
* feat: add musllinux support (PEP 656) Add musllinux support (PEP 656) allowing to build wheels for musl libc based distros (e.g. Alpine) * feat: add musllinux support (PEP 656) doc * doc: combine `CIBW_MANYLINUX_*_IMAGE` & `CIBW_MUSLLINUX_*_IMAGE` options * fix: doc to be squashed * doc: combine manylinux /musllinux in README * Update docs/options.md Co-authored-by: Joe Rickerby <joerick@mac.com> Co-authored-by: Joe Rickerby <joerick@mac.com>
1 parent d5add42 commit 803c5e4

16 files changed

Lines changed: 182 additions & 69 deletions

README.md

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -22,17 +22,18 @@ Python wheels are great. Building them across **Mac, Linux, Windows**, on **mult
2222
What does it do?
2323
----------------
2424

25-
| | macOS Intel | macOS Apple Silicon | Windows 64bit | Windows 32bit | manylinux x86_64 | manylinux i686 | manylinux aarch64 | manylinux ppc64le | manylinux s390x |
25+
| | macOS Intel | macOS Apple Silicon | Windows 64bit | Windows 32bit | manylinux<br/>musllinux x86_64 | manylinux<br/>musllinux i686 | manylinux<br/>musllinux aarch64 | manylinux<br/>musllinux ppc64le | manylinux<br/>musllinux s390x |
2626
|---------------|----|-----|-----|-----|----|-----|----|-----|-----|
2727
| CPython 3.6 || N/A ||||||||
2828
| CPython 3.7 || N/A ||||||||
2929
| CPython 3.8 ||||||||||
3030
| CPython 3.9 ||||||||||
3131
| CPython 3.10 ||||||||||
32-
| PyPy 3.7 v7.3 || N/A || N/A |||| N/A | N/A |
32+
| PyPy 3.7 v7.3 || N/A || N/A |¹ |¹ |¹ | N/A | N/A |
3333

34+
<sup>¹ PyPy is only supported for manylinux wheels.</sup><br>
3435

35-
- Builds manylinux, macOS 10.9+, and Windows wheels for CPython and PyPy
36+
- Builds manylinux, musllinux, macOS 10.9+, and Windows wheels for CPython and PyPy
3637
- Works on GitHub Actions, Azure Pipelines, Travis CI, AppVeyor, CircleCI, and GitLab CI
3738
- Bundles shared library dependencies on Linux and macOS through [auditwheel](https://github.com/pypa/auditwheel) and [delocate](https://github.com/matthew-brett/delocate)
3839
- Runs your library's tests against the wheel-installed version of your library
@@ -62,7 +63,7 @@ Usage
6263
Example setup
6364
-------------
6465

65-
To build manylinux, macOS, and Windows wheels on GitHub Actions, you could use this `.github/workflows/wheels.yml`:
66+
To build manylinux, musllinux, macOS, and Windows wheels on GitHub Actions, you could use this `.github/workflows/wheels.yml`:
6667

6768
```yaml
6869
name: Build
@@ -114,7 +115,7 @@ Options
114115
| | [`CIBW_BEFORE_ALL`](https://cibuildwheel.readthedocs.io/en/stable/options/#before-all) | Execute a shell command on the build system before any wheels are built. |
115116
| | [`CIBW_BEFORE_BUILD`](https://cibuildwheel.readthedocs.io/en/stable/options/#before-build) | Execute a shell command preparing each wheel's build |
116117
| | [`CIBW_REPAIR_WHEEL_COMMAND`](https://cibuildwheel.readthedocs.io/en/stable/options/#repair-wheel-command) | Execute a shell command to repair each (non-pure Python) built wheel |
117-
| | [`CIBW_MANYLINUX_*_IMAGE`](https://cibuildwheel.readthedocs.io/en/stable/options/#manylinux-image) | Specify alternative manylinux Docker images |
118+
| | [`CIBW_MANYLINUX_*_IMAGE`<br/>`CIBW_MUSLLINUX_*_IMAGE`](https://cibuildwheel.readthedocs.io/en/stable/options/#linux-image) | Specify alternative manylinux / musllinux Docker images |
118119
| | [`CIBW_DEPENDENCY_VERSIONS`](https://cibuildwheel.readthedocs.io/en/stable/options/#dependency-versions) | Specify how cibuildwheel controls the versions of the tools it uses |
119120
| **Testing** | [`CIBW_TEST_COMMAND`](https://cibuildwheel.readthedocs.io/en/stable/options/#test-command) | Execute a shell command to test each built wheel |
120121
| | [`CIBW_BEFORE_TEST`](https://cibuildwheel.readthedocs.io/en/stable/options/#before-test) | Execute a shell command before testing each wheel |

bin/update_docker.py

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,14 +19,15 @@ class Image(NamedTuple):
1919

2020

2121
images = [
22+
# manylinux1 images
2223
Image("manylinux1", "x86_64", "quay.io/pypa/manylinux1_x86_64", None),
2324
Image("manylinux1", "i686", "quay.io/pypa/manylinux1_i686", None),
24-
# 2010 images
25+
# manylinux2010 images
2526
Image("manylinux2010", "x86_64", "quay.io/pypa/manylinux2010_x86_64", None),
2627
Image("manylinux2010", "i686", "quay.io/pypa/manylinux2010_i686", None),
2728
Image("manylinux2010", "pypy_x86_64", "quay.io/pypa/manylinux2010_x86_64", None),
2829
Image("manylinux2010", "pypy_i686", "quay.io/pypa/manylinux2010_i686", None),
29-
# 2014 images
30+
# manylinux2014 images
3031
Image("manylinux2014", "x86_64", "quay.io/pypa/manylinux2014_x86_64", None),
3132
Image("manylinux2014", "i686", "quay.io/pypa/manylinux2014_i686", None),
3233
Image("manylinux2014", "aarch64", "quay.io/pypa/manylinux2014_aarch64", None),
@@ -35,7 +36,7 @@ class Image(NamedTuple):
3536
Image("manylinux2014", "pypy_x86_64", "quay.io/pypa/manylinux2014_x86_64", None),
3637
Image("manylinux2014", "pypy_i686", "quay.io/pypa/manylinux2014_i686", None),
3738
Image("manylinux2014", "pypy_aarch64", "quay.io/pypa/manylinux2014_aarch64", None),
38-
# 2_24 images
39+
# manylinux_2_24 images
3940
Image("manylinux_2_24", "x86_64", "quay.io/pypa/manylinux_2_24_x86_64", None),
4041
Image("manylinux_2_24", "i686", "quay.io/pypa/manylinux_2_24_i686", None),
4142
Image("manylinux_2_24", "aarch64", "quay.io/pypa/manylinux_2_24_aarch64", None),
@@ -44,6 +45,12 @@ class Image(NamedTuple):
4445
Image("manylinux_2_24", "pypy_x86_64", "quay.io/pypa/manylinux_2_24_x86_64", None),
4546
Image("manylinux_2_24", "pypy_i686", "quay.io/pypa/manylinux_2_24_i686", None),
4647
Image("manylinux_2_24", "pypy_aarch64", "quay.io/pypa/manylinux_2_24_aarch64", None),
48+
# musllinux_1_1 images
49+
Image("musllinux_1_1", "x86_64", "quay.io/pypa/musllinux_1_1_x86_64", None),
50+
Image("musllinux_1_1", "i686", "quay.io/pypa/musllinux_1_1_i686", None),
51+
Image("musllinux_1_1", "aarch64", "quay.io/pypa/musllinux_1_1_aarch64", None),
52+
Image("musllinux_1_1", "ppc64le", "quay.io/pypa/musllinux_1_1_ppc64le", None),
53+
Image("musllinux_1_1", "s390x", "quay.io/pypa/musllinux_1_1_s390x", None),
4754
]
4855

4956
config = configparser.ConfigParser()

cibuildwheel/__main__.py

Lines changed: 29 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,14 @@
4141
"pypy_i686",
4242
)
4343

44+
MUSLLINUX_ARCHS = (
45+
"x86_64",
46+
"i686",
47+
"aarch64",
48+
"ppc64le",
49+
"s390x",
50+
)
51+
4452

4553
def main() -> None:
4654
platform: PlatformName
@@ -167,10 +175,13 @@ def main() -> None:
167175
manylinux_identifiers = {
168176
f"manylinux-{build_platform}-image" for build_platform in MANYLINUX_ARCHS
169177
}
178+
musllinux_identifiers = {
179+
f"musllinux-{build_platform}-image" for build_platform in MUSLLINUX_ARCHS
180+
}
170181
disallow = {
171182
"linux": {"dependency-versions"},
172-
"macos": manylinux_identifiers,
173-
"windows": manylinux_identifiers,
183+
"macos": manylinux_identifiers | musllinux_identifiers,
184+
"windows": manylinux_identifiers | musllinux_identifiers,
174185
}
175186
options = ConfigOptions(package_dir, args.config_file, platform=platform, disallow=disallow)
176187
output_dir = Path(
@@ -278,6 +289,7 @@ def main() -> None:
278289
sys.exit(0)
279290

280291
manylinux_images: Dict[str, str] = {}
292+
musllinux_images: Dict[str, str] = {}
281293
if platform == "linux":
282294
pinned_docker_images_file = resources_dir / "pinned_docker_images.cfg"
283295
all_pinned_docker_images = ConfigParser()
@@ -303,6 +315,20 @@ def main() -> None:
303315

304316
manylinux_images[build_platform] = image
305317

318+
for build_platform in MUSLLINUX_ARCHS:
319+
pinned_images = all_pinned_docker_images[build_platform]
320+
321+
config_value = options(f"musllinux-{build_platform}-image")
322+
323+
if config_value is None:
324+
image = pinned_images.get("musllinux_1_1")
325+
elif config_value in pinned_images:
326+
image = pinned_images[config_value]
327+
else:
328+
image = config_value
329+
330+
musllinux_images[build_platform] = image
331+
306332
build_options = BuildOptions(
307333
architectures=archs,
308334
package_dir=package_dir,
@@ -320,6 +346,7 @@ def main() -> None:
320346
environment=environment,
321347
dependency_constraints=dependency_constraints,
322348
manylinux_images=manylinux_images or None,
349+
musllinux_images=musllinux_images or None,
323350
build_frontend=build_frontend,
324351
)
325352

cibuildwheel/linux.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,7 @@ def build(options: BuildOptions) -> None:
6161
sys.exit(2)
6262

6363
assert options.manylinux_images is not None
64+
assert options.musllinux_images is not None
6465
python_configurations = get_python_configurations(options.build_selector, options.architectures)
6566
platforms = [
6667
("cp", "manylinux_x86_64", options.manylinux_images["x86_64"]),
@@ -71,6 +72,11 @@ def build(options: BuildOptions) -> None:
7172
("pp", "manylinux_x86_64", options.manylinux_images["pypy_x86_64"]),
7273
("pp", "manylinux_aarch64", options.manylinux_images["pypy_aarch64"]),
7374
("pp", "manylinux_i686", options.manylinux_images["pypy_i686"]),
75+
("cp", "musllinux_x86_64", options.musllinux_images["x86_64"]),
76+
("cp", "musllinux_i686", options.musllinux_images["i686"]),
77+
("cp", "musllinux_aarch64", options.musllinux_images["aarch64"]),
78+
("cp", "musllinux_ppc64le", options.musllinux_images["ppc64le"]),
79+
("cp", "musllinux_s390x", options.musllinux_images["s390x"]),
7480
]
7581

7682
cwd = Path.cwd()

cibuildwheel/logger.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,11 @@
2020
"manylinux_aarch64": "manylinux aarch64",
2121
"manylinux_ppc64le": "manylinux ppc64le",
2222
"manylinux_s390x": "manylinux s390x",
23+
"musllinux_x86_64": "musllinux x86_64",
24+
"musllinux_i686": "musllinux i686",
25+
"musllinux_aarch64": "musllinux aarch64",
26+
"musllinux_ppc64le": "musllinux ppc64le",
27+
"musllinux_s390x": "manylinux s390x",
2328
"win32": "Windows 32bit",
2429
"win_amd64": "Windows 64bit",
2530
"macosx_x86_64": "macOS x86_64",

cibuildwheel/resources/build-platforms.toml

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,31 @@ python_configurations = [
2828
{ identifier = "cp310-manylinux_s390x", version = "3.10", path_str = "/opt/python/cp310-cp310" },
2929
{ identifier = "pp37-manylinux_aarch64", version = "3.7", path_str = "/opt/python/pp37-pypy37_pp73" },
3030
{ identifier = "pp37-manylinux_i686", version = "3.7", path_str = "/opt/python/pp37-pypy37_pp73" },
31+
{ identifier = "cp36-musllinux_x86_64", version = "3.6", path_str = "/opt/python/cp36-cp36m" },
32+
{ identifier = "cp37-musllinux_x86_64", version = "3.7", path_str = "/opt/python/cp37-cp37m" },
33+
{ identifier = "cp38-musllinux_x86_64", version = "3.8", path_str = "/opt/python/cp38-cp38" },
34+
{ identifier = "cp39-musllinux_x86_64", version = "3.9", path_str = "/opt/python/cp39-cp39" },
35+
{ identifier = "cp310-musllinux_x86_64", version = "3.10", path_str = "/opt/python/cp310-cp310" },
36+
{ identifier = "cp36-musllinux_i686", version = "3.6", path_str = "/opt/python/cp36-cp36m" },
37+
{ identifier = "cp37-musllinux_i686", version = "3.7", path_str = "/opt/python/cp37-cp37m" },
38+
{ identifier = "cp38-musllinux_i686", version = "3.8", path_str = "/opt/python/cp38-cp38" },
39+
{ identifier = "cp39-musllinux_i686", version = "3.9", path_str = "/opt/python/cp39-cp39" },
40+
{ identifier = "cp310-musllinux_i686", version = "3.10", path_str = "/opt/python/cp310-cp310" },
41+
{ identifier = "cp36-musllinux_aarch64", version = "3.6", path_str = "/opt/python/cp36-cp36m" },
42+
{ identifier = "cp37-musllinux_aarch64", version = "3.7", path_str = "/opt/python/cp37-cp37m" },
43+
{ identifier = "cp38-musllinux_aarch64", version = "3.8", path_str = "/opt/python/cp38-cp38" },
44+
{ identifier = "cp39-musllinux_aarch64", version = "3.9", path_str = "/opt/python/cp39-cp39" },
45+
{ identifier = "cp310-musllinux_aarch64", version = "3.10", path_str = "/opt/python/cp310-cp310" },
46+
{ identifier = "cp36-musllinux_ppc64le", version = "3.6", path_str = "/opt/python/cp36-cp36m" },
47+
{ identifier = "cp37-musllinux_ppc64le", version = "3.7", path_str = "/opt/python/cp37-cp37m" },
48+
{ identifier = "cp38-musllinux_ppc64le", version = "3.8", path_str = "/opt/python/cp38-cp38" },
49+
{ identifier = "cp39-musllinux_ppc64le", version = "3.9", path_str = "/opt/python/cp39-cp39" },
50+
{ identifier = "cp310-musllinux_ppc64le", version = "3.10", path_str = "/opt/python/cp310-cp310" },
51+
{ identifier = "cp36-musllinux_s390x", version = "3.6", path_str = "/opt/python/cp36-cp36m" },
52+
{ identifier = "cp37-musllinux_s390x", version = "3.7", path_str = "/opt/python/cp37-cp37m" },
53+
{ identifier = "cp38-musllinux_s390x", version = "3.8", path_str = "/opt/python/cp38-cp38" },
54+
{ identifier = "cp39-musllinux_s390x", version = "3.9", path_str = "/opt/python/cp39-cp39" },
55+
{ identifier = "cp310-musllinux_s390x", version = "3.10", path_str = "/opt/python/cp310-cp310" },
3156
]
3257

3358
[macos]

cibuildwheel/resources/defaults.toml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,12 @@ manylinux-pypy_x86_64-image = "manylinux2010"
2727
manylinux-pypy_i686-image = "manylinux2010"
2828
manylinux-pypy_aarch64-image = "manylinux2014"
2929

30+
musllinux-x86_64-image = "musllinux_1_1"
31+
musllinux-i686-image = "musllinux_1_1"
32+
musllinux-aarch64-image = "musllinux_1_1"
33+
musllinux-ppc64le-image = "musllinux_1_1"
34+
musllinux-s390x-image = "musllinux_1_1"
35+
3036

3137
[tool.cibuildwheel.linux]
3238
repair-wheel-command = "auditwheel repair -w {dest_dir} {wheel}"
Lines changed: 25 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,38 +1,43 @@
11
[x86_64]
22
manylinux1 = quay.io/pypa/manylinux1_x86_64:2021-09-18-65abb78
3-
manylinux2010 = quay.io/pypa/manylinux2010_x86_64:2021-09-18-c1afc21
4-
manylinux2014 = quay.io/pypa/manylinux2014_x86_64:2021-09-18-c1afc21
5-
manylinux_2_24 = quay.io/pypa/manylinux_2_24_x86_64:2021-09-18-c1afc21
3+
manylinux2010 = quay.io/pypa/manylinux2010_x86_64:2021-09-18-f12faf3
4+
manylinux2014 = quay.io/pypa/manylinux2014_x86_64:2021-09-18-f12faf3
5+
manylinux_2_24 = quay.io/pypa/manylinux_2_24_x86_64:2021-09-18-f12faf3
6+
musllinux_1_1 = quay.io/pypa/musllinux_1_1_x86_64:2021-09-18-f12faf3
67

78
[i686]
89
manylinux1 = quay.io/pypa/manylinux1_i686:2021-09-18-65abb78
9-
manylinux2010 = quay.io/pypa/manylinux2010_i686:2021-09-18-c1afc21
10-
manylinux2014 = quay.io/pypa/manylinux2014_i686:2021-09-18-c1afc21
11-
manylinux_2_24 = quay.io/pypa/manylinux_2_24_i686:2021-09-18-c1afc21
10+
manylinux2010 = quay.io/pypa/manylinux2010_i686:2021-09-18-f12faf3
11+
manylinux2014 = quay.io/pypa/manylinux2014_i686:2021-09-18-f12faf3
12+
manylinux_2_24 = quay.io/pypa/manylinux_2_24_i686:2021-09-18-f12faf3
13+
musllinux_1_1 = quay.io/pypa/musllinux_1_1_i686:2021-09-18-f12faf3
1214

1315
[pypy_x86_64]
14-
manylinux2010 = quay.io/pypa/manylinux2010_x86_64:2021-09-18-c1afc21
15-
manylinux2014 = quay.io/pypa/manylinux2014_x86_64:2021-09-18-c1afc21
16-
manylinux_2_24 = quay.io/pypa/manylinux_2_24_x86_64:2021-09-18-c1afc21
16+
manylinux2010 = quay.io/pypa/manylinux2010_x86_64:2021-09-18-f12faf3
17+
manylinux2014 = quay.io/pypa/manylinux2014_x86_64:2021-09-18-f12faf3
18+
manylinux_2_24 = quay.io/pypa/manylinux_2_24_x86_64:2021-09-18-f12faf3
1719

1820
[pypy_i686]
19-
manylinux2010 = quay.io/pypa/manylinux2010_i686:2021-09-18-c1afc21
20-
manylinux2014 = quay.io/pypa/manylinux2014_i686:2021-09-18-c1afc21
21-
manylinux_2_24 = quay.io/pypa/manylinux_2_24_i686:2021-09-18-c1afc21
21+
manylinux2010 = quay.io/pypa/manylinux2010_i686:2021-09-18-f12faf3
22+
manylinux2014 = quay.io/pypa/manylinux2014_i686:2021-09-18-f12faf3
23+
manylinux_2_24 = quay.io/pypa/manylinux_2_24_i686:2021-09-18-f12faf3
2224

2325
[aarch64]
24-
manylinux2014 = quay.io/pypa/manylinux2014_aarch64:2021-09-18-c1afc21
25-
manylinux_2_24 = quay.io/pypa/manylinux_2_24_aarch64:2021-09-18-c1afc21
26+
manylinux2014 = quay.io/pypa/manylinux2014_aarch64:2021-09-18-f12faf3
27+
manylinux_2_24 = quay.io/pypa/manylinux_2_24_aarch64:2021-09-18-f12faf3
28+
musllinux_1_1 = quay.io/pypa/musllinux_1_1_aarch64:2021-09-18-f12faf3
2629

2730
[ppc64le]
28-
manylinux2014 = quay.io/pypa/manylinux2014_ppc64le:2021-09-18-c1afc21
29-
manylinux_2_24 = quay.io/pypa/manylinux_2_24_ppc64le:2021-09-18-c1afc21
31+
manylinux2014 = quay.io/pypa/manylinux2014_ppc64le:2021-09-18-f12faf3
32+
manylinux_2_24 = quay.io/pypa/manylinux_2_24_ppc64le:2021-09-18-f12faf3
33+
musllinux_1_1 = quay.io/pypa/musllinux_1_1_ppc64le:2021-09-18-f12faf3
3034

3135
[s390x]
32-
manylinux2014 = quay.io/pypa/manylinux2014_s390x:2021-09-18-c1afc21
33-
manylinux_2_24 = quay.io/pypa/manylinux_2_24_s390x:2021-09-18-c1afc21
36+
manylinux2014 = quay.io/pypa/manylinux2014_s390x:2021-09-18-f12faf3
37+
manylinux_2_24 = quay.io/pypa/manylinux_2_24_s390x:2021-09-18-f12faf3
38+
musllinux_1_1 = quay.io/pypa/musllinux_1_1_s390x:2021-09-18-f12faf3
3439

3540
[pypy_aarch64]
36-
manylinux2014 = quay.io/pypa/manylinux2014_aarch64:2021-09-18-c1afc21
37-
manylinux_2_24 = quay.io/pypa/manylinux_2_24_aarch64:2021-09-18-c1afc21
41+
manylinux2014 = quay.io/pypa/manylinux2014_aarch64:2021-09-18-f12faf3
42+
manylinux_2_24 = quay.io/pypa/manylinux_2_24_aarch64:2021-09-18-f12faf3
3843

cibuildwheel/util.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -215,6 +215,7 @@ class BuildOptions(NamedTuple):
215215
before_build: Optional[str]
216216
repair_command: str
217217
manylinux_images: Optional[Dict[str, str]]
218+
musllinux_images: Optional[Dict[str, str]]
218219
dependency_constraints: Optional[DependencyConstraints]
219220
test_command: Optional[str]
220221
test_selector: TestSelector

docs/changelog.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@ _1 May 2021_
6666
_22 Feb 2021_
6767

6868
- ✨ Added `manylinux_2_24` support. To use these new Debian-based manylinux
69-
images, set your [manylinux image](https://cibuildwheel.readthedocs.io/en/stable/options/#manylinux-image)
69+
images, set your [manylinux image](https://cibuildwheel.readthedocs.io/en/stable/options/#linux-image)
7070
options to `manylinux_2_24`.
7171
- 🛠 On macOS, we now set `MACOSX_DEPLOYMENT_TARGET` in before running
7272
`CIBW_BEFORE_ALL`. This is useful when using `CIBW_BEFORE_ALL` to build a
@@ -321,7 +321,7 @@ _2 May 2020_
321321
Studio can still effect things.
322322

323323
This can be controlled using the [CIBW_DEPENDENCY_VERSIONS](https://cibuildwheel.readthedocs.io/en/stable/options/#dependency-versions)
324-
and [manylinux image](https://cibuildwheel.readthedocs.io/en/stable/options/#manylinux-image)
324+
and [manylinux image](https://cibuildwheel.readthedocs.io/en/stable/options/#linux-image)
325325
options - if you always want to use the latest toolchain, you can still do
326326
that, or you can specify your own pip constraints file and manylinux image.
327327
(#256)
@@ -396,7 +396,7 @@ _10 November 2019_
396396
build using the manylinux2010 images by default. If your project is still
397397
manylinux1 compatible, you should get both manylinux1 and manylinux2010
398398
wheels - you can upload both to PyPI. If you always require manylinux1 wheels, you can
399-
build using the old manylinux1 image using the [manylinux image](https://cibuildwheel.readthedocs.io/en/stable/options/#manylinux-image) option.
399+
build using the old manylinux1 image using the [manylinux image](https://cibuildwheel.readthedocs.io/en/stable/options/#linux-image) option.
400400
(#155)
401401
- 📚 Documentation is now on its [own mini-site](https://cibuildwheel.readthedocs.io),
402402
rather than on the README (#169)

0 commit comments

Comments
 (0)