--- name: Build CI wheels on: # Save CI by only running this on release branches or tags. push: branches: - main - v[0-9]+.[0-9]+.x tags: - v* # Also allow running this action on PRs if requested by applying the # "Run cibuildwheel" label. pull_request: types: - opened - synchronize - reopened - labeled permissions: contents: read jobs: build_sdist: if: >- github.event_name == 'push' || github.event_name == 'pull_request' && ( ( github.event.action == 'labeled' && github.event.label.name == 'CI: Run cibuildwheel' ) || contains(github.event.pull_request.labels.*.name, 'CI: Run cibuildwheel') ) name: Build sdist runs-on: ubuntu-20.04 outputs: SDIST_NAME: ${{ steps.sdist.outputs.SDIST_NAME }} steps: - uses: actions/checkout@v4 with: fetch-depth: 0 - uses: actions/setup-python@v5 name: Install Python with: python-version: 3.9 # Something changed somewhere that prevents the downloaded-at-build-time # licenses from being included in built wheels, so pre-download them so # that they exist before the build and are included. - name: Pre-download bundled licenses run: > curl -Lo LICENSE/LICENSE_QHULL https://github.com/qhull/qhull/raw/2020.2/COPYING.txt - name: Install dependencies run: python -m pip install build twine - name: Build sdist id: sdist run: | python -m build --sdist python ci/export_sdist_name.py - name: Check README rendering for PyPI run: twine check dist/* - name: Upload sdist result uses: actions/upload-artifact@v4 with: name: cibw-sdist path: dist/*.tar.gz if-no-files-found: error build_wheels: if: >- github.event_name == 'push' || github.event_name == 'pull_request' && ( ( github.event.action == 'labeled' && github.event.label.name == 'CI: Run cibuildwheel' ) || contains(github.event.pull_request.labels.*.name, 'CI: Run cibuildwheel') ) needs: build_sdist name: Build wheels on ${{ matrix.os }} for ${{ matrix.cibw_archs }} runs-on: ${{ matrix.os }} env: CIBW_BEFORE_BUILD: >- rm -rf {package}/build CIBW_BEFORE_BUILD_WINDOWS: >- pip install delvewheel && rm -rf {package}/build CIBW_REPAIR_WHEEL_COMMAND_WINDOWS: >- delvewheel repair -w {dest_dir} {wheel} CIBW_AFTER_BUILD: >- twine check {wheel} && python {package}/ci/check_wheel_licenses.py {wheel} # On Windows, we explicitly request MSVC compilers (as GitHub Action runners have # MinGW on PATH that would be picked otherwise), switch to a static build for # runtimes, but use dynamic linking for `VCRUNTIME140.dll`, `VCRUNTIME140_1.dll`, # and the UCRT. This avoids requiring specific versions of `MSVCP140.dll`, while # keeping shared state with the rest of the Python process/extensions. CIBW_CONFIG_SETTINGS_WINDOWS: >- setup-args="--vsenv" setup-args="-Db_vscrt=mt" setup-args="-Dcpp_link_args=['ucrt.lib','vcruntime.lib','/nodefaultlib:libucrt.lib','/nodefaultlib:libvcruntime.lib']" CIBW_MANYLINUX_X86_64_IMAGE: manylinux2014 CIBW_SKIP: "*-musllinux_aarch64" CIBW_TEST_COMMAND: >- python {package}/ci/check_version_number.py MACOSX_DEPLOYMENT_TARGET: "10.12" MPL_DISABLE_FH4: "yes" strategy: matrix: include: - os: ubuntu-20.04 cibw_archs: "x86_64" - os: ubuntu-20.04 cibw_archs: "aarch64" - os: windows-latest cibw_archs: "auto64" - os: macos-13 cibw_archs: "x86_64" - os: macos-14 cibw_archs: "arm64" steps: - name: Set up QEMU if: matrix.cibw_archs == 'aarch64' uses: docker/setup-qemu-action@v3 with: platforms: arm64 - name: Download sdist uses: actions/download-artifact@v4 with: name: cibw-sdist path: dist/ - name: Build wheels for CPython 3.13 uses: pypa/cibuildwheel@7940a4c0e76eb2030e473a5f864f291f63ee879b # v2.21.3 with: package-dir: dist/${{ needs.build_sdist.outputs.SDIST_NAME }} env: CIBW_BUILD: "cp313-* cp313t-*" CIBW_BUILD_FRONTEND: "pip; args: --pre --extra-index-url https://pypi.anaconda.org/scientific-python-nightly-wheels/simple" CIBW_FREE_THREADED_SUPPORT: true # No free-threading wheels available for aarch64 on Pillow. CIBW_TEST_SKIP: "cp313t-manylinux_aarch64" # We need pre-releases to get the nightly wheels. CIBW_BEFORE_TEST: >- pip install --pre --extra-index-url https://pypi.anaconda.org/scientific-python-nightly-wheels/simple contourpy numpy pillow CIBW_ARCHS: ${{ matrix.cibw_archs }} - name: Build wheels for CPython 3.12 uses: pypa/cibuildwheel@7940a4c0e76eb2030e473a5f864f291f63ee879b # v2.21.3 with: package-dir: dist/${{ needs.build_sdist.outputs.SDIST_NAME }} env: CIBW_BUILD: "cp312-*" CIBW_ARCHS: ${{ matrix.cibw_archs }} - name: Build wheels for CPython 3.11 uses: pypa/cibuildwheel@7940a4c0e76eb2030e473a5f864f291f63ee879b # v2.21.3 with: package-dir: dist/${{ needs.build_sdist.outputs.SDIST_NAME }} env: CIBW_BUILD: "cp311-*" CIBW_ARCHS: ${{ matrix.cibw_archs }} - name: Build wheels for CPython 3.10 uses: pypa/cibuildwheel@7940a4c0e76eb2030e473a5f864f291f63ee879b # v2.21.3 with: package-dir: dist/${{ needs.build_sdist.outputs.SDIST_NAME }} env: CIBW_BUILD: "cp310-*" CIBW_ARCHS: ${{ matrix.cibw_archs }} - name: Build wheels for CPython 3.9 uses: pypa/cibuildwheel@7940a4c0e76eb2030e473a5f864f291f63ee879b # v2.21.3 with: package-dir: dist/${{ needs.build_sdist.outputs.SDIST_NAME }} env: CIBW_BUILD: "cp39-*" CIBW_ARCHS: ${{ matrix.cibw_archs }} - name: Build wheels for PyPy uses: pypa/cibuildwheel@7940a4c0e76eb2030e473a5f864f291f63ee879b # v2.21.3 with: package-dir: dist/${{ needs.build_sdist.outputs.SDIST_NAME }} env: CIBW_BUILD: "pp39-*" CIBW_ARCHS: ${{ matrix.cibw_archs }} if: matrix.cibw_archs != 'aarch64' - uses: actions/upload-artifact@v4 with: name: cibw-wheels-${{ runner.os }}-${{ matrix.cibw_archs }} path: ./wheelhouse/*.whl if-no-files-found: error publish: if: github.event_name == 'push' && github.ref_type == 'tag' name: Upload release to PyPI needs: [build_sdist, build_wheels] runs-on: ubuntu-latest environment: release permissions: id-token: write attestations: write contents: read steps: - name: Download packages uses: actions/download-artifact@v4 with: pattern: cibw-* path: dist merge-multiple: true - name: Print out packages run: ls dist - name: Generate artifact attestation for sdist and wheel uses: actions/attest-build-provenance@ef244123eb79f2f7a7e75d99086184180e6d0018 # v1.4.4 with: subject-path: dist/matplotlib-* - name: Publish package distributions to PyPI uses: pypa/gh-action-pypi-publish@15c56dba361d8335944d31a2ecd17d700fc7bcbc # v1.12.2