From 546ce591070c3fe44226f0e7a0448e5b12076ad3 Mon Sep 17 00:00:00 2001 From: Michael Droettboom Date: Tue, 19 May 2026 13:06:58 -0400 Subject: [PATCH 01/10] Add Python 3.15 to the test matrix --- .github/workflows/build-wheel.yml | 3 +++ .github/workflows/test-wheel-linux.yml | 1 + ci/test-matrix.yml | 2 ++ 3 files changed, 6 insertions(+) diff --git a/.github/workflows/build-wheel.yml b/.github/workflows/build-wheel.yml index ffcab41734d..bac1662635b 100644 --- a/.github/workflows/build-wheel.yml +++ b/.github/workflows/build-wheel.yml @@ -34,6 +34,8 @@ jobs: - "3.13" - "3.14" - "3.14t" + - "3.15" + - "3.15t" name: py${{ matrix.python-version }} runs-on: ${{ (inputs.host-platform == 'linux-64' && 'linux-amd64-cpu8') || (inputs.host-platform == 'linux-aarch64' && 'linux-arm64-cpu8') || @@ -327,6 +329,7 @@ jobs: uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6.2.0 with: python-version: ${{ matrix.python-version }} + allow-prereleases: true - name: verify free-threaded build if: endsWith(matrix.python-version, 't') diff --git a/.github/workflows/test-wheel-linux.yml b/.github/workflows/test-wheel-linux.yml index 725eda307f9..c442b3703e1 100644 --- a/.github/workflows/test-wheel-linux.yml +++ b/.github/workflows/test-wheel-linux.yml @@ -257,6 +257,7 @@ jobs: uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6.2.0 with: python-version: ${{ matrix.PY_VER }} + allow-prereleases: true env: # we use self-hosted runners on which setup-python behaves weirdly (Python include can't be found)... AGENT_TOOLSDIRECTORY: "/opt/hostedtoolcache" diff --git a/ci/test-matrix.yml b/ci/test-matrix.yml index 35f02847ed7..b1fc3d137b3 100644 --- a/ci/test-matrix.yml +++ b/ci/test-matrix.yml @@ -36,6 +36,8 @@ linux: - { ARCH: 'amd64', PY_VER: '3.14t', CUDA_VER: '12.9.1', LOCAL_CTK: '1', GPU: 't4', GPU_COUNT: '1', DRIVER: 'latest' } - { ARCH: 'amd64', PY_VER: '3.14t', CUDA_VER: '13.0.2', LOCAL_CTK: '1', GPU: 'l4', GPU_COUNT: '1', DRIVER: 'latest' } - { ARCH: 'amd64', PY_VER: '3.14t', CUDA_VER: '13.2.1', LOCAL_CTK: '1', GPU: 'l4', GPU_COUNT: '1', DRIVER: 'latest' } + - { ARCH: 'amd64', PY_VER: '3.15', CUDA_VER: '13.2.1', LOCAL_CTK: '1', GPU: 'l4', GPU_COUNT: '1', DRIVER: 'latest' } + - { ARCH: 'amd64', PY_VER: '3.15t', CUDA_VER: '13.2.1', LOCAL_CTK: '1', GPU: 'l4', GPU_COUNT: '1', DRIVER: 'latest' } # linux-aarch64 - { ARCH: 'arm64', PY_VER: '3.10', CUDA_VER: '12.9.1', LOCAL_CTK: '1', GPU: 'a100', GPU_COUNT: '1', DRIVER: 'latest' } - { ARCH: 'arm64', PY_VER: '3.10', CUDA_VER: '13.0.2', LOCAL_CTK: '0', GPU: 'l4', GPU_COUNT: '1', DRIVER: 'latest' } From aeb71d2c1323394b2f9d0911840cbee7cbef4ed3 Mon Sep 17 00:00:00 2001 From: Michael Droettboom Date: Tue, 19 May 2026 13:18:23 -0400 Subject: [PATCH 02/10] Update cibuildwheel --- .github/workflows/build-wheel.yml | 30 +++++++++++++++++++++++++++--- 1 file changed, 27 insertions(+), 3 deletions(-) diff --git a/.github/workflows/build-wheel.yml b/.github/workflows/build-wheel.yml index bac1662635b..9b702a8c17e 100644 --- a/.github/workflows/build-wheel.yml +++ b/.github/workflows/build-wheel.yml @@ -164,12 +164,20 @@ jobs: cuda-version: ${{ inputs.cuda-version }} - name: Build cuda.bindings wheel - uses: pypa/cibuildwheel@8d2b08b68458a16aeb24b64e68a09ab1c8e82084 # v3.4.1 + uses: pypa/cibuildwheel@54327ab9d35de03b359ac25c97de9417d94639c0 # v4.0.0rc1 with: package-dir: ./cuda_bindings/ output-dir: ${{ env.CUDA_BINDINGS_ARTIFACTS_DIR }} env: CIBW_BUILD: ${{ env.CIBW_BUILD }} + # Allow CPython pre-release builds (currently 3.15 / 3.15t). This is a + # no-op for stable Python versions because CIBW_BUILD still filters + # the target version. + CIBW_ENABLE: cpython-prerelease + # v4.0 made delvewheel the default Windows repair command. We rely + # on cuda.pathfinder for runtime DLL discovery, so preserve the + # previous behaviour (no automatic DLL bundling) for now. + CIBW_REPAIR_WHEEL_COMMAND_WINDOWS: "" # CIBW mounts the host filesystem under /host CIBW_ENVIRONMENT_LINUX: > CUDA_PATH=/host/${{ env.CUDA_PATH }} @@ -228,12 +236,20 @@ jobs: if-no-files-found: error - name: Build cuda.core wheel - uses: pypa/cibuildwheel@8d2b08b68458a16aeb24b64e68a09ab1c8e82084 # v3.4.1 + uses: pypa/cibuildwheel@54327ab9d35de03b359ac25c97de9417d94639c0 # v4.0.0rc1 with: package-dir: ./cuda_core/ output-dir: ${{ env.CUDA_CORE_ARTIFACTS_DIR }} env: CIBW_BUILD: ${{ env.CIBW_BUILD }} + # Allow CPython pre-release builds (currently 3.15 / 3.15t). This is a + # no-op for stable Python versions because CIBW_BUILD still filters + # the target version. + CIBW_ENABLE: cpython-prerelease + # v4.0 made delvewheel the default Windows repair command. We rely + # on cuda.pathfinder for runtime DLL discovery, so preserve the + # previous behaviour (no automatic DLL bundling) for now. + CIBW_REPAIR_WHEEL_COMMAND_WINDOWS: "" # CIBW mounts the host filesystem under /host CIBW_ENVIRONMENT_LINUX: > CUDA_PATH=/host/${{ env.CUDA_PATH }} @@ -414,12 +430,20 @@ jobs: rmdir $OLD_BASENAME - name: Build cuda.core wheel - uses: pypa/cibuildwheel@8d2b08b68458a16aeb24b64e68a09ab1c8e82084 # v3.4.1 + uses: pypa/cibuildwheel@54327ab9d35de03b359ac25c97de9417d94639c0 # v4.0.0rc1 with: package-dir: ./cuda_core/ output-dir: ${{ env.CUDA_CORE_ARTIFACTS_DIR }} env: CIBW_BUILD: ${{ env.CIBW_BUILD }} + # Allow CPython pre-release builds (currently 3.15 / 3.15t). This is a + # no-op for stable Python versions because CIBW_BUILD still filters + # the target version. + CIBW_ENABLE: cpython-prerelease + # v4.0 made delvewheel the default Windows repair command. We rely + # on cuda.pathfinder for runtime DLL discovery, so preserve the + # previous behaviour (no automatic DLL bundling) for now. + CIBW_REPAIR_WHEEL_COMMAND_WINDOWS: "" # CIBW mounts the host filesystem under /host CIBW_ENVIRONMENT_LINUX: > CUDA_PATH=/host/${{ env.CUDA_PATH }} From 80af137fa4bfe3c69bbb9a8b9f9cb20a811eb8f1 Mon Sep 17 00:00:00 2001 From: Michael Droettboom Date: Tue, 19 May 2026 13:47:30 -0400 Subject: [PATCH 03/10] Remove matplotlib dependency --- cuda_bindings/pyproject.toml | 1 - 1 file changed, 1 deletion(-) diff --git a/cuda_bindings/pyproject.toml b/cuda_bindings/pyproject.toml index bac72f5b9be..539e7f2fac0 100644 --- a/cuda_bindings/pyproject.toml +++ b/cuda_bindings/pyproject.toml @@ -44,7 +44,6 @@ all = [ test = [ "cython>=3.2,<3.3", "setuptools>=77.0.0", - "matplotlib>=3.5.0", # Required by isoFDModelling_test.py "numpy>=1.21.1", "pytest>=6.2.4", "pytest-benchmark>=3.4.1", From de94e52dfb369cbedb34d00f1a7b98a2127bb388 Mon Sep 17 00:00:00 2001 From: Michael Droettboom Date: Tue, 19 May 2026 14:12:59 -0400 Subject: [PATCH 04/10] Remove cffi as a test dependency --- cuda_core/pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cuda_core/pyproject.toml b/cuda_core/pyproject.toml index d5a4b5fd29c..c1510f8d06b 100644 --- a/cuda_core/pyproject.toml +++ b/cuda_core/pyproject.toml @@ -58,7 +58,7 @@ cu12 = ["cuda-bindings[all]==12.*"] cu13 = ["cuda-bindings[all]==13.*"] [dependency-groups] -test = ["cython>=3.2,<3.3", "setuptools", "pytest>=6.2.4", "pytest-benchmark", "pytest-randomly", "pytest-repeat", "pytest-rerunfailures", "cloudpickle", "psutil", "cffi"] +test = ["cython>=3.2,<3.3", "setuptools", "pytest>=6.2.4", "pytest-benchmark", "pytest-randomly", "pytest-repeat", "pytest-rerunfailures", "cloudpickle", "psutil"] ml-dtypes = ["ml-dtypes>=0.5.4,<0.6.0"] test-cu12 = [ {include-group = "ml-dtypes" }, {include-group = "test" }, "cupy-cuda12x; python_version < '3.14'", "cuda-toolkit[cudart]==12.*"] # runtime headers needed by CuPy test-cu13 = [ {include-group = "ml-dtypes" }, {include-group = "test" }, "cupy-cuda13x; python_version < '3.14'", "cuda-toolkit[cudart]==13.*"] # runtime headers needed by CuPy From 69914905a4011f1f72ce99deda2310a5cfa32611 Mon Sep 17 00:00:00 2001 From: Michael Droettboom Date: Tue, 19 May 2026 16:29:12 -0400 Subject: [PATCH 05/10] Use LOCAL_CTK=0 for Python 3.15 --- ci/test-matrix.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ci/test-matrix.yml b/ci/test-matrix.yml index b1fc3d137b3..896e9140dd7 100644 --- a/ci/test-matrix.yml +++ b/ci/test-matrix.yml @@ -36,8 +36,8 @@ linux: - { ARCH: 'amd64', PY_VER: '3.14t', CUDA_VER: '12.9.1', LOCAL_CTK: '1', GPU: 't4', GPU_COUNT: '1', DRIVER: 'latest' } - { ARCH: 'amd64', PY_VER: '3.14t', CUDA_VER: '13.0.2', LOCAL_CTK: '1', GPU: 'l4', GPU_COUNT: '1', DRIVER: 'latest' } - { ARCH: 'amd64', PY_VER: '3.14t', CUDA_VER: '13.2.1', LOCAL_CTK: '1', GPU: 'l4', GPU_COUNT: '1', DRIVER: 'latest' } - - { ARCH: 'amd64', PY_VER: '3.15', CUDA_VER: '13.2.1', LOCAL_CTK: '1', GPU: 'l4', GPU_COUNT: '1', DRIVER: 'latest' } - - { ARCH: 'amd64', PY_VER: '3.15t', CUDA_VER: '13.2.1', LOCAL_CTK: '1', GPU: 'l4', GPU_COUNT: '1', DRIVER: 'latest' } + - { ARCH: 'amd64', PY_VER: '3.15', CUDA_VER: '13.2.1', LOCAL_CTK: '0', GPU: 'l4', GPU_COUNT: '1', DRIVER: 'latest' } + - { ARCH: 'amd64', PY_VER: '3.15t', CUDA_VER: '13.2.1', LOCAL_CTK: '0', GPU: 'l4', GPU_COUNT: '1', DRIVER: 'latest' } # linux-aarch64 - { ARCH: 'arm64', PY_VER: '3.10', CUDA_VER: '12.9.1', LOCAL_CTK: '1', GPU: 'a100', GPU_COUNT: '1', DRIVER: 'latest' } - { ARCH: 'arm64', PY_VER: '3.10', CUDA_VER: '13.0.2', LOCAL_CTK: '0', GPU: 'l4', GPU_COUNT: '1', DRIVER: 'latest' } From d120029544404dd197d956dccbbdb701e84d696e Mon Sep 17 00:00:00 2001 From: Leo Fang Date: Wed, 3 Jun 2026 23:52:26 +0000 Subject: [PATCH 06/10] Pre-build numpy for Python 3.15; exclude 3.15 from releases numpy 2.4.x has no pre-built wheel for Python 3.15 yet, and its [tool.cibuildwheel] config is incompatible with cibuildwheel v4.0. Build numpy from patched sdist via cibuildwheel with -Dallow-noblas=true on all platforms (linux-64, linux-aarch64, win-64). Also exclude python315 artifacts from release publishing since 3.15 is pre-release and not ready for PyPI. Co-Authored-By: Claude Opus 4.6 --- .github/workflows/build-wheel.yml | 62 ++++++++++++++++++++++++ .github/workflows/test-wheel-linux.yml | 11 +++++ .github/workflows/test-wheel-windows.yml | 12 +++++ ci/tools/download-wheels | 6 +++ 4 files changed, 91 insertions(+) diff --git a/.github/workflows/build-wheel.yml b/.github/workflows/build-wheel.yml index 9b702a8c17e..008e08f95f3 100644 --- a/.github/workflows/build-wheel.yml +++ b/.github/workflows/build-wheel.yml @@ -365,6 +365,68 @@ jobs: run: | pip install cuda_pathfinder/*.whl + - name: Hide GNU link.exe so Meson finds MSVC link.exe + if: ${{ startsWith(inputs.host-platform, 'win') }} + run: | + if [ -f "/c/Program Files/Git/usr/bin/link.exe" ]; then + mv "/c/Program Files/Git/usr/bin/link.exe" "/c/Program Files/Git/usr/bin/link.exe.bak" + fi + + - name: Download and patch numpy sdist (pre-release Python) + if: ${{ startsWith(matrix.python-version, '3.15') }} + run: | + pip download --no-binary numpy --no-deps "numpy>=1.21.1" -d numpy-sdist/ + cd numpy-sdist && tar xf numpy-*.tar.gz && rm numpy-*.tar.gz + # WAR: numpy 2.4.x ships [tool.cibuildwheel] config that is + # incompatible with cibuildwheel v4.0 (cpython-freethreading enable + # group, OpenBLAS before-build scripts, etc.). Strip the cibuildwheel + # sections but preserve [tool.meson-python] (vendored meson path). + python -c " + import glob + for f in glob.glob('numpy-*/pyproject.toml'): + lines, skip = open(f).readlines(), False + out = [] + for line in lines: + hdr = line.strip() + if hdr.startswith('[tool.cibuildwheel') or hdr.startswith('[[tool.cibuildwheel'): + skip = True + continue + if skip and hdr.startswith('[') and 'cibuildwheel' not in hdr: + skip = False + if not skip: + out.append(line) + open(f, 'w').writelines(out) + " + echo "NUMPY_SRC_DIR=$(pwd)/$(ls -d numpy-*/)" >> $GITHUB_ENV + + - name: Build numpy wheel (pre-release Python) + if: ${{ startsWith(matrix.python-version, '3.15') }} + uses: pypa/cibuildwheel@54327ab9d35de03b359ac25c97de9417d94639c0 # v4.0.0rc1 + env: + CIBW_BUILD: ${{ env.CIBW_BUILD }} + CIBW_ARCHS_LINUX: "native" + CIBW_BUILD_VERBOSITY: 1 + CIBW_CONFIG_SETTINGS: "setup-args=-Dallow-noblas=true" + CIBW_CONFIG_SETTINGS_WINDOWS: "setup-args=--vsenv setup-args=-Dallow-noblas=true" + CIBW_BEFORE_BUILD_WINDOWS: "pip install delvewheel" + CIBW_REPAIR_WHEEL_COMMAND_WINDOWS: "delvewheel repair -w {dest_dir} {wheel}" + CIBW_ENABLE: "cpython-prerelease" + with: + package-dir: ${{ env.NUMPY_SRC_DIR }} + output-dir: numpy-wheel/ + + - name: Upload numpy wheel + if: ${{ startsWith(matrix.python-version, '3.15') }} + uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1 + with: + name: numpy-python${{ env.PYTHON_VERSION_FORMATTED }}-${{ inputs.host-platform }} + path: numpy-wheel/*.whl + if-no-files-found: error + + - name: Install numpy wheel + if: ${{ startsWith(matrix.python-version, '3.15') }} + run: pip install numpy-wheel/*.whl + - name: Build cuda.bindings Cython tests run: | pip install ${{ env.CUDA_BINDINGS_ARTIFACTS_DIR }}/*.whl --group ./cuda_bindings/pyproject.toml:test diff --git a/.github/workflows/test-wheel-linux.yml b/.github/workflows/test-wheel-linux.yml index 7ca225c3907..029f022b12d 100644 --- a/.github/workflows/test-wheel-linux.yml +++ b/.github/workflows/test-wheel-linux.yml @@ -271,6 +271,17 @@ jobs: host-platform: ${{ inputs.host-platform }} cuda-version: ${{ matrix.CUDA_VER }} + - name: Download numpy wheel (pre-release Python) + if: ${{ startsWith(matrix.PY_VER, '3.15') }} + uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1 + with: + name: numpy-python${{ env.PYTHON_VERSION_FORMATTED }}-${{ inputs.host-platform }} + path: numpy-wheel + + - name: Install numpy wheel (pre-release Python) + if: ${{ startsWith(matrix.PY_VER, '3.15') }} + run: pip install numpy-wheel/*.whl + - name: Set up latest cuda_sanitizer_api if: ${{ env.SETUP_SANITIZER == '1' }} uses: ./.github/actions/fetch_ctk diff --git a/.github/workflows/test-wheel-windows.yml b/.github/workflows/test-wheel-windows.yml index 2218c8212db..5cd48dc72da 100644 --- a/.github/workflows/test-wheel-windows.yml +++ b/.github/workflows/test-wheel-windows.yml @@ -262,6 +262,18 @@ jobs: host-platform: ${{ inputs.host-platform }} cuda-version: ${{ matrix.CUDA_VER }} + - name: Download numpy wheel (pre-release Python) + if: ${{ startsWith(matrix.PY_VER, '3.15') }} + uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1 + with: + name: numpy-python${{ env.PYTHON_VERSION_FORMATTED }}-${{ inputs.host-platform }} + path: numpy-wheel + + - name: Install numpy wheel (pre-release Python) + if: ${{ startsWith(matrix.PY_VER, '3.15') }} + shell: bash --noprofile --norc -xeuo pipefail {0} + run: pip install numpy-wheel/*.whl + - name: Set up test repetition on nightly runs shell: bash --noprofile --norc -xeuo pipefail {0} run: echo "PYTEST_ADDOPTS=\"--count=${{ inputs.nruns }}\"" >> "$GITHUB_ENV" diff --git a/ci/tools/download-wheels b/ci/tools/download-wheels index a3141afb33b..1a98909a996 100755 --- a/ci/tools/download-wheels +++ b/ci/tools/download-wheels @@ -56,6 +56,12 @@ do continue fi + # exclude pre-release Python (3.15) wheels from releasing + if [[ "${p}" == *python315* ]]; then + echo "Skipping pre-release Python artifact: $p" + continue + fi + # If we're not downloading "all", only process matching component if [[ "$COMPONENT" != "all" && "$p" != ${COMPONENT}* ]]; then continue From 51d5fda4adb67c3db0d0ecc73d4ddbb975fb8fa6 Mon Sep 17 00:00:00 2001 From: Leo Fang Date: Thu, 4 Jun 2026 01:09:26 +0000 Subject: [PATCH 07/10] Drop CIBW_REPAIR_WHEEL_COMMAND_WINDOWS override; version-gate matplotlib/cffi Remove the empty CIBW_REPAIR_WHEEL_COMMAND_WINDOWS that was overriding the pyproject.toml delvewheel config. The pyproject.toml already specifies `delvewheel repair --namespace-pkg cuda` which is the correct behavior. Keep matplotlib and cffi as test dependencies but gate them to python_version < 3.15 (no wheels available yet for 3.15). Co-Authored-By: Claude Opus 4.6 --- .github/workflows/build-wheel.yml | 12 ------------ cuda_bindings/pyproject.toml | 1 + cuda_core/pyproject.toml | 2 +- 3 files changed, 2 insertions(+), 13 deletions(-) diff --git a/.github/workflows/build-wheel.yml b/.github/workflows/build-wheel.yml index 008e08f95f3..fba52af6bd8 100644 --- a/.github/workflows/build-wheel.yml +++ b/.github/workflows/build-wheel.yml @@ -174,10 +174,6 @@ jobs: # no-op for stable Python versions because CIBW_BUILD still filters # the target version. CIBW_ENABLE: cpython-prerelease - # v4.0 made delvewheel the default Windows repair command. We rely - # on cuda.pathfinder for runtime DLL discovery, so preserve the - # previous behaviour (no automatic DLL bundling) for now. - CIBW_REPAIR_WHEEL_COMMAND_WINDOWS: "" # CIBW mounts the host filesystem under /host CIBW_ENVIRONMENT_LINUX: > CUDA_PATH=/host/${{ env.CUDA_PATH }} @@ -246,10 +242,6 @@ jobs: # no-op for stable Python versions because CIBW_BUILD still filters # the target version. CIBW_ENABLE: cpython-prerelease - # v4.0 made delvewheel the default Windows repair command. We rely - # on cuda.pathfinder for runtime DLL discovery, so preserve the - # previous behaviour (no automatic DLL bundling) for now. - CIBW_REPAIR_WHEEL_COMMAND_WINDOWS: "" # CIBW mounts the host filesystem under /host CIBW_ENVIRONMENT_LINUX: > CUDA_PATH=/host/${{ env.CUDA_PATH }} @@ -502,10 +494,6 @@ jobs: # no-op for stable Python versions because CIBW_BUILD still filters # the target version. CIBW_ENABLE: cpython-prerelease - # v4.0 made delvewheel the default Windows repair command. We rely - # on cuda.pathfinder for runtime DLL discovery, so preserve the - # previous behaviour (no automatic DLL bundling) for now. - CIBW_REPAIR_WHEEL_COMMAND_WINDOWS: "" # CIBW mounts the host filesystem under /host CIBW_ENVIRONMENT_LINUX: > CUDA_PATH=/host/${{ env.CUDA_PATH }} diff --git a/cuda_bindings/pyproject.toml b/cuda_bindings/pyproject.toml index 59321d1f6af..e5569fe1c28 100644 --- a/cuda_bindings/pyproject.toml +++ b/cuda_bindings/pyproject.toml @@ -46,6 +46,7 @@ all = [ test = [ "cython>=3.2,<3.3", "setuptools>=77.0.0", + "matplotlib>=3.5.0; python_version < '3.15'", "numpy>=1.21.1", "pytest>=6.2.4", "pytest-benchmark>=3.4.1", diff --git a/cuda_core/pyproject.toml b/cuda_core/pyproject.toml index 21c12ab9b84..5e3783d7a07 100644 --- a/cuda_core/pyproject.toml +++ b/cuda_core/pyproject.toml @@ -58,7 +58,7 @@ cu12 = ["cuda-bindings[all]==12.*", "cuda-toolkit==12.*"] cu13 = ["cuda-bindings[all]==13.*", "cuda-toolkit==13.*"] [dependency-groups] -test = ["cython>=3.2,<3.3", "setuptools", "pytest>=6.2.4", "pytest-benchmark", "pytest-randomly", "pytest-repeat", "pytest-rerunfailures", "pytest-timeout", "cloudpickle", "psutil"] +test = ["cython>=3.2,<3.3", "setuptools", "pytest>=6.2.4", "pytest-benchmark", "pytest-randomly", "pytest-repeat", "pytest-rerunfailures", "pytest-timeout", "cloudpickle", "psutil", "cffi; python_version < '3.15'"] ml-dtypes = ["ml-dtypes>=0.5.4,<0.6.0"] test-cu12 = [ {include-group = "ml-dtypes" }, {include-group = "test" }, "cupy-cuda12x; python_version < '3.14'", "cuda-toolkit[cudart]==12.*"] # runtime headers needed by CuPy test-cu13 = [ {include-group = "ml-dtypes" }, {include-group = "test" }, "cupy-cuda13x; python_version < '3.14'", "cuda-toolkit[cudart]==13.*"] # runtime headers needed by CuPy From 193cbf95de6a663ee87e5eef651f3969c060507f Mon Sep 17 00:00:00 2001 From: Leo Fang Date: Thu, 4 Jun 2026 01:11:04 +0000 Subject: [PATCH 08/10] Tighten allow-prereleases to Python 3.15 only Co-Authored-By: Claude Opus 4.6 --- .github/workflows/build-wheel.yml | 2 +- .github/workflows/test-wheel-linux.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/build-wheel.yml b/.github/workflows/build-wheel.yml index fba52af6bd8..a799bdc15aa 100644 --- a/.github/workflows/build-wheel.yml +++ b/.github/workflows/build-wheel.yml @@ -337,7 +337,7 @@ jobs: uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6.2.0 with: python-version: ${{ matrix.python-version }} - allow-prereleases: true + allow-prereleases: ${{ startsWith(matrix.python-version, '3.15') }} - name: verify free-threaded build if: endsWith(matrix.python-version, 't') diff --git a/.github/workflows/test-wheel-linux.yml b/.github/workflows/test-wheel-linux.yml index 029f022b12d..ba47bac6966 100644 --- a/.github/workflows/test-wheel-linux.yml +++ b/.github/workflows/test-wheel-linux.yml @@ -258,7 +258,7 @@ jobs: uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6.2.0 with: python-version: ${{ matrix.PY_VER }} - allow-prereleases: true + allow-prereleases: ${{ startsWith(matrix.PY_VER, '3.15') }} env: # we use self-hosted runners on which setup-python behaves weirdly (Python include can't be found)... AGENT_TOOLSDIRECTORY: "/opt/hostedtoolcache" From 2f7a05b4d5e5d23e1d9c047043eeecef25f81233 Mon Sep 17 00:00:00 2001 From: Leo Fang Date: Thu, 4 Jun 2026 01:53:01 +0000 Subject: [PATCH 09/10] Skip musllinux when building numpy wheel Main's CIBW_BUILD is cp315-* (not cp315-manylinux* like 12.9.x), so cibuildwheel builds both manylinux and musllinux numpy wheels. The musllinux wheel is incompatible with the glibc-based test runners. Co-Authored-By: Claude Opus 4.6 --- .github/workflows/build-wheel.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/build-wheel.yml b/.github/workflows/build-wheel.yml index a799bdc15aa..724b07ac00b 100644 --- a/.github/workflows/build-wheel.yml +++ b/.github/workflows/build-wheel.yml @@ -396,6 +396,7 @@ jobs: uses: pypa/cibuildwheel@54327ab9d35de03b359ac25c97de9417d94639c0 # v4.0.0rc1 env: CIBW_BUILD: ${{ env.CIBW_BUILD }} + CIBW_SKIP: "*-musllinux*" CIBW_ARCHS_LINUX: "native" CIBW_BUILD_VERBOSITY: 1 CIBW_CONFIG_SETTINGS: "setup-args=-Dallow-noblas=true" From d1b8d824697a2bf39fcad0b8a7a99151dd437e00 Mon Sep 17 00:00:00 2001 From: Leo Fang Date: Thu, 4 Jun 2026 03:02:05 +0000 Subject: [PATCH 10/10] Fix Windows numpy build; allow 3.15 test failures - Skip musllinux and win32 when building numpy (CIBW_BUILD=cp315-* matches both win32 and win_amd64; numpy has no pyproject.toml constraint after we strip its cibuildwheel config) - Mark 3.15/3.15t test jobs as continue-on-error so they don't block CI (3.15t segfaults on CPython beta, rlcompleter test changed behavior) - Skip test_opt_out_env_var_disables_patch_even_when_interactive on Python 3.15 (upstream fixed the rlcompleter bug this test relied on) Co-Authored-By: Claude Opus 4.6 --- .github/workflows/build-wheel.yml | 2 +- .github/workflows/test-wheel-linux.yml | 1 + .github/workflows/test-wheel-windows.yml | 1 + cuda_core/tests/test_rlcompleter_patch.py | 1 + 4 files changed, 4 insertions(+), 1 deletion(-) diff --git a/.github/workflows/build-wheel.yml b/.github/workflows/build-wheel.yml index 724b07ac00b..0d7d03d25f4 100644 --- a/.github/workflows/build-wheel.yml +++ b/.github/workflows/build-wheel.yml @@ -396,7 +396,7 @@ jobs: uses: pypa/cibuildwheel@54327ab9d35de03b359ac25c97de9417d94639c0 # v4.0.0rc1 env: CIBW_BUILD: ${{ env.CIBW_BUILD }} - CIBW_SKIP: "*-musllinux*" + CIBW_SKIP: "*-musllinux* *-win32" CIBW_ARCHS_LINUX: "native" CIBW_BUILD_VERBOSITY: 1 CIBW_CONFIG_SETTINGS: "setup-args=-Dallow-noblas=true" diff --git a/.github/workflows/test-wheel-linux.yml b/.github/workflows/test-wheel-linux.yml index ba47bac6966..7d59e3cd411 100644 --- a/.github/workflows/test-wheel-linux.yml +++ b/.github/workflows/test-wheel-linux.yml @@ -102,6 +102,7 @@ jobs: fail-fast: false matrix: ${{ fromJSON(needs.compute-matrix.outputs.MATRIX) }} runs-on: "${{ matrix.FLAVOR || 'linux' }}-${{ matrix.ARCH }}-gpu-${{ matrix.GPU }}-${{ matrix.DRIVER }}-${{ matrix.GPU_COUNT }}" + continue-on-error: ${{ startsWith(matrix.PY_VER, '3.15') }} # The build stage could fail but we want the CI to keep moving. if: ${{ github.repository_owner == 'nvidia' && !cancelled() }} # Our self-hosted runners require a container diff --git a/.github/workflows/test-wheel-windows.yml b/.github/workflows/test-wheel-windows.yml index 5cd48dc72da..31760ddd9c8 100644 --- a/.github/workflows/test-wheel-windows.yml +++ b/.github/workflows/test-wheel-windows.yml @@ -95,6 +95,7 @@ jobs: fail-fast: false matrix: ${{ fromJSON(needs.compute-matrix.outputs.MATRIX) }} if: ${{ github.repository_owner == 'nvidia' && !cancelled() }} + continue-on-error: ${{ startsWith(matrix.PY_VER, '3.15') }} runs-on: "windows-${{ matrix.ARCH }}-gpu-${{ matrix.GPU }}-${{ matrix.DRIVER }}-${{ matrix.GPU_COUNT }}" steps: - name: Checkout ${{ github.event.repository.name }} diff --git a/cuda_core/tests/test_rlcompleter_patch.py b/cuda_core/tests/test_rlcompleter_patch.py index ecde4e5b0c1..4809b71a875 100644 --- a/cuda_core/tests/test_rlcompleter_patch.py +++ b/cuda_core/tests/test_rlcompleter_patch.py @@ -96,6 +96,7 @@ def test_patched_completion_succeeds_on_non_ipc_resource(): assert "allocation_handle: True" in result.stdout, result.stdout +@pytest.mark.skipif(sys.version_info >= (3, 15), reason="Python 3.15 fixed the rlcompleter bug upstream") def test_opt_out_env_var_disables_patch_even_when_interactive(): """`CUDA_CORE_DONT_FIX_TAB_COMPLETION=1` must short-circuit before the interactive check, so the bug reproduces again even under PYTHONINSPECT."""