From 829757fed78f84ba1f91988fe5f895077a0b4975 Mon Sep 17 00:00:00 2001 From: Anton Volkov Date: Mon, 7 Sep 2026 12:57:53 +0200 Subject: [PATCH 1/5] Allow Python 3.15 in package metadata Raise the requires-python cap to <3.16 and add the 3.15 classifier. --- pyproject.toml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index cfbbf33..921f611 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -47,6 +47,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", @@ -62,7 +63,7 @@ keywords = ["MKL"] license = "BSD-3-Clause" name = "mkl-service" readme = {file = "README.md", content-type = "text/markdown"} -requires-python = ">=3.10,<3.15" +requires-python = ">=3.10,<3.16" [project.optional-dependencies] test = ["pytest"] From 4433d42f41d7442b718380288814527a5b0a9730 Mon Sep 17 00:00:00 2001 From: Anton Volkov Date: Mon, 7 Sep 2026 12:58:46 +0200 Subject: [PATCH 2/5] Add Python 3.15 to CI build/test matrices Add Python 3.15 (cp315) to the conda build/test, pip editable, and clang workflows. Conda jobs pin the ABI explicitly as '3.15.* *_cp315'. Free-threaded 3.15t is deferred until conda-forge provides a cp315t build. --- .github/workflows/build-with-clang.yml | 2 +- .github/workflows/build-with-standard-clang.yml | 2 +- .github/workflows/build_pip.yml | 2 ++ .github/workflows/conda-build-test.yml | 6 ++++++ 4 files changed, 10 insertions(+), 2 deletions(-) diff --git a/.github/workflows/build-with-clang.yml b/.github/workflows/build-with-clang.yml index fbbde87..247d29f 100644 --- a/.github/workflows/build-with-clang.yml +++ b/.github/workflows/build-with-clang.yml @@ -15,7 +15,7 @@ jobs: strategy: matrix: - python: ["3.10", "3.11", "3.12", "3.13", "3.14", "3.14t"] + python: ["3.10", "3.11", "3.12", "3.13", "3.14", "3.14t", "3.15"] env: ONEAPI_ROOT: /opt/intel/oneapi diff --git a/.github/workflows/build-with-standard-clang.yml b/.github/workflows/build-with-standard-clang.yml index 18c8f22..38bb3ce 100644 --- a/.github/workflows/build-with-standard-clang.yml +++ b/.github/workflows/build-with-standard-clang.yml @@ -14,7 +14,7 @@ jobs: strategy: matrix: - python: ["3.10", "3.11", "3.12", "3.13", "3.14", "3.14t"] + python: ["3.10", "3.11", "3.12", "3.13", "3.14", "3.14t", "3.15"] env: COMPILER_ROOT: /usr/bin diff --git a/.github/workflows/build_pip.yml b/.github/workflows/build_pip.yml index 4bc2819..ef5f4fc 100644 --- a/.github/workflows/build_pip.yml +++ b/.github/workflows/build_pip.yml @@ -24,6 +24,8 @@ jobs: python_spec: '3.14.* *_cp314' - python: '3.14' python_spec: '3.14.* *_cp314t' + - python: '3.15' + python_spec: '3.15.* *_cp315' steps: - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 diff --git a/.github/workflows/conda-build-test.yml b/.github/workflows/conda-build-test.yml index afce348..2cc0c51 100644 --- a/.github/workflows/conda-build-test.yml +++ b/.github/workflows/conda-build-test.yml @@ -54,6 +54,9 @@ jobs: - python: '3.14' python_spec: '3.14.* *_cp314t' python_tag: '3.14t' + - python: '3.15' + python_spec: '3.15.* *_cp315' + python_tag: '3.15' runs-on: ${{ inputs.runs-on }} timeout-minutes: 15 @@ -142,6 +145,9 @@ jobs: - python: '3.14' python_spec: '3.14.* *_cp314t' python_tag: '3.14t' + - python: '3.15' + python_spec: '3.15.* *_cp315' + python_tag: '3.15' runs-on: ${{ inputs.runs-on }} timeout-minutes: 15 From a7653e2f05c65236ac3a2dcb0ae2b139bbbff0f7 Mon Sep 17 00:00:00 2001 From: Anton Volkov Date: Mon, 7 Sep 2026 13:00:04 +0200 Subject: [PATCH 3/5] Document Python 3.15 support in AGENTS guides Update the CI Python version lists and note that 3.15 is GIL-only for now (conda-forge ships cp315 but not cp315t), with conda jobs pinning the ABI. --- .github/AGENTS.md | 5 +++-- AGENTS.md | 3 ++- conda-recipe/AGENTS.md | 2 +- 3 files changed, 6 insertions(+), 4 deletions(-) diff --git a/.github/AGENTS.md b/.github/AGENTS.md index a5b4e4a..47f0a9b 100644 --- a/.github/AGENTS.md +++ b/.github/AGENTS.md @@ -3,7 +3,7 @@ CI/CD workflows, automation, security scanning, and package distribution. ## Workflows -All build/test workflows cover Python 3.10-3.14 plus free-threaded 3.14t. +All build/test workflows cover Python 3.10-3.15 plus free-threaded 3.14t. - **conda-package.yml** — main build/test pipeline (Linux/Windows) - **conda-package-cf.yml** — build/test using only conda-forge channel (Linux/Windows) @@ -17,8 +17,9 @@ All build/test workflows cover Python 3.10-3.14 plus free-threaded 3.14t. - Keep build matrix (Python versions, platforms) in workflow files only - Required checks: conda build + test on supported Python versions/platforms in CI - Python 3.14 is expressed as two `include` rows carrying `python_spec` (`3.14.* *_cp314` and `3.14.* *_cp314t`); a bare `--python 3.14` has been observed to select the free-threaded ABI and must not be relied on +- Python 3.15 is GIL-only for now (conda-forge's `python315` migration ships `*_cp315` but not `*_cp315t`); conda jobs pin the ABI explicitly with `python_spec: '3.15.* *_cp315'` to stay robust if a free-threaded `3.15t` build appears later - `include` rows create new matrix combinations and inherit nothing, so `experimental` must be repeated wherever the job reads them -- Artifact naming: `$PACKAGE_NAME $OS Python $VERSION`, where `$VERSION` is `python_tag` (`3.14` or `3.14t`) when set, otherwise `python` +- Artifact naming: `$PACKAGE_NAME $OS Python $VERSION`, where `$VERSION` is `python_tag` (`3.14`, `3.14t`, or `3.15`) when set, otherwise `python` - Channels: `conda-forge`, Intel channel ## Security diff --git a/AGENTS.md b/AGENTS.md index 55f57d7..285aca4 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -46,8 +46,9 @@ python -m pip install --no-deps --no-build-isolation . ## CI/CD - **Platforms in CI workflows:** Linux, Windows, macOS (conda-forge workflow only) -- **Python versions:** 3.10, 3.11, 3.12, 3.13, 3.14, and free-threaded 3.14t +- **Python versions:** 3.10, 3.11, 3.12, 3.13, 3.14, 3.15, and free-threaded 3.14t - **Python 3.14 ABI selection:** conda jobs must request an explicit ABI, `3.14.* *_cp314` (GIL) or `3.14.* *_cp314t` (free-threaded). Once the recipes stopped constraining `python-gil`, a bare `--python 3.14` was observed to resolve to the free-threaded build, so it must not be relied on. +- **Python 3.15:** GIL-only for now; conda-forge's `python315` migration provides `*_cp315` but no free-threaded `*_cp315t` yet. Conda jobs pin `3.15.* *_cp315` explicitly for the same ABI-selection reason as 3.14. - **Workflows:** `.github/workflows/` - `conda-package.yml` — main conda build/test pipeline - `conda-package-cf.yml` — conda build/test using only conda-forge channel diff --git a/conda-recipe/AGENTS.md b/conda-recipe/AGENTS.md index 70cf4f8..7ea47b5 100644 --- a/conda-recipe/AGENTS.md +++ b/conda-recipe/AGENTS.md @@ -10,7 +10,7 @@ Conda package build recipe for conda-forge and Intel channel distribution. ## Build configuration - **Channels:** `conda-forge`, Intel channel -- **Python versions in CI build matrix:** 3.10, 3.11, 3.12, 3.13, 3.14, and free-threaded 3.14t +- **Python versions in CI build matrix:** 3.10, 3.11, 3.12, 3.13, 3.14, 3.15, and free-threaded 3.14t - **Compilers:** pinned via `conda_build_config.yaml` (GCC/GXX on Linux, VS2022 on Windows) - **Dependencies:** `mkl` (runtime), `mkl-devel` (build), `cython >=3.1.0` From 0df738e9d418bdf281aac869249b3e6d4b6593e5 Mon Sep 17 00:00:00 2001 From: Anton Volkov Date: Mon, 7 Sep 2026 13:20:06 +0200 Subject: [PATCH 4/5] Make CI resolve the Python 3.15 release candidate 3.15 is still a pre-release: conda-forge gates it behind the python_rc label and actions/setup-python has no stable 3.15 yet. - Add conda-forge/label/python_rc to the conda env channels and to the conda build/install channel lists (conda-package, conda-package-cf, build_pip). - Set allow-prereleases: true for setup-python in both clang workflows. - Add fail-fast: false to build_pip and the clang workflows so a 3.15 failure no longer cancels the other Python jobs. These RC accommodations should be reverted once 3.15 is final. --- .github/workflows/build-with-clang.yml | 3 +++ .github/workflows/build-with-standard-clang.yml | 3 +++ .github/workflows/build_pip.yml | 4 +++- .github/workflows/conda-build-test.yml | 6 ++++-- .github/workflows/conda-package-cf.yml | 6 +++--- .github/workflows/conda-package.yml | 4 ++-- 6 files changed, 18 insertions(+), 8 deletions(-) diff --git a/.github/workflows/build-with-clang.yml b/.github/workflows/build-with-clang.yml index 247d29f..45ad520 100644 --- a/.github/workflows/build-with-clang.yml +++ b/.github/workflows/build-with-clang.yml @@ -14,6 +14,7 @@ jobs: runs-on: ubuntu-latest strategy: + fail-fast: false matrix: python: ["3.10", "3.11", "3.12", "3.13", "3.14", "3.14t", "3.15"] @@ -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 38bb3ce..c1709b5 100644 --- a/.github/workflows/build-with-standard-clang.yml +++ b/.github/workflows/build-with-standard-clang.yml @@ -13,6 +13,7 @@ jobs: runs-on: ubuntu-latest strategy: + fail-fast: false matrix: python: ["3.10", "3.11", "3.12", "3.13", "3.14", "3.14t", "3.15"] @@ -38,6 +39,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 ef5f4fc..b924258 100644 --- a/.github/workflows/build_pip.yml +++ b/.github/workflows/build_pip.yml @@ -17,6 +17,7 @@ jobs: shell: bash -el {0} strategy: + fail-fast: false matrix: python: ["3.10", "3.11", "3.12", "3.13"] include: @@ -36,7 +37,8 @@ jobs: - uses: conda-incubator/setup-miniconda@8ee1f361103df19b6f8c8655fd3967a8ecb162d5 # v4.0.1 with: miniforge-version: latest - channels: conda-forge + # python_rc label carries the 3.15 release candidate; drop once 3.15 is final + channels: conda-forge,conda-forge/label/python_rc activate-environment: test python-version: ${{ matrix.python }} diff --git a/.github/workflows/conda-build-test.yml b/.github/workflows/conda-build-test.yml index 2cc0c51..8bc5998 100644 --- a/.github/workflows/conda-build-test.yml +++ b/.github/workflows/conda-build-test.yml @@ -81,7 +81,8 @@ jobs: with: miniforge-version: latest activate-environment: ${{ env.build-env-name }} - channels: conda-forge + # python_rc label carries the 3.15 release candidate; drop once 3.15 is final + channels: conda-forge,conda-forge/label/python_rc python-version: ${{ matrix.python }} - name: Cache conda packages @@ -173,7 +174,8 @@ jobs: uses: conda-incubator/setup-miniconda@8ee1f361103df19b6f8c8655fd3967a8ecb162d5 # v4.0.1 with: miniforge-version: latest - channels: conda-forge + # python_rc label carries the 3.15 release candidate; drop once 3.15 is final + 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-cf.yml b/.github/workflows/conda-package-cf.yml index b084275..7fbce1b 100644 --- a/.github/workflows/conda-package-cf.yml +++ b/.github/workflows/conda-package-cf.yml @@ -21,7 +21,7 @@ jobs: runs-on: ubuntu-latest conda-subdir: linux-64 pkgs-dir: /home/runner/conda_pkgs_dir - channels-list: -c conda-forge --override-channels + channels-list: -c conda-forge -c conda-forge/label/python_rc --override-channels recipe-dir: conda-recipe-cf windows: @@ -31,7 +31,7 @@ jobs: runs-on: windows-latest conda-subdir: win-64 pkgs-dir: D:\conda_pkgs_dir - channels-list: -c conda-forge --override-channels + channels-list: -c conda-forge -c conda-forge/label/python_rc --override-channels recipe-dir: conda-recipe-cf osx: @@ -41,5 +41,5 @@ jobs: runs-on: macos-26-intel conda-subdir: osx-64 pkgs-dir: /Users/runner/conda_pkgs_dir - channels-list: -c conda-forge --override-channels + channels-list: -c conda-forge -c conda-forge/label/python_rc --override-channels recipe-dir: conda-recipe-cf diff --git a/.github/workflows/conda-package.yml b/.github/workflows/conda-package.yml index 970bcbf..932146d 100644 --- a/.github/workflows/conda-package.yml +++ b/.github/workflows/conda-package.yml @@ -21,7 +21,7 @@ jobs: runs-on: ubuntu-latest conda-subdir: linux-64 pkgs-dir: /home/runner/conda_pkgs_dir - channels-list: -c https://software.repos.intel.com/python/conda -c conda-forge --override-channels + channels-list: -c https://software.repos.intel.com/python/conda -c conda-forge -c conda-forge/label/python_rc --override-channels recipe-dir: conda-recipe build-wheels: true @@ -32,6 +32,6 @@ jobs: runs-on: windows-latest conda-subdir: win-64 pkgs-dir: D:\conda_pkgs_dir - channels-list: -c https://software.repos.intel.com/python/conda -c conda-forge --override-channels + channels-list: -c https://software.repos.intel.com/python/conda -c conda-forge -c conda-forge/label/python_rc --override-channels recipe-dir: conda-recipe build-wheels: true From 6bd8e5c6632617f7a00a95aa64e9c86613738c36 Mon Sep 17 00:00:00 2001 From: Anton Volkov Date: Mon, 7 Sep 2026 13:21:15 +0200 Subject: [PATCH 5/5] Add changelog entry for Python 3.15 support --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index d267ff7..74409b6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [dev] (MM/DD/YYYY) ### Added +* Enabled support of Python 3.15 [gh-243](https://github.com/IntelPython/mkl-service/pull/243) * Added support for free-threaded (GIL-disabled) CPython builds: the Cython extension is compiled with `freethreading_compatible=True` and `_mklinit` declares `Py_MOD_GIL_NOT_USED`, so importing `mkl` no longer re-enables the GIL [gh-213](https://github.com/IntelPython/mkl-service/pull/213) * Added support for new build option `ilp64` to initialize MKL with the ILP64 interface, which also resolves some build warnings [gh-184](https://github.com/IntelPython/mkl-service/pull/184)