diff --git a/.github/workflows/build-with-clang.yml b/.github/workflows/build-with-clang.yml index 83d2cbb3..367b0cd4 100644 --- a/.github/workflows/build-with-clang.yml +++ b/.github/workflows/build-with-clang.yml @@ -14,6 +14,7 @@ jobs: strategy: matrix: + # TODO: add "3.15" back once mkl-service publishes a Python 3.15 wheel on PyPI python: ["3.10", "3.11", "3.12", "3.13", "3.14"] numpy_version: ["'numpy>=2'"] @@ -47,6 +48,8 @@ jobs: uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7.0.0 with: python-version: ${{ matrix.python }} + # allow the 3.15 release candidate until 3.15 is final + allow-prereleases: true architecture: x64 - name: Checkout repo diff --git a/.github/workflows/build-with-standard-clang.yml b/.github/workflows/build-with-standard-clang.yml index 785a40d0..60fbc04e 100644 --- a/.github/workflows/build-with-standard-clang.yml +++ b/.github/workflows/build-with-standard-clang.yml @@ -14,6 +14,7 @@ jobs: strategy: matrix: + # TODO: add "3.15" back once mkl-service publishes a Python 3.15 wheel on PyPI python: ["3.10", "3.11", "3.12", "3.13", "3.14"] numpy_version: ["'numpy>=2'"] @@ -39,6 +40,8 @@ jobs: uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7.0.0 with: python-version: ${{ matrix.python }} + # allow the 3.15 release candidate until 3.15 is final + allow-prereleases: true architecture: x64 - name: Checkout repo diff --git a/.github/workflows/build_pip.yml b/.github/workflows/build_pip.yml index 24c279c2..49fb4d3b 100644 --- a/.github/workflows/build_pip.yml +++ b/.github/workflows/build_pip.yml @@ -18,7 +18,8 @@ jobs: strategy: matrix: - python: ["3.10", "3.11", "3.12", "3.13"] + # TODO: add "3.15" back once mkl-service publishes a Python 3.15 wheel on PyPI + python: ["3.10", "3.11", "3.12", "3.13", "3.14"] use_pre: ["", "--pre"] include: - python: "3.14" @@ -43,7 +44,8 @@ jobs: - uses: conda-incubator/setup-miniconda@be893c923ea9cf1cf7cd510fbdde27c7e18cbdcb # v4.1.0 with: miniforge-version: latest - channels: conda-forge + # conda-forge/label/python_rc carries the 3.15 release candidate + channels: conda-forge,conda-forge/label/python_rc activate-environment: test python-version: ${{ matrix.python }} diff --git a/.github/workflows/conda-package-cf.yml b/.github/workflows/conda-package-cf.yml index 85969a7e..67c77a4a 100644 --- a/.github/workflows/conda-package-cf.yml +++ b/.github/workflows/conda-package-cf.yml @@ -38,6 +38,8 @@ jobs: numpy: "2.3" python_spec: "3.14.* *_cp314t" python_tag: "3.14t" + - python: "3.15" + numpy: "2.5" steps: - name: Cancel Previous Runs @@ -74,7 +76,7 @@ jobs: - name: Build conda package with NumPy 2.x run: | - CHANNELS=(-c conda-forge --override-channels) + CHANNELS=(-c conda-forge -c conda-forge/label/python_rc --override-channels) VERSIONS=(--python "${{ matrix.python_spec || matrix.python }}" --numpy "${{ matrix.numpy }}") TEST=(--no-test) @@ -96,7 +98,7 @@ jobs: strategy: matrix: - python: ["3.10", "3.11", "3.12", "3.13"] + python: ["3.10", "3.11", "3.12", "3.13", "3.14", "3.15"] numpy: ['numpy">=2"'] experimental: [false] runner: [ubuntu-latest] @@ -115,7 +117,7 @@ jobs: # runner: ubuntu-latest continue-on-error: ${{ matrix.experimental }} env: - CHANNELS: -c conda-forge --override-channels + CHANNELS: -c conda-forge -c conda-forge/label/python_rc --override-channels steps: - name: Download artifact @@ -198,6 +200,8 @@ jobs: numpy: "2.3" python_spec: "3.14.* *_cp314t" python_tag: "3.14t" + - python: "3.15" + numpy: "2.5" steps: - name: Cancel Previous Runs @@ -214,7 +218,7 @@ jobs: with: miniforge-version: latest activate-environment: build - channels: conda-forge + channels: conda-forge,conda-forge/label/python_rc python-version: ${{ matrix.python }} - name: Install conda-build @@ -236,7 +240,7 @@ jobs: - name: Build conda package with NumPy 2.x run: | - conda build --no-test --python "${{ matrix.python_spec || matrix.python }}" --numpy ${{ matrix.numpy }} -c conda-forge --override-channels conda-recipe-cf + conda build --no-test --python "${{ matrix.python_spec || matrix.python }}" --numpy ${{ matrix.numpy }} -c conda-forge -c conda-forge/label/python_rc --override-channels conda-recipe-cf - name: Store conda paths as envs shell: bash -l {0} @@ -258,7 +262,7 @@ jobs: strategy: matrix: - python: ["3.10", "3.11", "3.12", "3.13"] + python: ["3.10", "3.11", "3.12", "3.13", "3.14", "3.15"] numpy: ['numpy">=2"'] experimental: [false] runner: [windows-latest] @@ -278,7 +282,7 @@ jobs: continue-on-error: ${{ matrix.experimental }} env: workdir: '${{ github.workspace }}' - CHANNELS: -c conda-forge --override-channels + CHANNELS: -c conda-forge -c conda-forge/label/python_rc --override-channels steps: - name: Download artifact @@ -289,7 +293,7 @@ jobs: - uses: conda-incubator/setup-miniconda@be893c923ea9cf1cf7cd510fbdde27c7e18cbdcb # v4.1.0 with: miniforge-version: latest - channels: conda-forge + channels: conda-forge,conda-forge/label/python_rc activate-environment: ${{ env.TEST_ENV_NAME }} python-version: ${{ matrix.python }} diff --git a/.github/workflows/conda-package.yml b/.github/workflows/conda-package.yml index 670361bb..7253ca48 100644 --- a/.github/workflows/conda-package.yml +++ b/.github/workflows/conda-package.yml @@ -39,6 +39,9 @@ jobs: numpy: "2.3" python_spec: "3.14.* *_cp314t" python_tag: "3.14t" + - python: "3.15" + numpy: "2.5" + steps: - name: Cancel Previous Runs uses: styfle/cancel-workflow-action@d07a454dad7609a92316b57b23c9ccfd4f59af66 # 0.13.1 @@ -91,7 +94,7 @@ jobs: - name: Build conda package run: | - CHANNELS=(-c https://software.repos.intel.com/python/conda -c conda-forge --override-channels) + CHANNELS=(-c https://software.repos.intel.com/python/conda -c conda-forge -c conda-forge/label/python_rc --override-channels) VERSIONS=(--python "${{ matrix.python_spec || matrix.python }}" --numpy "${{ matrix.numpy }}") TEST=(--no-test) @@ -119,7 +122,7 @@ jobs: strategy: matrix: - python: ["3.10", "3.11", "3.12", "3.13"] + python: ["3.10", "3.11", "3.12", "3.13", "3.14", "3.15"] numpy: ['numpy">=2"'] experimental: [false] runner: [ubuntu-latest] @@ -138,7 +141,7 @@ jobs: # runner: ubuntu-latest continue-on-error: ${{ matrix.experimental }} env: - CHANNELS: -c https://software.repos.intel.com/python/conda -c conda-forge --override-channels + CHANNELS: -c https://software.repos.intel.com/python/conda -c conda-forge -c conda-forge/label/python_rc --override-channels steps: - name: Download artifact @@ -242,6 +245,9 @@ jobs: numpy: "2.3" python_spec: "3.14.* *_cp314t" python_tag: "3.14t" + - python: "3.15" + numpy: "2.5" + steps: - name: Cancel Previous Runs uses: styfle/cancel-workflow-action@d07a454dad7609a92316b57b23c9ccfd4f59af66 # 0.13.1 @@ -258,7 +264,7 @@ jobs: auto-update-conda: true miniforge-version: latest activate-environment: build - channels: conda-forge + channels: conda-forge,conda-forge/label/python_rc python-version: ${{ matrix.python }} conda-build-version: ${{ env.CONDA_BUILD_VERSION }} @@ -290,7 +296,7 @@ jobs: - name: Build conda package run: | - conda build --no-test --python "${{ matrix.python_spec || matrix.python }}" --numpy ${{ matrix.numpy }} -c https://software.repos.intel.com/python/conda -c conda-forge --override-channels conda-recipe + conda build --no-test --python "${{ matrix.python_spec || matrix.python }}" --numpy ${{ matrix.numpy }} -c https://software.repos.intel.com/python/conda -c conda-forge -c conda-forge/label/python_rc --override-channels conda-recipe - name: Upload artifact uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1 @@ -313,7 +319,7 @@ jobs: strategy: matrix: - python: ["3.10", "3.11", "3.12", "3.13"] + python: ["3.10", "3.11", "3.12", "3.13", "3.14", "3.15"] numpy: ['numpy">=2"'] experimental: [false] runner: [windows-latest] @@ -333,7 +339,7 @@ jobs: continue-on-error: ${{ matrix.experimental }} env: workdir: '${{ github.workspace }}' - CHANNELS: -c https://software.repos.intel.com/python/conda -c conda-forge --override-channels + CHANNELS: -c https://software.repos.intel.com/python/conda -c conda-forge -c conda-forge/label/python_rc --override-channels steps: - name: Download artifact @@ -345,7 +351,7 @@ jobs: with: auto-update-conda: true miniforge-version: latest - channels: conda-forge + channels: conda-forge,conda-forge/label/python_rc activate-environment: ${{ env.TEST_ENV_NAME }} python-version: ${{ matrix.python }} diff --git a/CHANGELOG.md b/CHANGELOG.md index 7b4d5485..ac003bc6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Added * Added support for free-threaded (GIL-disabled) CPython builds: the Cython extension is compiled with `freethreading_compatible=True` [gh-357](https://github.com/IntelPython/mkl_fft/pull/357) +* Enabled support of Python 3.15 [gh-378](https://github.com/IntelPython/mkl_fft/pull/378) ### Changed * Raised the minimum build-time `Cython` requirement to `3.1.0`, the first release providing the `freethreading_compatible` directive [gh-357](https://github.com/IntelPython/mkl_fft/pull/357) diff --git a/pyproject.toml b/pyproject.toml index 855f0e2c..635c7e46 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -48,6 +48,7 @@ classifiers = [ "Programming Language :: Python :: 3.12", "Programming Language :: Python :: 3.13", "Programming Language :: Python :: 3.14", + "Programming Language :: Python :: 3.15", "Programming Language :: Python :: Free Threading :: 2 - Beta", "Programming Language :: Python :: Implementation :: CPython", "Topic :: Software Development", @@ -63,7 +64,7 @@ keywords = ["DFTI", "FFT", "Fourier", "MKL"] license = "BSD-3-Clause" name = "mkl_fft" readme = { file = "README.md", content-type = "text/markdown" } -requires-python = ">=3.10,<3.15" +requires-python = ">=3.10,<3.16" [project.optional-dependencies] benchmark = ["asv>=0.6", "psutil", "scipy>=1.10"]