From 9d8e15aaf03fcbe21648b173e672eb35c0f852e2 Mon Sep 17 00:00:00 2001 From: Ralf Gommers Date: Sat, 27 Jul 2024 16:45:29 +0200 Subject: [PATCH] BLD/CI: support Python 3.13 (cp313/cp313t) in pyproject.toml and wheel builds This is a single large update that does the following: - Depend on numpy>=2.1.0rc1 for Python 3.13 - Update to `cibuildwheel` 2.20.0 (for Python 3.13.0rc1) - Update `musllinux_2014` from `1_1` to `1_2` (`1_1 is almost EOL, and little-used) - Merge the free-threaded and regular wheel build jobs - Drop `PYTHON_GIL=0` from testing, because we don't need it anymore (all extension modules in PyWavelets and NumPy are marked as compatible) - Build cp313 and cp313t wheels in release jobs - Add macOS arm64 free-threaded wheels --- .github/workflows/emscripten.yml | 2 +- .github/workflows/freethreaded_wheels.yml | 171 ------------------ .github/workflows/wheel_tests_and_release.yml | 59 +++++- pyproject.toml | 3 +- 4 files changed, 52 insertions(+), 183 deletions(-) delete mode 100644 .github/workflows/freethreaded_wheels.yml diff --git a/.github/workflows/emscripten.yml b/.github/workflows/emscripten.yml index 9b5472e0..d6c44b1c 100644 --- a/.github/workflows/emscripten.yml +++ b/.github/workflows/emscripten.yml @@ -37,7 +37,7 @@ jobs: uses: actions/checkout@v4 - name: Build and test PyWavelets - uses: pypa/cibuildwheel@7e5a838a63ac8128d71ab2dfd99e4634dd1bca09 # v2.19.2 + uses: pypa/cibuildwheel@bd033a44476646b606efccdd5eed92d5ea1d77ad # v2.20.0 env: CIBW_PLATFORM: pyodide CIBW_TEST_REQUIRES: pytest matplotlib diff --git a/.github/workflows/freethreaded_wheels.yml b/.github/workflows/freethreaded_wheels.yml deleted file mode 100644 index af960f25..00000000 --- a/.github/workflows/freethreaded_wheels.yml +++ /dev/null @@ -1,171 +0,0 @@ -name: Build free-threaded wheels -on: - push: - tags: - - "v*" - - "buildwheels*" - branches: - # Runs on every merge to main to upload .dev0 wheels to anaconda.org - - main - - v1.** - # Make it possible to upload wheels manually if needed (for anaconda.org only, not PyPI) - workflow_dispatch: - inputs: - push_wheels: - description: > - Push wheels to Anaconda if "true". Default is "false". Warning: this will overwrite existing wheels. - required: false - default: "false" - # Upload wheels to anaconda.org on a schedule - schedule: - # Run at 0300 hours on days 3 and 17 of the month - - cron: "0 3 3,17 * *" -env: - CIBW_BUILD_VERBOSITY: 2 - CIBW_TEST_REQUIRES: pytest - CIBW_TEST_COMMAND: pytest --pyargs pywt -m "not slow" - CIBW_ENVIRONMENT: PIP_PREFER_BINARY=1 - -jobs: - build_linux_x86_64_free_threaded_wheels: - name: Build ${{ matrix.cibw_python }} ${{ matrix.cibw_arch }} ${{ matrix.os }} - runs-on: ${{ matrix.os }} - strategy: - fail-fast: false - matrix: - os: [ubuntu-latest] - cibw_python: ["cp313t"] - cibw_arch: ["x86_64"] - steps: - - uses: actions/checkout@9bb56186c3b09b4f86b1c65136769dd318469633 # v4.1.2 - with: - fetch-depth: 0 - - uses: actions/setup-python@v5 - name: Install Python - with: - python-version: "3.10" - - - name: Install build deps; set CIBW environment variables - run: | - PYPI_URL="https://pypi.anaconda.org/scientific-python-nightly-wheels/simple" - CIBW_DEPS="pip install --upgrade pip build &&\ - pip install --pre -i $PYPI_URL cython numpy scipy &&\ - pip install pytest meson-python ninja" - echo "CIBW_BEFORE_BUILD=$CIBW_DEPS" >> "$GITHUB_ENV" - echo "CIBW_BEFORE_TEST=$CIBW_DEPS" >> "$GITHUB_ENV" - echo "CIBW_TEST_COMMAND=PYTHON_GIL=0 $CIBW_TEST_COMMAND" >> "$GITHUB_ENV" - - - name: Build the wheel - uses: pypa/cibuildwheel@7e5a838a63ac8128d71ab2dfd99e4634dd1bca09 # v2.19.2 - with: - output-dir: dist - env: - CIBW_BUILD: ${{ matrix.cibw_python }}-* - CIBW_ARCHS_LINUX: ${{ matrix.cibw_arch }} - CIBW_PRERELEASE_PYTHONS: True - CIBW_FREE_THREADED_SUPPORT: True - CIBW_MANYLINUX_X86_64_IMAGE: manylinux2014 - CIBW_MUSLLINUX_X86_64_IMAGE: musllinux_1_2 - CIBW_BUILD_FRONTEND: "pip; args: --no-build-isolation" - - uses: actions/upload-artifact@0b2256b8c012f0828dc542b3febcab082c67f72b # v4.3.4 - with: - name: wheels_linux_${{ matrix.cibw_arch }}_${{ matrix.cibw_python }} - path: ./dist/*.whl - if-no-files-found: error - - build_macos_free_threaded_wheels: - name: Build ${{ matrix.cibw_python }} ${{ matrix.cibw_arch }} ${{ matrix.os }} - runs-on: ${{ matrix.os }} - strategy: - fail-fast: false - matrix: - # macos-13 is the last runner that supports Intel (x86_64) architecture - os: [macos-13, macos-14] - cibw_python: ["cp313t"] - cibw_arch: ["x86_64", "arm64"] - exclude: - - os: macos-14 - cibw_arch: "x86_64" - - os: macos-13 - cibw_arch: "arm64" - steps: - - uses: actions/checkout@9bb56186c3b09b4f86b1c65136769dd318469633 # v4.1.2 - with: - fetch-depth: 0 - - - uses: actions/setup-python@v5 - name: Install Python - with: - python-version: "3.12" - - - name: Install build deps; set CIBW environment variables - run: | - PYPI_URL="https://pypi.anaconda.org/scientific-python-nightly-wheels/simple" - CIBW_DEPS="pip install --upgrade pip build &&\ - pip install --pre -i $PYPI_URL cython numpy scipy &&\ - pip install pytest meson-python ninja" - echo "CIBW_BEFORE_BUILD=$CIBW_DEPS" >> "$GITHUB_ENV" - echo "CIBW_BEFORE_TEST=$CIBW_DEPS" >> "$GITHUB_ENV" - echo "CIBW_TEST_COMMAND=PYTHON_GIL=0 $CIBW_TEST_COMMAND" >> "$GITHUB_ENV" - - - name: Build wheels for CPython (macOS) (x86_64) - if: matrix.cibw_arch == 'x86_64' - uses: pypa/cibuildwheel@7e5a838a63ac8128d71ab2dfd99e4634dd1bca09 # v2.19.2 - with: - output-dir: dist - env: - CIBW_BUILD: ${{ matrix.cibw_python }}-* - CIBW_ARCHS_MACOS: ${{ matrix.cibw_arch }} - CIBW_PRERELEASE_PYTHONS: True - CIBW_FREE_THREADED_SUPPORT: True - CIBW_BUILD_FRONTEND: "pip; args: --no-build-isolation" - - - name: Build wheels for CPython (macOS) (arm64) - if: matrix.cibw_arch == 'arm64' - uses: pypa/cibuildwheel@7e5a838a63ac8128d71ab2dfd99e4634dd1bca09 # v2.19.2 - with: - output-dir: dist - env: - CIBW_BUILD: ${{ matrix.cibw_python }}-* - CIBW_ARCHS_MACOS: ${{ matrix.cibw_arch }} - CIBW_PRERELEASE_PYTHONS: True - CIBW_FREE_THREADED_SUPPORT: True - CIBW_BUILD_FRONTEND: "pip; args: --no-build-isolation" - - - uses: actions/upload-artifact@0b2256b8c012f0828dc542b3febcab082c67f72b # v4.3.4 - with: - name: wheels_macos_${{ matrix.cibw_arch }}_${{ matrix.cibw_python }} - path: ./dist/*.whl - if-no-files-found: error - - deploy_anaconda: - name: Release (Anaconda) - needs: - [ - build_linux_x86_64_free_threaded_wheels, - build_macos_free_threaded_wheels, - ] - # Run only on pushes to the main branch, on schedule, or when triggered manually - if: >- - github.repository == 'PyWavelets/pywt' && - (github.event_name == 'push' && github.ref == 'refs/heads/main') || - (github.event_name == 'workflow_dispatch' && github.event.inputs.push_wheels == 'true') || - (github.event_name == 'schedule') - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@9bb56186c3b09b4f86b1c65136769dd318469633 # v4.1.2 - with: - fetch-depth: 0 - - - uses: actions/download-artifact@fa0a91b85d4f404e444e00e005971372dc801d16 # v4.1.8 - id: download - with: - pattern: "wheels_*" - path: dist/ - merge-multiple: true - - - name: Push to Anaconda PyPI index - uses: scientific-python/upload-nightly-action@b67d7fcc0396e1128a474d1ab2b48aa94680f9fc # v0.5.0 - with: - artifacts_path: dist/ - anaconda_nightly_upload_token: ${{ secrets.ANACONDA_ORG_UPLOAD_TOKEN }} diff --git a/.github/workflows/wheel_tests_and_release.yml b/.github/workflows/wheel_tests_and_release.yml index 83645300..97e342b2 100644 --- a/.github/workflows/wheel_tests_and_release.yml +++ b/.github/workflows/wheel_tests_and_release.yml @@ -34,7 +34,7 @@ jobs: fail-fast: false matrix: os: [ubuntu-latest] - cibw_python: ["cp310", "cp311", "cp312"] + cibw_python: ["cp310", "cp311", "cp312", "cp313", "cp313t"] cibw_arch: ["x86_64"] steps: - uses: actions/checkout@9bb56186c3b09b4f86b1c65136769dd318469633 # v4.1.2 @@ -44,15 +44,29 @@ jobs: name: Install Python with: python-version: "3.10" + + - name: Install build deps; set CIBW environment variables + if: ${{ matrix.cibw_python }} == "cp313" || ${{ matrix.cibw_python }} == "cp313t" + run: | + PYPI_URL="https://pypi.anaconda.org/scientific-python-nightly-wheels/simple" + CIBW_DEPS="pip install --upgrade pip build &&\ + pip install --pre -i $PYPI_URL cython numpy scipy &&\ + pip install pytest meson-python ninja" + NO_BUILD_ISOLATION="pip; args: --no-build-isolation" + echo "CIBW_BEFORE_BUILD=$CIBW_DEPS" >> "$GITHUB_ENV" + echo "CIBW_BEFORE_TEST=$CIBW_DEPS" >> "$GITHUB_ENV" + echo "CIBW_BUILD_FRONTEND=$NO_BUILD_ISOLATION" >> "$GITHUB_ENV" + - name: Build the wheel - uses: pypa/cibuildwheel@7e5a838a63ac8128d71ab2dfd99e4634dd1bca09 # v2.19.2 + uses: pypa/cibuildwheel@bd033a44476646b606efccdd5eed92d5ea1d77ad # v2.20.0 with: output-dir: dist env: CIBW_BUILD: ${{ matrix.cibw_python }}-* CIBW_ARCHS_LINUX: ${{ matrix.cibw_arch }} CIBW_MANYLINUX_X86_64_IMAGE: manylinux2014 - CIBW_MUSLLINUX_X86_64_IMAGE: musllinux_1_1 + CIBW_MUSLLINUX_X86_64_IMAGE: musllinux_1_2 + CIBW_FREE_THREADED_SUPPORT: True - uses: actions/upload-artifact@0b2256b8c012f0828dc542b3febcab082c67f72b # v4.3.4 with: name: wheels_linux_${{ matrix.cibw_arch }}_${{ matrix.cibw_python }} @@ -66,7 +80,7 @@ jobs: fail-fast: false matrix: os: [ubuntu-latest] - cibw_python: ["cp310", "cp311", "cp312"] + cibw_python: ["cp310", "cp311", "cp312", "cp313"] cibw_arch: ["aarch64"] steps: - uses: actions/checkout@9bb56186c3b09b4f86b1c65136769dd318469633 # v4.1.2 @@ -80,8 +94,17 @@ jobs: uses: docker/setup-qemu-action@v3 with: platforms: arm64 + + - name: Install test dep; set CIBW environment variables + # Can be removed once numpy 2.1.0 is released + if: ${{ matrix.cibw_python }} == "cp313" + run: | + PYPI_URL="https://pypi.anaconda.org/scientific-python-nightly-wheels/simple" + CIBW_DEPS="pip install --pre -i $PYPI_URL numpy" + echo "CIBW_BEFORE_TEST=$CIBW_DEPS" >> "$GITHUB_ENV" + - name: Build the wheel - uses: pypa/cibuildwheel@7e5a838a63ac8128d71ab2dfd99e4634dd1bca09 # v2.19.2 + uses: pypa/cibuildwheel@bd033a44476646b606efccdd5eed92d5ea1d77ad # v2.20.0 with: output-dir: dist env: @@ -102,13 +125,16 @@ jobs: matrix: # macos-13 is the last runner that supports Intel (x86_64) architecture os: [macos-13, macos-14] - cibw_python: ["cp310", "cp311", "cp312"] + cibw_python: ["cp310", "cp311", "cp312", "cp313", "cp313t"] cibw_arch: ["x86_64", "arm64"] exclude: - os: macos-14 cibw_arch: "x86_64" - os: macos-13 cibw_arch: "arm64" + - os: macos-13 + cibw_arch: "x86_64" + cibw_python: "cp313t" steps: - uses: actions/checkout@9bb56186c3b09b4f86b1c65136769dd318469633 # v4.1.2 with: @@ -119,9 +145,21 @@ jobs: with: python-version: "3.12" + - name: Install build deps; set CIBW environment variables + if: ${{ matrix.cibw_python }} == "cp313" || ${{ matrix.cibw_python }} == "cp313t" + run: | + PYPI_URL="https://pypi.anaconda.org/scientific-python-nightly-wheels/simple" + CIBW_DEPS="pip install --upgrade pip build &&\ + pip install --pre -i $PYPI_URL cython numpy scipy &&\ + pip install pytest meson-python ninja" + NO_BUILD_ISOLATION="pip; args: --no-build-isolation" + echo "CIBW_BEFORE_BUILD=$CIBW_DEPS" >> "$GITHUB_ENV" + echo "CIBW_BEFORE_TEST=$CIBW_DEPS" >> "$GITHUB_ENV" + echo "CIBW_BUILD_FRONTEND=$NO_BUILD_ISOLATION" >> "$GITHUB_ENV" + - name: Build wheels for CPython (macOS) (x86_64) if: matrix.cibw_arch == 'x86_64' - uses: pypa/cibuildwheel@7e5a838a63ac8128d71ab2dfd99e4634dd1bca09 # v2.19.2 + uses: pypa/cibuildwheel@bd033a44476646b606efccdd5eed92d5ea1d77ad # v2.20.0 with: output-dir: dist env: @@ -130,12 +168,13 @@ jobs: - name: Build wheels for CPython (macOS) (arm64) if: matrix.cibw_arch == 'arm64' - uses: pypa/cibuildwheel@7e5a838a63ac8128d71ab2dfd99e4634dd1bca09 # v2.19.2 + uses: pypa/cibuildwheel@bd033a44476646b606efccdd5eed92d5ea1d77ad # v2.20.0 with: output-dir: dist env: CIBW_BUILD: ${{ matrix.cibw_python }}-* CIBW_ARCHS_MACOS: ${{ matrix.cibw_arch }} + CIBW_FREE_THREADED_SUPPORT: True - uses: actions/upload-artifact@0b2256b8c012f0828dc542b3febcab082c67f72b # v4.3.4 with: @@ -151,7 +190,7 @@ jobs: matrix: os: [windows-latest] cibw_arch: ["AMD64", "x86"] - cibw_python: ["cp310", "cp311", "cp312"] + cibw_python: ["cp310", "cp311", "cp312", "cp313"] steps: - uses: actions/checkout@9bb56186c3b09b4f86b1c65136769dd318469633 # v4.1.2 with: @@ -175,7 +214,7 @@ jobs: architecture: x64 - name: Build Windows wheels for CPython - uses: pypa/cibuildwheel@7e5a838a63ac8128d71ab2dfd99e4634dd1bca09 # v2.19.2 + uses: pypa/cibuildwheel@bd033a44476646b606efccdd5eed92d5ea1d77ad # v2.20.0 with: output-dir: dist env: diff --git a/pyproject.toml b/pyproject.toml index f799ae1d..ff99f7ee 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -16,7 +16,8 @@ requires = [ # Note that building against numpy 1.x works fine too - users and # redistributors can do this by installing the numpy version they like and # disabling build isolation. - "numpy>=2.0.0b1", + "numpy>=2.0.0; python_version<'3.13'", + "numpy>=2.1.0.rc1; python_version>='3.13'", ] [project]