@@ -76,18 +76,18 @@ jobs:
7676 - { spec: cp310-manylinux_x86_64, arch: x86_64, omit: ${{ env.skip_ci_redundant_jobs }} }
7777 - { spec: cp311-manylinux_x86_64, arch: x86_64, omit: ${{ env.skip_ci_redundant_jobs }} }
7878 - { spec: cp312-manylinux_x86_64, arch: x86_64, omit: ${{ env.skip_ci_redundant_jobs }} }
79- - { spec: cp313-manylinux_x86_64, arch: x86_64, omit: ${{ env.skip_ci_redundant_jobs }} }
80- - { spec: cp314-manylinux_x86_64, arch: x86_64, cibw_version: cibuildwheel~=3.0b1 }
81- # FIXME: need to run tests with PYTHON_GIL=0 on this build to actually test sans-GIL, but breaks packaging tests that use the wrong `virtualenv` script wrapper
82- - { spec: cp314t-manylinux_x86_64, skip_artifact_upload: 'true', cibw_version: cibuildwheel~=3.0b1 }
79+ - { spec: cp313-manylinux_x86_64, arch: x86_64, omit: ${{ env.skip_ci_redundant_jobs }} }
80+ - { spec: cp314-manylinux_x86_64, arch: x86_64 }
81+ - { spec: cp314t-manylinux_x86_64, arch: x86_64 }
8382
8483 # x86_64 musllinux
8584 - { spec: cp39-musllinux_x86_64, arch: x86_64, omit: ${{ env.skip_ci_redundant_jobs }} }
8685 - { spec: cp310-musllinux_x86_64, arch: x86_64, omit: ${{ env.skip_ci_redundant_jobs }} }
8786 - { spec: cp311-musllinux_x86_64, arch: x86_64, omit: ${{ env.skip_ci_redundant_jobs }} }
8887 - { spec: cp312-musllinux_x86_64, arch: x86_64, omit: ${{ env.skip_ci_redundant_jobs }} }
8988 - { spec: cp313-musllinux_x86_64, arch: x86_64, omit: ${{ env.skip_ci_redundant_jobs }} }
90- - { spec: cp314-musllinux_x86_64, arch: x86_64, cibw_version: cibuildwheel~=3.0b1 }
89+ - { spec: cp314-musllinux_x86_64, arch: x86_64 }
90+ - { spec: cp314t-musllinux_x86_64, arch: x86_64 }
9191
9292 # i686 manylinux
9393 - { spec: cp39-manylinux_i686, arch: i686, omit: ${{ env.skip_ci_redundant_jobs }} }
@@ -109,31 +109,35 @@ jobs:
109109 - { spec: cp311-manylinux_aarch64, arch: aarch64, omit: ${{ env.skip_ci_redundant_jobs }} }
110110 - { spec: cp312-manylinux_aarch64, arch: aarch64, omit: ${{ env.skip_ci_redundant_jobs }} }
111111 - { spec: cp313-manylinux_aarch64, arch: aarch64, omit: ${{ env.skip_ci_redundant_jobs }} }
112- - { spec: cp314-manylinux_aarch64, arch: aarch64, cibw_version: cibuildwheel~=3.0b1 }
112+ - { spec: cp314-manylinux_aarch64, arch: aarch64 }
113+ - { spec: cp314t-manylinux_aarch64, arch: aarch64 }
113114
114115 # aarch64 musllinux
115116 - { spec: cp39-musllinux_aarch64, arch: aarch64, omit: ${{ env.skip_ci_redundant_jobs }} }
116117 - { spec: cp310-musllinux_aarch64, arch: aarch64, omit: ${{ env.skip_ci_redundant_jobs }} }
117118 - { spec: cp311-musllinux_aarch64, arch: aarch64, omit: ${{ env.skip_ci_redundant_jobs }} }
118119 - { spec: cp312-musllinux_aarch64, arch: aarch64, omit: ${{ env.skip_ci_redundant_jobs }} }
119120 - { spec: cp313-musllinux_aarch64, arch: aarch64, omit: ${{ env.skip_ci_redundant_jobs }} }
120- - { spec: cp314-musllinux_aarch64, arch: aarch64, cibw_version: cibuildwheel~=3.0b1 }
121+ - { spec: cp314-musllinux_aarch64, arch: aarch64 }
122+ - { spec: cp314t-musllinux_aarch64, arch: aarch64 }
121123
122124 # ppc64le manylinux
123125 - { spec: cp39-manylinux_ppc64le, arch: ppc64le, test_args: '{package}/src/c', omit: ${{ env.skip_slow_jobs }} }
124126 - { spec: cp310-manylinux_ppc64le, arch: ppc64le, test_args: '{package}/src/c', omit: ${{ env.skip_slow_jobs || env.skip_ci_redundant_jobs }} }
125127 - { spec: cp311-manylinux_ppc64le, arch: ppc64le, test_args: '{package}/src/c', omit: ${{ env.skip_slow_jobs || env.skip_ci_redundant_jobs }} }
126128 - { spec: cp312-manylinux_ppc64le, arch: ppc64le, test_args: '{package}/src/c', omit: ${{ env.skip_slow_jobs || env.skip_ci_redundant_jobs }} }
127129 - { spec: cp313-manylinux_ppc64le, arch: ppc64le, test_args: '{package}/src/c', omit: ${{ env.skip_slow_jobs || env.skip_ci_redundant_jobs }} }
128- - { spec: cp314-manylinux_ppc64le, arch: ppc64le, omit: ${{ env.skip_slow_jobs }}, cibw_version: cibuildwheel~=3.0b1 }
130+ - { spec: cp314-manylinux_ppc64le, arch: ppc64le, omit: ${{ env.skip_slow_jobs }} }
131+ - { spec: cp314t-manylinux_ppc64le, arch: ppc64le, omit: ${{ env.skip_slow_jobs }} }
129132
130133 # s390x manylinux
131134 - { spec: cp39-manylinux_s390x, arch: s390x, test_args: '{package}/src/c', omit: ${{ env.skip_slow_jobs }} }
132135 - { spec: cp310-manylinux_s390x, arch: s390x, test_args: '{package}/src/c', omit: ${{ env.skip_slow_jobs || env.skip_ci_redundant_jobs }} }
133136 - { spec: cp311-manylinux_s390x, arch: s390x, test_args: '{package}/src/c', omit: ${{ env.skip_slow_jobs || env.skip_ci_redundant_jobs }} }
134137 - { spec: cp312-manylinux_s390x, arch: s390x, test_args: '{package}/src/c', omit: ${{ env.skip_slow_jobs || env.skip_ci_redundant_jobs }} }
135138 - { spec: cp313-manylinux_s390x, arch: s390x, test_args: '{package}/src/c', omit: ${{ env.skip_slow_jobs || env.skip_ci_redundant_jobs }} }
136- - { spec: cp314-manylinux_s390x, arch: s390x, omit: ${{ env.skip_slow_jobs }}, cibw_version: cibuildwheel~=3.0b1 }
139+ - { spec: cp314-manylinux_s390x, arch: s390x, omit: ${{ env.skip_slow_jobs }} }
140+ - { spec: cp314t-manylinux_s390x, arch: s390x, omit: ${{ env.skip_slow_jobs }} }
137141
138142 linux :
139143 needs : [python_sdist, make_linux_matrix]
@@ -178,7 +182,6 @@ jobs:
178182 CIBW_MUSLLINUX_X86_64_IMAGE : ${{ matrix.musllinux_img || 'musllinux_1_2' }}
179183 CIBW_MUSLLINUX_I686_IMAGE : ${{ matrix.musllinux_img || 'musllinux_1_2' }}
180184 CIBW_MUSLLINUX_AARCH64_IMAGE : ${{ matrix.musllinux_img || 'musllinux_1_2' }}
181- CIBW_ENABLE : cpython-prerelease cpython-freethreading
182185 CIBW_TEST_REQUIRES : pytest setuptools # 3.12+ no longer includes distutils, just always ensure setuptools is present
183186 CIBW_TEST_COMMAND : PYTHONUNBUFFERED=1 python -m pytest ${{ matrix.test_args || '{project}' }} # default to test all
184187 run : |
@@ -220,15 +223,17 @@ jobs:
220223 - { spec: cp311-macosx_x86_64, runs_on: [macos-13], omit: ${{ env.skip_ci_redundant_jobs }} }
221224 - { spec: cp312-macosx_x86_64, runs_on: [macos-13], omit: ${{ env.skip_ci_redundant_jobs }} }
222225 - { spec: cp313-macosx_x86_64, runs_on: [macos-13], omit: ${{ env.skip_ci_redundant_jobs }} }
223- - { spec: cp314-macosx_x86_64, runs_on: [macos-13], cibw_version: cibuildwheel~=3.0b1 }
226+ - { spec: cp314-macosx_x86_64, runs_on: [macos-13] }
227+ - { spec: cp314t-macosx_x86_64, runs_on: [macos-13] }
224228
225229 # arm64 macos
226230 - { spec: cp39-macosx_arm64, deployment_target: '11.0', run_wrapper: 'arch -arm64 bash --noprofile --norc -eo pipefail {0}', omit: ${{ env.skip_ci_redundant_jobs }} }
227231 - { spec: cp310-macosx_arm64, deployment_target: '11.0', run_wrapper: 'arch -arm64 bash --noprofile --norc -eo pipefail {0}', omit: ${{ env.skip_ci_redundant_jobs}} }
228232 - { spec: cp311-macosx_arm64, deployment_target: '11.0', run_wrapper: 'arch -arm64 bash --noprofile --norc -eo pipefail {0}', omit: ${{ env.skip_ci_redundant_jobs }} }
229233 - { spec: cp312-macosx_arm64, deployment_target: '11.0', run_wrapper: 'arch -arm64 bash --noprofile --norc -eo pipefail {0}', omit: ${{ env.skip_ci_redundant_jobs }} }
230234 - { spec: cp313-macosx_arm64, deployment_target: '11.0', run_wrapper: 'arch -arm64 bash --noprofile --norc -eo pipefail {0}', omit: ${{ env.skip_ci_redundant_jobs }} }
231- - { spec: cp314-macosx_arm64, deployment_target: '11.0', run_wrapper: 'arch -arm64 bash --noprofile --norc -eo pipefail {0}', cibw_version: cibuildwheel~=3.0b1 }
235+ - { spec: cp314-macosx_arm64, deployment_target: '11.0', run_wrapper: 'arch -arm64 bash --noprofile --norc -eo pipefail {0}' }
236+ - { spec: cp314t-macosx_arm64, deployment_target: '11.0', run_wrapper: 'arch -arm64 bash --noprofile --norc -eo pipefail {0}' }
232237
233238 macos :
234239 needs : [python_sdist, make_macos_matrix]
@@ -263,7 +268,6 @@ jobs:
263268 id : build
264269 env :
265270 CIBW_BUILD : ${{ matrix.spec }}
266- CIBW_ENABLE : cpython-prerelease
267271 CIBW_TEST_REQUIRES : pytest setuptools
268272 CIBW_TEST_COMMAND : pip install pip --upgrade; cd {project}; PYTHONUNBUFFERED=1 pytest
269273 MACOSX_DEPLOYMENT_TARGET : ${{ matrix.deployment_target || '10.13' }}
@@ -306,21 +310,24 @@ jobs:
306310 - { spec: cp311-win_amd64, omit: ${{ env.skip_ci_redundant_jobs }} }
307311 - { spec: cp312-win_amd64, omit: ${{ env.skip_ci_redundant_jobs }} }
308312 - { spec: cp313-win_amd64, omit: ${{ env.skip_ci_redundant_jobs }} }
309- - { spec: cp314-win_amd64, cibw_version: cibuildwheel~=3.0b1 }
313+ - { spec: cp314-win_amd64 }
314+ - { spec: cp314t-win_amd64 }
310315
311316 # x86 windows
312317 - { spec: cp39-win32, omit: ${{ env.skip_ci_redundant_jobs }} }
313318 - { spec: cp310-win32, omit: ${{ env.skip_ci_redundant_jobs }} }
314319 - { spec: cp311-win32, omit: ${{ env.skip_ci_redundant_jobs }} }
315320 - { spec: cp312-win32, omit: ${{ env.skip_ci_redundant_jobs }} }
316321 - { spec: cp313-win32, omit: ${{ env.skip_ci_redundant_jobs }} }
317- - { spec: cp314-win32, cibw_version: cibuildwheel~=3.0b1 }
322+ - { spec: cp314-win32 }
323+ - { spec: cp314t-win32 }
318324
319325 # arm64 windows
320- - { spec: cp311-win_arm64, runs_on: windows-11-arm, omit: ${{ env.skip_ci_redundant_jobs }}, cibw_version: cibuildwheel~=3.0b1 }
321- - { spec: cp312-win_arm64, runs_on: windows-11-arm, omit: ${{ env.skip_ci_redundant_jobs }}, cibw_version: cibuildwheel~=3.0b1 }
322- - { spec: cp313-win_arm64, runs_on: windows-11-arm, omit: ${{ env.skip_ci_redundant_jobs }}, cibw_version: cibuildwheel~=3.0b1 }
323- - { spec: cp314-win_arm64, runs_on: windows-11-arm, cibw_version: cibuildwheel~=3.0b1 }
326+ - { spec: cp311-win_arm64, runs_on: windows-11-arm, omit: ${{ env.skip_ci_redundant_jobs }} }
327+ - { spec: cp312-win_arm64, runs_on: windows-11-arm, omit: ${{ env.skip_ci_redundant_jobs }} }
328+ - { spec: cp313-win_arm64, runs_on: windows-11-arm, omit: ${{ env.skip_ci_redundant_jobs }} }
329+ - { spec: cp314-win_arm64, runs_on: windows-11-arm }
330+ - { spec: cp314t-win_arm64, runs_on: windows-11-arm }
324331
325332 windows :
326333 needs : [python_sdist, make_windows_matrix]
@@ -345,7 +352,6 @@ jobs:
345352 id : build
346353 env :
347354 CIBW_BUILD : ${{ matrix.spec }}
348- CIBW_ENABLE : cpython-prerelease
349355 CIBW_TEST_REQUIRES : pytest setuptools
350356 CIBW_TEST_COMMAND : ${{ matrix.test_cmd || 'python -m pytest {package}/src/c' }}
351357 # FIXME: /testing takes ~45min on Windows and has some failures...
@@ -358,7 +364,7 @@ jobs:
358364 tar zxf cffi*.tar.gz --strip-components=1 -C cffi
359365
360366 python -m pip install --upgrade pip
361- pip install "${{ matrix.cibw_version || 'cibuildwheel'}}"
367+ pip install "${{ matrix.cibw_version || 'cibuildwheel' }}"
362368 python -m cibuildwheel --output-dir dist cffi
363369
364370 echo "artifact_name=$(ls ./dist/)" >> "$GITHUB_OUTPUT"
@@ -487,10 +493,73 @@ jobs:
487493 delete-merged : true
488494 if : ${{ env.skip_artifact_upload != 'true' }}
489495
496+ make_run_parallel_matrix :
497+ runs-on : ubuntu-24.04
498+ outputs :
499+ matrix_json : ${{ steps.make_matrix.outputs.matrix_json }}
500+ steps :
501+ - uses : actions/checkout@v4
502+ - name : make a matrix
503+ id : make_matrix
504+ uses : ./.github/actions/dynamatrix
505+ with :
506+ matrix_yaml : |
507+ include:
508+ - { runner: ubuntu-latest, python-version: 3.14t-dev }
509+ - { runner: macos-latest, python-version: 3.14t-dev }
510+ - { runner: windows-latest, python-version: 3.14t-dev }
511+
512+
513+ pytest-run-parallel :
514+ needs : make_run_parallel_matrix
515+ strategy :
516+ fail-fast : false
517+ matrix : ${{ fromJSON(needs.make_run_parallel_matrix.outputs.matrix_json) }}
518+
519+ runs-on : ${{ matrix.runner }}
520+ steps :
521+ - name : clone repo
522+ uses : actions/checkout@v4
523+
524+ - name : install python
525+ uses : actions/setup-python@v5
526+ with :
527+ python-version : ${{ matrix.python-version }}
528+
529+ - name : build and install
530+ run : |
531+ python -m pip install pytest setuptools pytest-run-parallel
532+ python -m pip install .
533+
534+ - name : run tests under pytest-run-parallel
535+ if : runner.os == 'Windows'
536+ run : |
537+ python -m pytest --parallel-threads=4 src/c
538+
539+ - name : run tests under pytest-run-parallel
540+ if : runner.os != 'Windows'
541+ run : |
542+ python -m pytest --parallel-threads=4
543+
544+ clang_TSAN :
545+ runs-on : ubuntu-latest
546+ container : ghcr.io/nascheme/numpy-tsan:3.14t
547+ steps :
548+ - uses : actions/checkout@v4
549+
550+ - name : build and install
551+ run : |
552+ python -m pip install setuptools pytest pytest-run-parallel
553+ CFLAGS="-g -O3 -fsanitize=thread" python -m pip install -v .
554+
555+ - name : run tests under pytest-run-parallel
556+ run : |
557+ TSAN_OPTIONS="suppressions=$PWD/suppressions_free_threading.txt" \
558+ python -m pytest --parallel-threads=4 --skip-thread-unsafe=True -sv
490559
491560 check :
492561 if : always()
493- needs : [python_sdist, linux, macos, windows, ios, merge_artifacts]
562+ needs : [python_sdist, linux, macos, windows, ios, clang_TSAN, pytest-run-parallel, merge_artifacts]
494563 runs-on : ubuntu-24.04
495564 steps :
496565 - name : Verify all previous jobs succeeded (provides a single check to sample for gating purposes)
0 commit comments