@@ -76,18 +76,18 @@ jobs:
76
76
- { spec: cp310-manylinux_x86_64, arch: x86_64, omit: ${{ env.skip_ci_redundant_jobs }} }
77
77
- { spec: cp311-manylinux_x86_64, arch: x86_64, omit: ${{ env.skip_ci_redundant_jobs }} }
78
78
- { 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 }
83
82
84
83
# x86_64 musllinux
85
84
- { spec: cp39-musllinux_x86_64, arch: x86_64, omit: ${{ env.skip_ci_redundant_jobs }} }
86
85
- { spec: cp310-musllinux_x86_64, arch: x86_64, omit: ${{ env.skip_ci_redundant_jobs }} }
87
86
- { spec: cp311-musllinux_x86_64, arch: x86_64, omit: ${{ env.skip_ci_redundant_jobs }} }
88
87
- { spec: cp312-musllinux_x86_64, arch: x86_64, omit: ${{ env.skip_ci_redundant_jobs }} }
89
88
- { 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 }
91
91
92
92
# i686 manylinux
93
93
- { spec: cp39-manylinux_i686, arch: i686, omit: ${{ env.skip_ci_redundant_jobs }} }
@@ -109,31 +109,35 @@ jobs:
109
109
- { spec: cp311-manylinux_aarch64, arch: aarch64, omit: ${{ env.skip_ci_redundant_jobs }} }
110
110
- { spec: cp312-manylinux_aarch64, arch: aarch64, omit: ${{ env.skip_ci_redundant_jobs }} }
111
111
- { 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 }
113
114
114
115
# aarch64 musllinux
115
116
- { spec: cp39-musllinux_aarch64, arch: aarch64, omit: ${{ env.skip_ci_redundant_jobs }} }
116
117
- { spec: cp310-musllinux_aarch64, arch: aarch64, omit: ${{ env.skip_ci_redundant_jobs }} }
117
118
- { spec: cp311-musllinux_aarch64, arch: aarch64, omit: ${{ env.skip_ci_redundant_jobs }} }
118
119
- { spec: cp312-musllinux_aarch64, arch: aarch64, omit: ${{ env.skip_ci_redundant_jobs }} }
119
120
- { 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 }
121
123
122
124
# ppc64le manylinux
123
125
- { spec: cp39-manylinux_ppc64le, arch: ppc64le, test_args: '{package}/src/c', omit: ${{ env.skip_slow_jobs }} }
124
126
- { spec: cp310-manylinux_ppc64le, arch: ppc64le, test_args: '{package}/src/c', omit: ${{ env.skip_slow_jobs || env.skip_ci_redundant_jobs }} }
125
127
- { spec: cp311-manylinux_ppc64le, arch: ppc64le, test_args: '{package}/src/c', omit: ${{ env.skip_slow_jobs || env.skip_ci_redundant_jobs }} }
126
128
- { spec: cp312-manylinux_ppc64le, arch: ppc64le, test_args: '{package}/src/c', omit: ${{ env.skip_slow_jobs || env.skip_ci_redundant_jobs }} }
127
129
- { 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 }} }
129
132
130
133
# s390x manylinux
131
134
- { spec: cp39-manylinux_s390x, arch: s390x, test_args: '{package}/src/c', omit: ${{ env.skip_slow_jobs }} }
132
135
- { spec: cp310-manylinux_s390x, arch: s390x, test_args: '{package}/src/c', omit: ${{ env.skip_slow_jobs || env.skip_ci_redundant_jobs }} }
133
136
- { spec: cp311-manylinux_s390x, arch: s390x, test_args: '{package}/src/c', omit: ${{ env.skip_slow_jobs || env.skip_ci_redundant_jobs }} }
134
137
- { spec: cp312-manylinux_s390x, arch: s390x, test_args: '{package}/src/c', omit: ${{ env.skip_slow_jobs || env.skip_ci_redundant_jobs }} }
135
138
- { 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 }} }
137
141
138
142
linux :
139
143
needs : [python_sdist, make_linux_matrix]
@@ -178,7 +182,6 @@ jobs:
178
182
CIBW_MUSLLINUX_X86_64_IMAGE : ${{ matrix.musllinux_img || 'musllinux_1_2' }}
179
183
CIBW_MUSLLINUX_I686_IMAGE : ${{ matrix.musllinux_img || 'musllinux_1_2' }}
180
184
CIBW_MUSLLINUX_AARCH64_IMAGE : ${{ matrix.musllinux_img || 'musllinux_1_2' }}
181
- CIBW_ENABLE : cpython-prerelease cpython-freethreading
182
185
CIBW_TEST_REQUIRES : pytest setuptools # 3.12+ no longer includes distutils, just always ensure setuptools is present
183
186
CIBW_TEST_COMMAND : PYTHONUNBUFFERED=1 python -m pytest ${{ matrix.test_args || '{project}' }} # default to test all
184
187
run : |
@@ -220,15 +223,17 @@ jobs:
220
223
- { spec: cp311-macosx_x86_64, runs_on: [macos-13], omit: ${{ env.skip_ci_redundant_jobs }} }
221
224
- { spec: cp312-macosx_x86_64, runs_on: [macos-13], omit: ${{ env.skip_ci_redundant_jobs }} }
222
225
- { 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] }
224
228
225
229
# arm64 macos
226
230
- { spec: cp39-macosx_arm64, deployment_target: '11.0', run_wrapper: 'arch -arm64 bash --noprofile --norc -eo pipefail {0}', omit: ${{ env.skip_ci_redundant_jobs }} }
227
231
- { spec: cp310-macosx_arm64, deployment_target: '11.0', run_wrapper: 'arch -arm64 bash --noprofile --norc -eo pipefail {0}', omit: ${{ env.skip_ci_redundant_jobs}} }
228
232
- { spec: cp311-macosx_arm64, deployment_target: '11.0', run_wrapper: 'arch -arm64 bash --noprofile --norc -eo pipefail {0}', omit: ${{ env.skip_ci_redundant_jobs }} }
229
233
- { spec: cp312-macosx_arm64, deployment_target: '11.0', run_wrapper: 'arch -arm64 bash --noprofile --norc -eo pipefail {0}', omit: ${{ env.skip_ci_redundant_jobs }} }
230
234
- { 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}' }
232
237
233
238
macos :
234
239
needs : [python_sdist, make_macos_matrix]
@@ -263,7 +268,6 @@ jobs:
263
268
id : build
264
269
env :
265
270
CIBW_BUILD : ${{ matrix.spec }}
266
- CIBW_ENABLE : cpython-prerelease
267
271
CIBW_TEST_REQUIRES : pytest setuptools
268
272
CIBW_TEST_COMMAND : pip install pip --upgrade; cd {project}; PYTHONUNBUFFERED=1 pytest
269
273
MACOSX_DEPLOYMENT_TARGET : ${{ matrix.deployment_target || '10.13' }}
@@ -306,21 +310,24 @@ jobs:
306
310
- { spec: cp311-win_amd64, omit: ${{ env.skip_ci_redundant_jobs }} }
307
311
- { spec: cp312-win_amd64, omit: ${{ env.skip_ci_redundant_jobs }} }
308
312
- { 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 }
310
315
311
316
# x86 windows
312
317
- { spec: cp39-win32, omit: ${{ env.skip_ci_redundant_jobs }} }
313
318
- { spec: cp310-win32, omit: ${{ env.skip_ci_redundant_jobs }} }
314
319
- { spec: cp311-win32, omit: ${{ env.skip_ci_redundant_jobs }} }
315
320
- { spec: cp312-win32, omit: ${{ env.skip_ci_redundant_jobs }} }
316
321
- { 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 }
318
324
319
325
# 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 }
324
331
325
332
windows :
326
333
needs : [python_sdist, make_windows_matrix]
@@ -345,7 +352,6 @@ jobs:
345
352
id : build
346
353
env :
347
354
CIBW_BUILD : ${{ matrix.spec }}
348
- CIBW_ENABLE : cpython-prerelease
349
355
CIBW_TEST_REQUIRES : pytest setuptools
350
356
CIBW_TEST_COMMAND : ${{ matrix.test_cmd || 'python -m pytest {package}/src/c' }}
351
357
# FIXME: /testing takes ~45min on Windows and has some failures...
@@ -358,7 +364,7 @@ jobs:
358
364
tar zxf cffi*.tar.gz --strip-components=1 -C cffi
359
365
360
366
python -m pip install --upgrade pip
361
- pip install "${{ matrix.cibw_version || 'cibuildwheel'}}"
367
+ pip install "${{ matrix.cibw_version || 'cibuildwheel' }}"
362
368
python -m cibuildwheel --output-dir dist cffi
363
369
364
370
echo "artifact_name=$(ls ./dist/)" >> "$GITHUB_OUTPUT"
@@ -384,10 +390,73 @@ jobs:
384
390
delete-merged : true
385
391
if : ${{ env.skip_artifact_upload != 'true' }}
386
392
393
+ make_run_parallel_matrix :
394
+ runs-on : ubuntu-24.04
395
+ outputs :
396
+ matrix_json : ${{ steps.make_matrix.outputs.matrix_json }}
397
+ steps :
398
+ - uses : actions/checkout@v4
399
+ - name : make a matrix
400
+ id : make_matrix
401
+ uses : ./.github/actions/dynamatrix
402
+ with :
403
+ matrix_yaml : |
404
+ include:
405
+ - { runner: ubuntu-latest, python-version: 3.14t-dev }
406
+ - { runner: macos-latest, python-version: 3.14t-dev }
407
+ - { runner: windows-latest, python-version: 3.14t-dev }
408
+
409
+
410
+ pytest-run-parallel :
411
+ needs : make_run_parallel_matrix
412
+ strategy :
413
+ fail-fast : false
414
+ matrix : ${{ fromJSON(needs.make_run_parallel_matrix.outputs.matrix_json) }}
415
+
416
+ runs-on : ${{ matrix.runner }}
417
+ steps :
418
+ - name : clone repo
419
+ uses : actions/checkout@v4
420
+
421
+ - name : install python
422
+ uses : actions/setup-python@v5
423
+ with :
424
+ python-version : ${{ matrix.python-version }}
425
+
426
+ - name : build and install
427
+ run : |
428
+ python -m pip install pytest setuptools pytest-run-parallel
429
+ python -m pip install .
430
+
431
+ - name : run tests under pytest-run-parallel
432
+ if : runner.os == 'Windows'
433
+ run : |
434
+ python -m pytest --parallel-threads=4 src/c
435
+
436
+ - name : run tests under pytest-run-parallel
437
+ if : runner.os != 'Windows'
438
+ run : |
439
+ python -m pytest --parallel-threads=4
440
+
441
+ clang_TSAN :
442
+ runs-on : ubuntu-latest
443
+ container : ghcr.io/nascheme/numpy-tsan:3.14t
444
+ steps :
445
+ - uses : actions/checkout@v4
446
+
447
+ - name : build and install
448
+ run : |
449
+ python -m pip install setuptools pytest pytest-run-parallel
450
+ CFLAGS="-g -O3 -fsanitize=thread" python -m pip install -v .
451
+
452
+ - name : run tests under pytest-run-parallel
453
+ run : |
454
+ TSAN_OPTIONS="suppressions=$PWD/suppressions_free_threading.txt" \
455
+ python -m pytest --parallel-threads=4 --skip-thread-unsafe=True -sv
387
456
388
457
check :
389
458
if : always()
390
- needs : [python_sdist, linux, macos, windows, merge_artifacts]
459
+ needs : [python_sdist, linux, macos, windows, clang_TSAN, pytest-run-parallel, merge_artifacts]
391
460
runs-on : ubuntu-24.04
392
461
steps :
393
462
- name : Verify all previous jobs succeeded (provides a single check to sample for gating purposes)
0 commit comments