summaryrefslogtreecommitdiff
path: root/.github/workflows/wheels.yml
diff options
context:
space:
mode:
Diffstat (limited to '.github/workflows/wheels.yml')
-rw-r--r--.github/workflows/wheels.yml151
1 files changed, 151 insertions, 0 deletions
diff --git a/.github/workflows/wheels.yml b/.github/workflows/wheels.yml
new file mode 100644
index 000000000..910d86a4e
--- /dev/null
+++ b/.github/workflows/wheels.yml
@@ -0,0 +1,151 @@
+# Workflow to build wheels for upload to PyPI.
+#
+# In an attempt to save CI resources, wheel builds do
+# not run on each push but only weekly and for releases.
+# Wheel builds can be triggered from the Actions page
+# (if you have the perms) on a commit to master.
+#
+# Alternatively, if you would like to trigger wheel builds
+# on a pull request, the labels that trigger builds are:
+# - Build System
+
+name: Wheel Builder
+on:
+ release:
+ types: [created]
+ schedule:
+ # ┌───────────── minute (0 - 59)
+ # │ ┌───────────── hour (0 - 23)
+ # │ │ ┌───────────── day of the month (1 - 31)
+ # │ │ │ ┌───────────── month (1 - 12 or JAN-DEC)
+ # │ │ │ │ ┌───────────── day of the week (0 - 6 or SUN-SAT)
+ # │ │ │ │ │
+ - cron: "42 1 * * 4"
+ pull_request:
+ types: [labeled, opened, synchronize, reopened]
+ paths:
+ #- Cython/Build/**
+ - .github/workflows/wheels.yml
+ - MANIFEST.in
+ - setup.*
+ workflow_dispatch:
+
+concurrency:
+ group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }}
+ cancel-in-progress: true
+
+permissions:
+ contents: write # to create GitHub release (softprops/action-gh-release)
+
+jobs:
+ build_wheels:
+ name: Build wheel for ${{ matrix.python }}-${{ matrix.buildplat[1] }}
+ if: >-
+ github.event_name == 'release' ||
+ github.event_name == 'schedule' ||
+ github.event_name == 'workflow_dispatch' ||
+ (github.event_name == 'pull_request' &&
+ contains(github.event.pull_request.labels.*.name, 'Build System'))
+ runs-on: ${{ matrix.buildplat[0] }}
+ strategy:
+ # Ensure that a wheel builder finishes even if another fails
+ fail-fast: false
+ matrix:
+ # Github Actions doesn't support pairing matrix values together, let's improvise
+ # https://github.com/github/feedback/discussions/7835#discussioncomment-1769026
+ buildplat:
+ - [ubuntu-20.04, manylinux_x86_64]
+ - [ubuntu-20.04, manylinux_aarch64]
+ - [ubuntu-20.04, manylinux_i686]
+ - [ubuntu-20.04, musllinux_x86_64]
+ - [ubuntu-20.04, musllinux_aarch64]
+ - [macos-11, macosx_*]
+ - [windows-2019, win_amd64]
+ - [windows-2019, win32]
+ python: ["cp36", "cp37", "cp38", "cp39", "cp310", "cp311"] # Note: Wheels not needed for PyPy
+ steps:
+ - name: Checkout Cython
+ uses: actions/checkout@v3
+
+ - name: Set up QEMU
+ if: contains(matrix.buildplat[1], '_aarch64')
+ uses: docker/setup-qemu-action@v1
+ with:
+ platforms: all
+
+ - name: Build wheels
+ uses: pypa/cibuildwheel@v2.11.2
+ env:
+ # TODO: Build Cython with the compile-all flag?
+ CIBW_BUILD: ${{ matrix.python }}-${{ matrix.buildplat[1] }}
+ CIBW_PRERELEASE_PYTHONS: True
+ CIBW_ARCHS_LINUX: auto aarch64
+ CIBW_ENVIRONMENT: CFLAGS='-O3 -g0 -mtune=generic -pipe -fPIC' LDFLAGS='-fPIC'
+ # TODO: Cython tests take a long time to complete
+ # consider running a subset in the future?
+ #CIBW_TEST_COMMAND: python {project}/runtests.py -vv --no-refnanny
+
+ - name: Release
+ uses: softprops/action-gh-release@v1
+ if: startsWith(github.ref, 'refs/tags/')
+ with:
+ files: |
+ dist/*manylinux*.whl
+ dist/*musllinux*.whl
+ dist/*macos*.whl
+ dist/*win32*.whl
+ dist/*win_amd64*.whl
+ prerelease: >-
+ ${{ contains(github.ref_name, 'a') || contains(github.ref_name, 'b')
+ || contains(github.ref_name, 'rc') || contains(github.ref_name, 'dev') }}
+
+ - uses: actions/upload-artifact@v3
+ with:
+ name: ${{ matrix.python }}-${{ startsWith(matrix.buildplat[1], 'macosx') && 'macosx' || matrix.buildplat[1] }}
+ path: ./wheelhouse/*.whl
+
+ build_sdist_pure_wheel:
+ name: Build sdist and pure wheel
+ if: >-
+ github.event_name == 'release' ||
+ github.event_name == 'schedule' ||
+ github.event_name == 'workflow_dispatch' ||
+ (github.event_name == 'pull_request' &&
+ contains(github.event.pull_request.labels.*.name, 'Build System'))
+ runs-on: ubuntu-latest
+ steps:
+ - name: Checkout Cython
+ uses: actions/checkout@v3
+
+ # Used to push the built wheels
+ - uses: actions/setup-python@v3
+ with:
+ # Build sdist on lowest supported Python
+ python-version: '3.8'
+
+ - name: Build sdist
+ run: |
+ pip install --upgrade wheel setuptools
+ python setup.py sdist
+ python setup.py bdist_wheel --no-cython-compile --universal
+
+ - uses: actions/upload-artifact@v3
+ with:
+ name: sdist
+ path: ./dist/*.tar.gz
+
+ - uses: actions/upload-artifact@v3
+ with:
+ name: pure-wheel
+ path: ./dist/*.whl
+
+ - name: Release
+ uses: softprops/action-gh-release@v1
+ if: startsWith(github.ref, 'refs/tags/')
+ with:
+ files: |
+ dist/*.tar.gz
+ dist/*-none-any.whl
+ prerelease: >-
+ ${{ contains(github.ref_name, 'a') || contains(github.ref_name, 'b')
+ || contains(github.ref_name, 'rc') || contains(github.ref_name, 'dev') }}