Merge remote-tracking branch 'upstream/main' into arm64
This commit is contained in:
+57
@@ -0,0 +1,57 @@
|
||||
run_tests: &RUN_TESTS
|
||||
install_cibuildwheel_script:
|
||||
- python -m pip install -e ".[dev]" pytest-custom-exit-code
|
||||
run_cibuildwheel_tests_script:
|
||||
- python ./bin/run_tests.py
|
||||
|
||||
|
||||
linux_x86_task:
|
||||
compute_engine_instance:
|
||||
image_project: cirrus-images
|
||||
image: family/docker-builder
|
||||
platform: linux
|
||||
cpu: 8
|
||||
memory: 8G
|
||||
|
||||
install_pre_requirements_script:
|
||||
- apt install -y python3-venv python-is-python3
|
||||
<<: *RUN_TESTS
|
||||
|
||||
linux_aarch64_task:
|
||||
compute_engine_instance:
|
||||
image_project: cirrus-images
|
||||
image: family/docker-builder-arm64
|
||||
architecture: arm64
|
||||
platform: linux
|
||||
cpu: 4
|
||||
memory: 4G
|
||||
|
||||
install_pre_requirements_script:
|
||||
- apt install -y python3-venv python-is-python3
|
||||
<<: *RUN_TESTS
|
||||
|
||||
windows_x86_task:
|
||||
# The task takes ~55 minutes while the timeout happens
|
||||
# after 60 minutes by default, let's allow some wiggle room.
|
||||
timeout_in: 90m
|
||||
windows_container:
|
||||
image: cirrusci/windowsservercore:visualstudio2022
|
||||
cpu: 8
|
||||
memory: 8G
|
||||
|
||||
install_pre_requirements_script:
|
||||
- choco install -y --no-progress python3 --version 3.10.6
|
||||
- refreshenv
|
||||
- echo PATH=%PATH% >> "%CIRRUS_ENV%"
|
||||
<<: *RUN_TESTS
|
||||
|
||||
macos_arm64_task:
|
||||
macos_instance:
|
||||
image: ghcr.io/cirruslabs/macos-monterey-xcode
|
||||
|
||||
env:
|
||||
PATH: /opt/homebrew/opt/python@3.10/bin:$PATH
|
||||
install_pre_requirements_script:
|
||||
- brew install python@3.10
|
||||
- ln -s python3 /opt/homebrew/opt/python@3.10/bin/python
|
||||
<<: *RUN_TESTS
|
||||
@@ -1,10 +1,10 @@
|
||||
This is a summary of the Python versions and platforms covered by the different CI platforms:
|
||||
|
||||
| | 3.7 | 3.8 | 3.9 | 3.10 |
|
||||
|----------|-----------------------|---------------------------|----------|----------------|
|
||||
| Linux | AppVeyor¹ / Travis CI | Azure Pipelines / GitLab | CircleCI | GitHub Actions |
|
||||
| macOS | AppVeyor¹ / Travis CI | Azure Pipelines | CircleCI | GitHub Actions |
|
||||
| Windows | AppVeyor¹ / Travis CI | Azure Pipelines | | GitHub Actions |
|
||||
| | 3.7 | 3.8 | 3.9 | 3.10 |
|
||||
|----------|-----------------------|---------------------------|----------|---------------------------|
|
||||
| Linux | AppVeyor¹ / Travis CI | Azure Pipelines / GitLab | CircleCI | GitHub Actions, Cirrus CI |
|
||||
| macOS | AppVeyor¹ / Travis CI | Azure Pipelines | CircleCI | GitHub Actions, Cirrus CI |
|
||||
| Windows | AppVeyor¹ / Travis CI | Azure Pipelines | | GitHub Actions, Cirrus CI |
|
||||
|
||||
> ¹ AppVeyor only runs the "basic" test to reduce load.
|
||||
|
||||
|
||||
@@ -8,6 +8,7 @@ cibuildwheel
|
||||
[](https://ci.appveyor.com/project/joerick/cibuildwheel/branch/main)
|
||||
[](https://circleci.com/gh/pypa/cibuildwheel)
|
||||
[](https://dev.azure.com/joerick0429/cibuildwheel/_build/latest?definitionId=4&branchName=main)
|
||||
[](https://cirrus-ci.com/github/pypa/cibuildwheel)
|
||||
|
||||
|
||||
[Documentation](https://cibuildwheel.readthedocs.org)
|
||||
@@ -39,7 +40,7 @@ What does it do?
|
||||
<sup>³ Alpine 3.14 and very briefly 3.15's default python3 [was not able to load](https://github.com/pypa/cibuildwheel/issues/934) musllinux wheels. This has been fixed; please upgrade the python package if using Alpine from before the fix.</sup><br>
|
||||
|
||||
- Builds manylinux, musllinux, macOS 10.9+, and Windows wheels for CPython and PyPy
|
||||
- Works on GitHub Actions, Azure Pipelines, Travis CI, AppVeyor, CircleCI, and GitLab CI
|
||||
- Works on GitHub Actions, Azure Pipelines, Travis CI, AppVeyor, CircleCI, GitLab CI, and Cirrus CI
|
||||
- Bundles shared library dependencies on Linux and macOS through [auditwheel](https://github.com/pypa/auditwheel) and [delocate](https://github.com/matthew-brett/delocate)
|
||||
- Runs your library's tests against the wheel-installed version of your library
|
||||
|
||||
@@ -50,16 +51,19 @@ 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 | ✅ | | | |
|
||||
| | Linux | macOS | Windows | Linux ARM | macOS ARM |
|
||||
|-----------------|-------|-------|---------|-----------|-----------|
|
||||
| GitHub Actions | ✅ | ✅ | ✅ | ✅¹ | ✅² |
|
||||
| Azure Pipelines | ✅ | ✅ | ✅ | | ✅² |
|
||||
| Travis CI | ✅ | | ✅ | ✅ | ✅² |
|
||||
| AppVeyor | ✅ | ✅ | ✅ | | ✅² |
|
||||
| CircleCI | ✅ | ✅ | | | ✅² |
|
||||
| Gitlab CI | ✅ | | | | ✅² |
|
||||
| Cirrus CI | ✅ | ✅³ | ✅ | ✅ | ✅ |
|
||||
|
||||
<sup>¹ [Requires emulation](https://cibuildwheel.readthedocs.io/en/stable/faq/#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.</sup><br>
|
||||
<sup>² [Uses cross-compilation](https://cibuildwheel.readthedocs.io/en/stable/faq/#universal2). It is not possible to test `arm64` and the `arm64` part of a `universal2` wheel on this CI platform.</sup><br>
|
||||
<sup>³ [Uses cross-compilation](https://cibuildwheel.readthedocs.io/en/stable/faq/#universal2). Thanks to Rosetta 2 emulation, it is possible to test `x86_64` and both parts of a `universal2` wheel on this CI platform.</sup><br>
|
||||
|
||||
<!--intro-end-->
|
||||
|
||||
@@ -179,6 +183,7 @@ Here are some repos that use cibuildwheel.
|
||||
[circleci icon]: docs/data/readme_icons/circleci.svg
|
||||
[gitlab icon]: docs/data/readme_icons/gitlab.svg
|
||||
[travisci icon]: docs/data/readme_icons/travisci.svg
|
||||
[cirrusci icon]: docs/data/readme_icons/cirrusci.svg
|
||||
[windows icon]: docs/data/readme_icons/windows.svg
|
||||
[apple icon]: docs/data/readme_icons/apple.svg
|
||||
[linux icon]: docs/data/readme_icons/linux.svg
|
||||
|
||||
@@ -32,6 +32,7 @@ ICONS = (
|
||||
"circleci",
|
||||
"gitlab",
|
||||
"travisci",
|
||||
"cirrusci",
|
||||
"windows",
|
||||
"apple",
|
||||
"linux",
|
||||
|
||||
@@ -66,6 +66,11 @@ services = [
|
||||
dst_config_path=".gitlab-ci.yml",
|
||||
badge_md="[](https://gitlab.com/pypa/cibuildwheel/-/commits/{branch})",
|
||||
),
|
||||
CIService(
|
||||
name="cirrus-ci",
|
||||
dst_config_path=".cirrus.yml",
|
||||
badge_md="[](https://cirrus-ci.com/github/pypa/cibuildwheel/{branch})",
|
||||
),
|
||||
]
|
||||
|
||||
|
||||
|
||||
@@ -160,9 +160,9 @@ def build_in_directory(args: CommandLineArguments) -> None:
|
||||
textwrap.dedent(
|
||||
"""
|
||||
cibuildwheel: Unable to detect platform. cibuildwheel should run on your CI server;
|
||||
Travis CI, AppVeyor, Azure Pipelines, GitHub Actions, CircleCI, and Gitlab are
|
||||
supported. You can run on your development machine or other CI providers using the
|
||||
--platform argument. Check --help output for more information.
|
||||
Travis CI, AppVeyor, Azure Pipelines, GitHub Actions, CircleCI, Gitlab, and Cirrus CI
|
||||
are supported. You can run on your development machine or other CI providers
|
||||
using the --platform argument. Check --help output for more information.
|
||||
"""
|
||||
),
|
||||
file=sys.stderr,
|
||||
|
||||
@@ -349,6 +349,7 @@ def build(options: Options, tmp_path: Path) -> None: # pylint: disable=unused-a
|
||||
If you're building on Travis CI, add `services: [docker]` to
|
||||
your .travis.yml. If you're building on Circle CI in Linux,
|
||||
add a `setup_remote_docker` step to your .circleci/config.yml.
|
||||
If you're building on Cirrus CI, use `docker_builder` task.
|
||||
"""
|
||||
),
|
||||
file=sys.stderr,
|
||||
|
||||
@@ -393,6 +393,7 @@ class CIProvider(Enum):
|
||||
azure_pipelines = "azure_pipelines"
|
||||
github_actions = "github_actions"
|
||||
gitlab = "gitlab"
|
||||
cirrus_ci = "cirrus_ci"
|
||||
other = "other"
|
||||
|
||||
|
||||
@@ -409,6 +410,8 @@ def detect_ci_provider() -> CIProvider | None:
|
||||
return CIProvider.github_actions
|
||||
elif "GITLAB_CI" in os.environ:
|
||||
return CIProvider.gitlab
|
||||
elif "CIRRUS_CI" in os.environ:
|
||||
return CIProvider.cirrus_ci
|
||||
elif strtobool(os.environ.get("CI", "false")):
|
||||
return CIProvider.other
|
||||
else:
|
||||
|
||||
@@ -2,6 +2,8 @@
|
||||
title: Changelog
|
||||
---
|
||||
|
||||
# Changelog
|
||||
|
||||
### v2.9.0
|
||||
|
||||
_11 August 2022_
|
||||
|
||||
@@ -2,6 +2,8 @@
|
||||
title: Contributing
|
||||
---
|
||||
|
||||
# Contributing
|
||||
|
||||
Wheel-building can be pretty complex. We expect users to find edge-cases - please help the rest of the community out by documenting these, adding features to support them, and reporting bugs.
|
||||
|
||||
If you have an idea for a modification or feature, it's probably best to raise an issue first and discuss it with the maintainer team. Once we have rough consensus on a design, begin work in a PR.
|
||||
|
||||
@@ -2,6 +2,8 @@
|
||||
title: Modern C++ standards
|
||||
---
|
||||
|
||||
# Modern C++ standards
|
||||
|
||||
Building Python wheels with modern C++ standards (C++11 and later) requires a few tricks.
|
||||
|
||||
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
# stars: GitHub repo (optional, if different from package, such as for Twisted)
|
||||
# pypi: The pypi name, if different from the GitHub package name
|
||||
# os: Operating system list, [windows, apple, linux] (optional)
|
||||
# ci: [appveyor, github, azurepipelines, circleci, gitlab, travisci] (optional)
|
||||
# ci: [appveyor, github, azurepipelines, circleci, gitlab, travisci, cirrusci] (optional)
|
||||
# notes: (text, optional)
|
||||
|
||||
- name: abess
|
||||
|
||||
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" role="img" viewBox="0 0 24 24" width="16px" fill="#606060"><title>Cirrus CI icon</title><path d="M19.422.453a1.113 1.113 0 0 0-1.113 1.115 1.113 1.113 0 0 0 1.112 1.114c1.31 0 2.35 1.042 2.35 2.363 0 1.32-1.04 2.363-2.35 2.363H1.112A1.113 1.113 0 0 0 0 8.52a1.113 1.113 0 0 0 1.113 1.117h18.31c1.308 0 2.35 1.042 2.35 2.363 0 1.32-1.042 2.363-2.35 2.363H1.112A1.113 1.113 0 0 0 0 15.48a1.113 1.113 0 0 0 1.113 1.112h18.31c1.308 0 2.35 1.042 2.35 2.363 0 1.32-1.042 2.363-2.35 2.363H1.112A1.113 1.113 0 0 0 0 22.432a1.113 1.113 0 0 0 1.113 1.115h18.31a1.113 1.113 0 0 0 .206-.022c2.42-.112 4.37-2.12 4.37-4.57 0-1.393-.642-2.634-1.63-3.478C23.356 14.632 24 13.393 24 12c0-1.393-.643-2.632-1.63-3.477C23.357 7.68 24 6.438 24 5.045c0-2.52-2.06-4.592-4.578-4.592z"/></svg>
|
||||
|
After Width: | Height: | Size: 808 B |
@@ -2,6 +2,8 @@
|
||||
title: Delivering to PyPI
|
||||
---
|
||||
|
||||
# Delivering to PyPI
|
||||
|
||||
After you've built your wheels, you'll probably want to deliver them to PyPI.
|
||||
|
||||
## Manual method
|
||||
|
||||
+91
-2
@@ -4,6 +4,7 @@
|
||||
body {
|
||||
overflow-wrap: break-word;
|
||||
overflow-x: hidden;
|
||||
-webkit-font-smoothing: antialiased;
|
||||
}
|
||||
|
||||
p {
|
||||
@@ -62,6 +63,13 @@ h1, h2, h3, h4, h5, h6 {
|
||||
border: none;
|
||||
}
|
||||
|
||||
@media screen and (max-width: 768px) {
|
||||
.wy-nav-content-wrap .wy-nav-content {
|
||||
padding: 1em;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
Code block filename style
|
||||
|
||||
@@ -105,10 +113,10 @@ h1, h2, h3, h4, h5, h6 {
|
||||
.code-block-filename + pre code {
|
||||
padding-top: 0.9em;
|
||||
}
|
||||
|
||||
/*
|
||||
.toctree-l3 {
|
||||
border-left: 10px solid transparent;
|
||||
}
|
||||
} */
|
||||
|
||||
/* import font awesome 4 for icons */
|
||||
@import url(https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css);
|
||||
@@ -226,3 +234,84 @@ h1, h2, h3, h4, h5, h6 {
|
||||
padding-right: 0;
|
||||
margin-bottom: 0.5em;
|
||||
}
|
||||
|
||||
/* mkdocs update theme fix-ups */
|
||||
|
||||
.rst-content code, .rst-content tt, code {
|
||||
/* border: none; */
|
||||
/* background-color: #f0f1f1; */
|
||||
color: inherit;
|
||||
}
|
||||
.rst-content pre code {
|
||||
border: none;
|
||||
}
|
||||
|
||||
.rst-content h1 code,
|
||||
.rst-content h2 code,
|
||||
.rst-content h3 code,
|
||||
.rst-content h4 code,
|
||||
.rst-content h5 code,
|
||||
.rst-content h6 code {
|
||||
border: none;
|
||||
color: inherit;
|
||||
background-color: #f0f1f1;
|
||||
font-size: 100%;
|
||||
}
|
||||
|
||||
|
||||
/* expand all the toctree entries */
|
||||
.wy-menu-vertical .toctree-l1.current .toctree-l2>ul,
|
||||
.wy-menu-vertical .toctree-l2.current .toctree-l3>ul,
|
||||
.wy-menu-vertical .toctree-l3.current .toctree-l4>ul,
|
||||
.wy-menu-vertical .toctree-l4.current .toctree-l5>ul,
|
||||
.wy-menu-vertical .toctree-l5.current .toctree-l6>ul,
|
||||
.wy-menu-vertical .toctree-l6.current .toctree-l7>ul,
|
||||
.wy-menu-vertical .toctree-l7.current .toctree-l8>ul,
|
||||
.wy-menu-vertical .toctree-l8.current .toctree-l9>ul,
|
||||
.wy-menu-vertical .toctree-l9.current .toctree-l10>ul,
|
||||
.wy-menu-vertical .toctree-l10.current .toctree-l11>ul {
|
||||
display: block;
|
||||
}
|
||||
|
||||
/* hide all the buttons */
|
||||
.wy-menu-vertical li.current>a button.toctree-expand,
|
||||
.wy-menu-vertical li.on a button.toctree-expand,
|
||||
.wy-menu-vertical li.toctree-l2 button.toctree-expand,
|
||||
.wy-menu-vertical li a button.toctree-expand {
|
||||
display: none;
|
||||
}
|
||||
|
||||
/* toctree layout improvements */
|
||||
.wy-menu-vertical a {
|
||||
padding: 0.4em 1.2em;
|
||||
}
|
||||
.wy-menu-vertical li.current>a,
|
||||
.wy-menu-vertical li.on a {
|
||||
font-weight: normal;
|
||||
padding: 0.4em 1.2em;
|
||||
/* border-right: 1px solid #f0f0f0; */
|
||||
}
|
||||
.wy-menu-vertical li.current a {
|
||||
padding: 0.4em 1.2em;
|
||||
}
|
||||
.wy-menu-vertical li.toctree-l3 a,
|
||||
.wy-menu-vertical li.toctree-l2.current li.toctree-l3>a {
|
||||
padding-left: 1.8em;
|
||||
}
|
||||
.wy-menu-vertical li.toctree-l2.current>a {
|
||||
padding: 0.4em 1.2em;
|
||||
}
|
||||
.wy-menu-vertical li.toctree-l2.current>a,
|
||||
.wy-menu-vertical li.toctree-l2.current li.toctree-l3>a {
|
||||
background: transparent;
|
||||
}
|
||||
.wy-menu-vertical li.toctree-l2.current>a:hover,
|
||||
.wy-menu-vertical li.toctree-l2.current li.toctree-l3>a:hover {
|
||||
background: #d6d6d6;
|
||||
}
|
||||
.wy-menu-vertical li.current>a.current {
|
||||
background: #fafafa !important;
|
||||
}
|
||||
.wy-menu-vertical li.current a {
|
||||
|
||||
}
|
||||
|
||||
+10
@@ -2,6 +2,8 @@
|
||||
title: Tips and tricks
|
||||
---
|
||||
|
||||
# Tips and tricks
|
||||
|
||||
## Tips
|
||||
|
||||
### Linux builds in containers
|
||||
@@ -81,6 +83,14 @@ Here's an example GitHub Actions workflow with a job that builds for Apple Silic
|
||||
{% include "../examples/github-apple-silicon.yml" %}
|
||||
```
|
||||
|
||||
Here's an example Cirrus CI workflow with a job that builds for macOS Intel through Rosetta 2 emulation and for Apple Silicon natively:
|
||||
|
||||
> .cirrus.yml
|
||||
|
||||
```yml
|
||||
{% include "../examples/cirrus-ci-intel-mac.yml" %}
|
||||
```
|
||||
|
||||
### Building non-native architectures using emulation {: #emulation}
|
||||
|
||||
cibuildwheel supports building non-native architectures on Linux, via
|
||||
|
||||
@@ -2,6 +2,8 @@
|
||||
title: Home
|
||||
---
|
||||
|
||||
# cibuildwheel
|
||||
|
||||
{%
|
||||
include-markdown "../README.md"
|
||||
start="<!--intro-start-->"
|
||||
|
||||
@@ -1,3 +1,5 @@
|
||||
# Options
|
||||
|
||||
## Setting options
|
||||
|
||||
cibuildwheel can either be configured using environment variables, or from
|
||||
@@ -73,6 +75,16 @@ cibuildwheel to run tests, add the following YAML to your CI config file:
|
||||
CIBW_TEST_COMMAND: "pytest {project}/tests"
|
||||
```
|
||||
|
||||
!!! tab "Cirrus CI"
|
||||
|
||||
> .cirrus.yml ([docs](https://cirrus-ci.org/guide/writing-tasks/#environment-variables))
|
||||
|
||||
```yaml
|
||||
env:
|
||||
CIBW_TEST_REQUIRES: pytest
|
||||
CIBW_TEST_COMMAND: "pytest {project}/tests"
|
||||
```
|
||||
|
||||
### Configuration file {: #configuration-file}
|
||||
|
||||
You can configure cibuildwheel with a config file, such as `pyproject.toml`.
|
||||
@@ -1352,6 +1364,12 @@ Some options support placeholders, like `{project}`, `{package}` or `{wheel}`, t
|
||||
margin-top: 28px;
|
||||
overflow-x: auto;
|
||||
}
|
||||
@media screen and (max-width: 768px) {
|
||||
.options-toc {
|
||||
grid-gap: 1em 0.5em;
|
||||
gap: 1em 0.5em;
|
||||
}
|
||||
}
|
||||
.options-toc .header {
|
||||
grid-column: 1 / 3;
|
||||
font-weight: bold;
|
||||
|
||||
+28
-12
@@ -2,7 +2,9 @@
|
||||
title: 'Setup'
|
||||
---
|
||||
|
||||
# Run cibuildwheel locally (optional) {: #local}
|
||||
# Setup
|
||||
|
||||
## Run cibuildwheel locally (optional) {: #local}
|
||||
|
||||
Before getting to CI setup, it can be convenient to test cibuildwheel
|
||||
locally to quickly iterate and track down issues without even touching CI.
|
||||
@@ -89,7 +91,7 @@ You should see the builds taking place. You can experiment with options using en
|
||||
cibuildwheel --platform linux
|
||||
```
|
||||
|
||||
## Linux builds
|
||||
### Linux builds
|
||||
|
||||
If you've got [Docker](https://www.docker.com/products/docker-desktop) installed on
|
||||
your development machine, you can run a Linux build.
|
||||
@@ -105,7 +107,7 @@ they're perfectly reproducible.
|
||||
|
||||
The only side effect to your system will be docker images being pulled.
|
||||
|
||||
## macOS / Windows builds
|
||||
### macOS / Windows builds
|
||||
|
||||
Pre-requisite: you need to have native build tools installed.
|
||||
|
||||
@@ -137,9 +139,9 @@ You can override the cache folder using the ``CIBW_CACHE_PATH`` environment vari
|
||||
```
|
||||
|
||||
|
||||
# Configure a CI service
|
||||
## Configure a CI service
|
||||
|
||||
## GitHub Actions [linux/mac/windows] {: #github-actions}
|
||||
### GitHub Actions [linux/mac/windows] {: #github-actions}
|
||||
|
||||
To build Linux, Mac, and Windows wheels using GitHub Actions, create a `.github/workflows/build_wheels.yml` file in your repo.
|
||||
|
||||
@@ -235,7 +237,7 @@ For more info on this file, check out the [docs](https://help.github.com/en/acti
|
||||
[`examples/github-deploy.yml`](https://github.com/pypa/cibuildwheel/blob/main/examples/github-deploy.yml) extends this minimal example with a demonstration of how to automatically upload the built wheels to PyPI.
|
||||
|
||||
|
||||
## Azure Pipelines [linux/mac/windows] {: #azure-pipelines}
|
||||
### Azure Pipelines [linux/mac/windows] {: #azure-pipelines}
|
||||
|
||||
To build Linux, Mac, and Windows wheels on Azure Pipelines, create a `azure-pipelines.yml` file in your repo.
|
||||
|
||||
@@ -249,7 +251,7 @@ Commit this file, enable building of your repo on Azure Pipelines, and push.
|
||||
|
||||
Wheels will be stored for you and available through the Pipelines interface. For more info on this file, check out the [docs](https://docs.microsoft.com/en-us/azure/devops/pipelines/yaml-schema).
|
||||
|
||||
## Travis CI [linux/windows] {: #travis-ci}
|
||||
### Travis CI [linux/windows] {: #travis-ci}
|
||||
|
||||
To build Linux and Windows wheels on Travis CI, create a `.travis.yml` file in your repo.
|
||||
|
||||
@@ -265,7 +267,7 @@ Then setup a deployment method by following the [Travis CI deployment docs](http
|
||||
|
||||
[`examples/travis-ci-deploy.yml`](https://github.com/pypa/cibuildwheel/blob/main/examples/travis-ci-deploy.yml) extends this minimal example with a demonstration of how to automatically upload the built wheels to PyPI.
|
||||
|
||||
## AppVeyor [linux/mac/windows] {: #appveyor}
|
||||
### AppVeyor [linux/mac/windows] {: #appveyor}
|
||||
|
||||
To build Linux, Mac, and Windows wheels on AppVeyor, create an `appveyor.yml` file in your repo.
|
||||
|
||||
@@ -281,7 +283,7 @@ AppVeyor will store the built wheels for you - you can access them from the proj
|
||||
|
||||
For more info on this config file, check out the [docs](https://www.appveyor.com/docs/).
|
||||
|
||||
## CircleCI [linux/mac] {: #circleci}
|
||||
### CircleCI [linux/mac] {: #circleci}
|
||||
|
||||
To build Linux and Mac wheels on CircleCI, create a `.circleci/config.yml` file in your repo,
|
||||
|
||||
@@ -298,7 +300,7 @@ Commit this file, enable building of your repo on CircleCI, and push.
|
||||
|
||||
CircleCI will store the built wheels for you - you can access them from the project console. Check out the CircleCI [docs](https://circleci.com/docs/2.0/configuration-reference/#section=configuration) for more info on this config file.
|
||||
|
||||
## Gitlab CI [linux] {: #gitlab-ci}
|
||||
### Gitlab CI [linux] {: #gitlab-ci}
|
||||
|
||||
To build Linux wheels on Gitlab CI, create a `.gitlab-ci.yml` file in your repo,
|
||||
|
||||
@@ -312,15 +314,29 @@ Commit this file, and push to Gitlab. The pipeline should start automatically.
|
||||
|
||||
Gitlab will store the built wheels for you - you can access them from the Pipelines view. Check out the Gitlab [docs](https://docs.gitlab.com/ee/ci/yaml/) for more info on this config file.
|
||||
|
||||
## Cirrus CI [linux/mac/windows] {: #cirrus-ci}
|
||||
|
||||
To build Linux, Mac, and Windows wheels on Cirrus CI, create a `.cirrus.yml` file in your repo,
|
||||
|
||||
> .cirrus.yml
|
||||
|
||||
```yaml
|
||||
{% include "../examples/cirrus-ci-minimal.yml" %}
|
||||
```
|
||||
|
||||
Commit this file, enable building of your repo on Cirrus CI, and push.
|
||||
|
||||
Cirrus CI will store the built wheels for you - you can access them from the individual task view. Check out the Cirrus CI [docs](https://cirrus-ci.org/guide/writing-tasks/) for more info on this config file.
|
||||
|
||||
> ⚠️ Got an error? Check the [FAQ](faq.md).
|
||||
|
||||
# Next steps
|
||||
## Next steps
|
||||
|
||||
Once you've got the wheel building successfully, you might want to set up [testing](options.md#test-command) or [automatic releases to PyPI](deliver-to-pypi.md#automatic-method).
|
||||
|
||||
<script>
|
||||
document.addEventListener('DOMContentLoaded', function() {
|
||||
$('a.toctree-l3, .rst-content h2').each(function(i, el) {
|
||||
$('.toctree-l3>a, .rst-content h3').each(function(i, el) {
|
||||
var text = $(el).text()
|
||||
var match = text.match(/(.*) \[([a-z/]+)\]/);
|
||||
|
||||
|
||||
@@ -0,0 +1,271 @@
|
||||
// imported from
|
||||
// https://github.com/readthedocs/sphinx_rtd_theme/blob/bc73ad84068b4ee7d8ddae7e51f5b767e8fd377b/src/theme.js
|
||||
// modified to suit our documentation structure, to not scroll the nav sidebar
|
||||
// when clicked - this is disorienting
|
||||
|
||||
var jQuery = window.jQuery;
|
||||
|
||||
// Sphinx theme nav state
|
||||
function ThemeNav () {
|
||||
|
||||
var nav = {
|
||||
navBar: null,
|
||||
win: null,
|
||||
winScroll: false,
|
||||
winResize: false,
|
||||
linkScroll: false,
|
||||
winPosition: 0,
|
||||
winHeight: null,
|
||||
docHeight: null,
|
||||
isRunning: false
|
||||
};
|
||||
|
||||
nav.enable = function (withStickyNav) {
|
||||
var self = this;
|
||||
|
||||
// TODO this can likely be removed once the theme javascript is broken
|
||||
// out from the RTD assets. This just ensures old projects that are
|
||||
// calling `enable()` get the sticky menu on by default. All other cals
|
||||
// to `enable` should include an argument for enabling the sticky menu.
|
||||
if (typeof(withStickyNav) == 'undefined') {
|
||||
withStickyNav = true;
|
||||
}
|
||||
|
||||
if (self.isRunning) {
|
||||
// Only allow enabling nav logic once
|
||||
return;
|
||||
}
|
||||
|
||||
self.isRunning = true;
|
||||
jQuery(function ($) {
|
||||
self.init($);
|
||||
|
||||
self.reset();
|
||||
self.win.on('hashchange', self.reset);
|
||||
|
||||
if (withStickyNav) {
|
||||
// Set scroll monitor
|
||||
self.win.on('scroll', function () {
|
||||
if (!self.linkScroll) {
|
||||
if (!self.winScroll) {
|
||||
self.winScroll = true;
|
||||
requestAnimationFrame(function() { self.onScroll(); });
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
// Set resize monitor
|
||||
self.win.on('resize', function () {
|
||||
if (!self.winResize) {
|
||||
self.winResize = true;
|
||||
requestAnimationFrame(function() { self.onResize(); });
|
||||
}
|
||||
});
|
||||
|
||||
self.onResize();
|
||||
});
|
||||
|
||||
};
|
||||
|
||||
// TODO remove this with a split in theme and Read the Docs JS logic as
|
||||
// well, it's only here to support 0.3.0 installs of our theme.
|
||||
nav.enableSticky = function() {
|
||||
this.enable(true);
|
||||
};
|
||||
|
||||
nav.init = function ($) {
|
||||
var doc = $(document),
|
||||
self = this;
|
||||
|
||||
this.navBar = $('div.wy-side-scroll:first');
|
||||
this.win = $(window);
|
||||
|
||||
// Set up javascript UX bits
|
||||
$(document)
|
||||
// Shift nav in mobile when clicking the menu.
|
||||
.on('click', "[data-toggle='wy-nav-top']", function() {
|
||||
$("[data-toggle='wy-nav-shift']").toggleClass("shift");
|
||||
$("[data-toggle='rst-versions']").toggleClass("shift");
|
||||
})
|
||||
|
||||
// Nav menu link click operations
|
||||
.on('click', ".wy-menu-vertical .current ul li a", function() {
|
||||
var target = $(this);
|
||||
// Close menu when you click a link.
|
||||
$("[data-toggle='wy-nav-shift']").removeClass("shift");
|
||||
$("[data-toggle='rst-versions']").toggleClass("shift");
|
||||
// Handle dynamic display of l3 and l4 nav lists
|
||||
self.toggleCurrent(target);
|
||||
self.hashChange();
|
||||
})
|
||||
.on('click', "[data-toggle='rst-current-version']", function() {
|
||||
$("[data-toggle='rst-versions']").toggleClass("shift-up");
|
||||
})
|
||||
|
||||
// Make tables responsive
|
||||
$("table.docutils:not(.field-list,.footnote,.citation)")
|
||||
.wrap("<div class='wy-table-responsive'></div>");
|
||||
|
||||
// Add extra class to responsive tables that contain
|
||||
// footnotes or citations so that we can target them for styling
|
||||
$("table.docutils.footnote")
|
||||
.wrap("<div class='wy-table-responsive footnote'></div>");
|
||||
$("table.docutils.citation")
|
||||
.wrap("<div class='wy-table-responsive citation'></div>");
|
||||
|
||||
// Add expand links to all parents of nested ul
|
||||
$('.wy-menu-vertical ul').not('.simple').siblings('a').each(function () {
|
||||
var link = $(this);
|
||||
expand =
|
||||
$('<button class="toctree-expand" title="Open/close menu"></button>');
|
||||
expand.on('click', function (ev) {
|
||||
self.toggleCurrent(link);
|
||||
ev.stopPropagation();
|
||||
return false;
|
||||
});
|
||||
link.prepend(expand);
|
||||
});
|
||||
};
|
||||
|
||||
nav.reset = function () {
|
||||
// Get anchor from URL and open up nested nav
|
||||
var anchor = encodeURI(window.location.hash) || '#';
|
||||
|
||||
try {
|
||||
var vmenu = $('.wy-menu-vertical');
|
||||
var link = vmenu.find('[href="' + anchor + '"]');
|
||||
if (link.length === 0) {
|
||||
// this link was not found in the sidebar.
|
||||
// Find associated id element, then its closest section
|
||||
// in the document and try with that one.
|
||||
var id_elt = $('.document [id="' + anchor.substring(1) + '"]');
|
||||
var closest_section = id_elt.closest('div.section');
|
||||
link = vmenu.find('[href="#' + closest_section.attr("id") + '"]');
|
||||
if (link.length === 0) {
|
||||
// still not found in the sidebar. fall back to main section
|
||||
link = vmenu.find('[href="#"]');
|
||||
}
|
||||
}
|
||||
// If we found a matching link then reset current and re-apply
|
||||
// otherwise retain the existing match
|
||||
if (link.length > 0) {
|
||||
$('.wy-menu-vertical .current')
|
||||
.removeClass('current')
|
||||
.attr('aria-expanded','false');
|
||||
link.addClass('current')
|
||||
.attr('aria-expanded','true');
|
||||
link.closest('li.toctree-l1')
|
||||
.parent()
|
||||
.addClass('current')
|
||||
.attr('aria-expanded','true');
|
||||
for (let i = 1; i <= 10; i++) {
|
||||
link.closest('li.toctree-l' + i)
|
||||
.addClass('current')
|
||||
.attr('aria-expanded','true');
|
||||
}
|
||||
|
||||
// EDIT by joerick
|
||||
console.log('no scroll')
|
||||
// link[0].scrollIntoView();
|
||||
}
|
||||
}
|
||||
catch (err) {
|
||||
console.log("Error expanding nav for anchor", err);
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
nav.onScroll = function () {
|
||||
this.winScroll = false;
|
||||
var newWinPosition = this.win.scrollTop(),
|
||||
winBottom = newWinPosition + this.winHeight,
|
||||
navPosition = this.navBar.scrollTop(),
|
||||
newNavPosition = navPosition + (newWinPosition - this.winPosition);
|
||||
if (newWinPosition < 0 || winBottom > this.docHeight) {
|
||||
return;
|
||||
}
|
||||
this.navBar.scrollTop(newNavPosition);
|
||||
this.winPosition = newWinPosition;
|
||||
};
|
||||
|
||||
nav.onResize = function () {
|
||||
this.winResize = false;
|
||||
this.winHeight = this.win.height();
|
||||
this.docHeight = $(document).height();
|
||||
};
|
||||
|
||||
nav.hashChange = function () {
|
||||
this.linkScroll = true;
|
||||
this.win.one('hashchange', function () {
|
||||
this.linkScroll = false;
|
||||
});
|
||||
};
|
||||
|
||||
nav.toggleCurrent = function (elem) {
|
||||
var parent_li = elem.closest('li');
|
||||
parent_li
|
||||
.siblings('li.current')
|
||||
.removeClass('current')
|
||||
.attr('aria-expanded','false');
|
||||
parent_li
|
||||
.siblings()
|
||||
.find('li.current')
|
||||
.removeClass('current')
|
||||
.attr('aria-expanded','false');
|
||||
var children = parent_li.find('> ul li');
|
||||
// Don't toggle terminal elements.
|
||||
if (children.length) {
|
||||
children
|
||||
.removeClass('current')
|
||||
.attr('aria-expanded','false');
|
||||
parent_li
|
||||
.toggleClass('current')
|
||||
.attr('aria-expanded', function(i, old) {
|
||||
return old == 'true' ? 'false' : 'true';
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
return nav;
|
||||
};
|
||||
|
||||
const ThemeNavInstance = ThemeNav();
|
||||
|
||||
window.SphinxRtdTheme = {
|
||||
Navigation: ThemeNavInstance,
|
||||
// TODO remove this once static assets are split up between the theme
|
||||
// and Read the Docs. For now, this patches 0.3.0 to be backwards
|
||||
// compatible with a pre-0.3.0 layout.html
|
||||
StickyNav: ThemeNavInstance,
|
||||
};
|
||||
|
||||
|
||||
// requestAnimationFrame polyfill by Erik Möller. fixes from Paul Irish and Tino Zijdel
|
||||
// https://gist.github.com/paulirish/1579671
|
||||
// MIT license
|
||||
|
||||
(function() {
|
||||
var lastTime = 0;
|
||||
var vendors = ['ms', 'moz', 'webkit', 'o'];
|
||||
for(var x = 0; x < vendors.length && !window.requestAnimationFrame; ++x) {
|
||||
window.requestAnimationFrame = window[vendors[x]+'RequestAnimationFrame'];
|
||||
window.cancelAnimationFrame = window[vendors[x]+'CancelAnimationFrame']
|
||||
|| window[vendors[x]+'CancelRequestAnimationFrame'];
|
||||
}
|
||||
|
||||
if (!window.requestAnimationFrame)
|
||||
window.requestAnimationFrame = function(callback, element) {
|
||||
var currTime = new Date().getTime();
|
||||
var timeToCall = Math.max(0, 16 - (currTime - lastTime));
|
||||
var id = window.setTimeout(function() { callback(currTime + timeToCall); },
|
||||
timeToCall);
|
||||
lastTime = currTime + timeToCall;
|
||||
return id;
|
||||
};
|
||||
|
||||
if (!window.cancelAnimationFrame)
|
||||
window.cancelAnimationFrame = function(id) {
|
||||
clearTimeout(id);
|
||||
};
|
||||
}());
|
||||
@@ -0,0 +1,21 @@
|
||||
build_and_store_wheels: &BUILD_AND_STORE_WHEELS
|
||||
install_cibuildwheel_script:
|
||||
- python -m pip install cibuildwheel==2.9.0
|
||||
run_cibuildwheel_script:
|
||||
- cibuildwheel
|
||||
wheels_artifacts:
|
||||
path: "wheelhouse/*"
|
||||
|
||||
|
||||
macos_task:
|
||||
name: Build macOS x86_64 and arm64 wheels.
|
||||
macos_instance:
|
||||
image: ghcr.io/cirruslabs/macos-monterey-xcode
|
||||
|
||||
env:
|
||||
PATH: /opt/homebrew/opt/python@3.10/bin:$PATH
|
||||
CIBW_ARCHS_MACOS: x86_64 arm64
|
||||
install_pre_requirements_script:
|
||||
- brew install python@3.10
|
||||
- ln -s python3 /opt/homebrew/opt/python@3.10/bin/python
|
||||
<<: *BUILD_AND_STORE_WHEELS
|
||||
@@ -0,0 +1,60 @@
|
||||
build_and_store_wheels: &BUILD_AND_STORE_WHEELS
|
||||
install_cibuildwheel_script:
|
||||
- python -m pip install cibuildwheel==2.9.0
|
||||
run_cibuildwheel_script:
|
||||
- cibuildwheel
|
||||
wheels_artifacts:
|
||||
path: "wheelhouse/*"
|
||||
|
||||
|
||||
linux_x86_task:
|
||||
name: Build Linux x86 wheels.
|
||||
compute_engine_instance:
|
||||
image_project: cirrus-images
|
||||
image: family/docker-builder
|
||||
platform: linux
|
||||
cpu: 4
|
||||
memory: 4G
|
||||
|
||||
install_pre_requirements_script:
|
||||
- apt install -y python3-venv python-is-python3
|
||||
<<: *BUILD_AND_STORE_WHEELS
|
||||
|
||||
linux_aarch64_task:
|
||||
name: Build Linux aarch64 wheels.
|
||||
compute_engine_instance:
|
||||
image_project: cirrus-images
|
||||
image: family/docker-builder-arm64
|
||||
architecture: arm64
|
||||
platform: linux
|
||||
cpu: 4
|
||||
memory: 4G
|
||||
|
||||
install_pre_requirements_script:
|
||||
- apt install -y python3-venv python-is-python3
|
||||
<<: *BUILD_AND_STORE_WHEELS
|
||||
|
||||
windows_x86_task:
|
||||
name: Build Windows x86 wheels.
|
||||
windows_container:
|
||||
image: cirrusci/windowsservercore:visualstudio2022
|
||||
cpu: 4
|
||||
memory: 4G
|
||||
|
||||
install_pre_requirements_script:
|
||||
- choco install -y --no-progress python3 --version 3.10.6
|
||||
- refreshenv
|
||||
- echo PATH=%PATH% >> "%CIRRUS_ENV%"
|
||||
<<: *BUILD_AND_STORE_WHEELS
|
||||
|
||||
macos_arm64_task:
|
||||
name: Build macOS arm64 wheels.
|
||||
macos_instance:
|
||||
image: ghcr.io/cirruslabs/macos-monterey-xcode
|
||||
|
||||
env:
|
||||
PATH: /opt/homebrew/opt/python@3.10/bin:$PATH
|
||||
install_pre_requirements_script:
|
||||
- brew install python@3.10
|
||||
- ln -s python3 /opt/homebrew/opt/python@3.10/bin/python
|
||||
<<: *BUILD_AND_STORE_WHEELS
|
||||
@@ -5,6 +5,9 @@ theme:
|
||||
highlightjs: true
|
||||
hljs_languages:
|
||||
- yaml
|
||||
collapse_navigation: false
|
||||
navigation_depth: 3
|
||||
custom_dir: docs/theme_overrides
|
||||
repo_url: https://github.com/pypa/cibuildwheel
|
||||
edit_uri: edit/main/docs/
|
||||
|
||||
@@ -14,6 +17,7 @@ extra_css:
|
||||
extra_javascript:
|
||||
- extra.js
|
||||
|
||||
|
||||
nav:
|
||||
- Home: index.md
|
||||
- setup.md
|
||||
|
||||
@@ -5,11 +5,10 @@ from setuptools import setup
|
||||
extras = {
|
||||
"docs": [
|
||||
"mkdocs-include-markdown-plugin==2.8.0",
|
||||
"mkdocs==1.0.4", # Doesn't support Python 3.10+
|
||||
"jinja2==3.0.3",
|
||||
"mkdocs==1.3.1",
|
||||
"jinja2>=3.1.2",
|
||||
"pymdown-extensions",
|
||||
"mkdocs-macros-plugin",
|
||||
"markdown<3.4", # Breaks mkdocs 1.0.4
|
||||
],
|
||||
"test": [
|
||||
"jinja2",
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
from __future__ import annotations
|
||||
|
||||
import platform
|
||||
import re
|
||||
import textwrap
|
||||
|
||||
@@ -60,6 +61,8 @@ def test_pinned_versions(tmp_path, python_version, build_frontend_env):
|
||||
build_environment = {}
|
||||
|
||||
if python_version == "3.6":
|
||||
if utils.platform == "macos" and platform.machine() == "arm64":
|
||||
pytest.skip("macOS arm64 does not support Python 3.6")
|
||||
constraint_filename = "constraints-python36.txt"
|
||||
build_pattern = "[cp]p36-*"
|
||||
elif python_version == "3.7":
|
||||
@@ -120,7 +123,7 @@ def test_dependency_constraints_file(tmp_path, build_frontend_env):
|
||||
tool_versions = {
|
||||
"pip": "20.0.2",
|
||||
"setuptools": "53.0.0",
|
||||
"wheel": "0.34.2",
|
||||
"wheel": "0.36.2",
|
||||
"virtualenv": "20.11.2",
|
||||
}
|
||||
|
||||
|
||||
@@ -51,13 +51,13 @@ def test(capfd, tmp_path):
|
||||
add_env={
|
||||
"CIBW_BEFORE_BUILD": "python {project}/bin/before_build.py",
|
||||
"CIBW_TEST_COMMAND": "python {package}/test/run_tests.py",
|
||||
# this shouldn't depend on the version of python, so build only CPython 3.6
|
||||
"CIBW_BUILD": "cp36-*",
|
||||
# this shouldn't depend on the version of python, so build only CPython 3.10
|
||||
"CIBW_BUILD": "cp310-*",
|
||||
},
|
||||
)
|
||||
|
||||
# check that the expected wheels are produced
|
||||
expected_wheels = [w for w in utils.expected_wheels("spam", "0.1.0") if "cp36" in w]
|
||||
expected_wheels = [w for w in utils.expected_wheels("spam", "0.1.0") if "cp310" in w]
|
||||
assert set(actual_wheels) == set(expected_wheels)
|
||||
|
||||
captured = capfd.readouterr()
|
||||
|
||||
@@ -143,6 +143,11 @@ def test_failing_test(tmp_path):
|
||||
# problems with this, so let's check that.
|
||||
"CIBW_MANYLINUX_I686_IMAGE": "manylinux1",
|
||||
"CIBW_MANYLINUX_X86_64_IMAGE": "manylinux1",
|
||||
# CPython 3.8 when running on macOS arm64 is unusual. The build
|
||||
# always runs in x86_64, so the arm64 tests are not run. See
|
||||
# #1169 for reasons why. That means the build succeeds, which
|
||||
# we don't want. So we skip that build.
|
||||
"CIBW_SKIP": "cp38-macosx_arm64",
|
||||
},
|
||||
)
|
||||
|
||||
|
||||
@@ -19,6 +19,7 @@ def test_unknown_platform_non_ci(monkeypatch, capsys):
|
||||
monkeypatch.delenv("GITHUB_ACTIONS", raising=False)
|
||||
monkeypatch.delenv("GITLAB_CI", raising=False)
|
||||
monkeypatch.delenv("CIRCLECI", raising=False)
|
||||
monkeypatch.delenv("CIRRUS_CI", raising=False)
|
||||
monkeypatch.delenv("CIBW_PLATFORM", raising=False)
|
||||
|
||||
with pytest.raises(SystemExit) as exit:
|
||||
|
||||
Reference in New Issue
Block a user