Skip to content

Add support for the free-threaded build #178

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 65 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
65 commits
Select commit Hold shift + click to select a range
c06e9e1
Initial support for free threaded Python (#1)
colesbury Mar 12, 2025
b996eab
fix various errors and warnings seen on clang and gcc
ngoldbaum May 22, 2025
0a6b216
use manylinux 2_28 on x86_64 (this will be the default in manylinux 3)
ngoldbaum May 22, 2025
1101273
Merge pull request #4 from ngoldbaum/fix-warnings
ngoldbaum May 22, 2025
92a4fff
split CT_LAZY_FIELD_LIST into a new listing of ct_flags_mut flags
ngoldbaum May 27, 2025
f4baa7a
Add CT_UNDER_CONSTRUCTION to indicate that a type is being mutated
ngoldbaum May 28, 2025
7153808
adjust assert
ngoldbaum May 28, 2025
1d70aa7
only set CT_UNDER_CONSTRUCTION during lazy init
ngoldbaum May 29, 2025
b26c421
Merge pull request #5 from ngoldbaum/mutable-constructed-flag
ngoldbaum May 29, 2025
a33cf8e
Move CT_CUSTOM_FIELD_POS and CT_WITH_PACKED_CHANGE to ct_flags_mut
ngoldbaum May 29, 2025
e33ecc5
rearrange and add asserts in do_realize_lazy_struct
ngoldbaum May 29, 2025
bc7f192
remove unhelpful comment
ngoldbaum May 29, 2025
2344819
replace ct_is_hidden with asserts
ngoldbaum May 29, 2025
90fd95f
Merge pull request #6 from ngoldbaum/mutable-flags
ngoldbaum May 29, 2025
a93b351
clarify comment
ngoldbaum Jun 3, 2025
3ad732d
Merge pull request #7 from ngoldbaum/rm-is-hidden
ngoldbaum Jun 3, 2025
62625c1
fix thread safety of _realize_c_struct_or_union
kumaraditya303 Jun 5, 2025
c8a478a
fix missing unlock
kumaraditya303 Jun 5, 2025
c66f5af
mark tests as thread unsafe
kumaraditya303 Jun 7, 2025
35bea7e
mark TestZIntegration as thread unsafe
kumaraditya303 Jun 7, 2025
95d9835
Merge pull request #11 from kumaraditya303/up
ngoldbaum Jun 7, 2025
53507aa
fix headers to avoid duplicated definitions
kumaraditya303 Jun 8, 2025
bda2a3e
Merge pull request #12 from kumaraditya303/headers
ngoldbaum Jun 8, 2025
19dd4c6
fix thread safety of enum (#10)
kumaraditya303 Jun 11, 2025
be992cb
Merge pull request #9 from kumaraditya303/realize-threadsafe
ngoldbaum Jun 11, 2025
c053f17
fix thread safety of cffi (#13)
kumaraditya303 Jun 11, 2025
bb65e0b
add trove classifier
ngoldbaum Jun 19, 2025
afd03eb
add missing CI jobs
ngoldbaum Jun 19, 2025
03bbac3
back out unnecessary CI config changes
ngoldbaum Jun 19, 2025
631fecd
pin cibuildwheel<3 in CI config
ngoldbaum Jun 19, 2025
451361a
Merge branch 'real-main' into upstream-pr
ngoldbaum Jun 19, 2025
3fc8ca6
reduce the number of pytest-run-parallel jobs
ngoldbaum Jun 19, 2025
3da4197
remove unnecessary thread_unsafe markers, add reasons for all others
ngoldbaum Jun 19, 2025
5ef99ee
expand whatsnew
ngoldbaum Jun 19, 2025
ff64827
add 3.13t pytest-run-parallel jobs
ngoldbaum Jun 19, 2025
26834f1
revert more unnecessary changes
ngoldbaum Jun 19, 2025
967af67
disable gil in extension produced by verify tests
ngoldbaum Jun 20, 2025
da61313
fail the tests if the GIL is enabled at tests completion
ngoldbaum Jun 20, 2025
ac9205f
force realizing lazy structs in ffi_sizeof
ngoldbaum Jun 20, 2025
5c9e5e4
remove out-of-date FIXME
ngoldbaum Jun 20, 2025
29989d9
tweak error
ngoldbaum Jun 20, 2025
0e5d59e
revert unnecessary change
ngoldbaum Jun 20, 2025
c02343c
Unconditionally clear weak refs in ctypdescr_dealloc to avoid race in…
ngoldbaum Jun 20, 2025
6c9b781
mark tests as thread-unsafe that might concurrently call dlclose on t…
ngoldbaum Jun 20, 2025
31e57b9
apply fix from c02343ce in a few more spots
ngoldbaum Jun 20, 2025
785a8b4
check for lazy_field_list in force_lazy_struct
ngoldbaum Jun 23, 2025
1bfc1da
use atomic loads for opcodes in realize_c_type_or_func_now
ngoldbaum Jun 23, 2025
a46b69f
address code review
kumaraditya303 Jun 26, 2025
d864931
remove skips
kumaraditya303 Jun 26, 2025
f7882f8
add thread safety note for realize_c_type_or_func
ngoldbaum Jun 26, 2025
ce04bb9
use atomics for ct_stuff
kumaraditya303 Jun 26, 2025
99a9b4f
Merge pull request #1 from kumaraditya303/up
ngoldbaum Jun 26, 2025
a50b121
Simplify ct_stuff handling
colesbury Jun 26, 2025
bef087c
use _CFFI_LOAD_OP
kumaraditya303 Jun 28, 2025
d9fe944
Merge pull request #2 from colesbury/ct_stuff
ngoldbaum Jun 28, 2025
0579981
Merge pull request #3 from kumaraditya303/less-atomics
ngoldbaum Jun 28, 2025
601196f
use one global cffi lock for thread safety
kumaraditya303 Jul 1, 2025
fc77a94
do not export dummy
kumaraditya303 Jul 1, 2025
bd1f381
skip
kumaraditya303 Jul 1, 2025
2738472
unconditionally heap-allocate _ffi_type output
ngoldbaum Jul 1, 2025
0cb7fd5
move mutable flags to bitflags for ct_flags_mut field
ngoldbaum Jul 1, 2025
9b44ef3
fix refleak
kumaraditya303 Jul 2, 2025
c8cbfe1
Apply suggestions from code review
ngoldbaum Jul 2, 2025
12d32b1
apply matti's review comments
ngoldbaum Jul 7, 2025
401336d
update version numbers
ngoldbaum Jul 7, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
101 changes: 94 additions & 7 deletions .github/workflows/ci.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -76,25 +76,28 @@ jobs:
- { spec: cp310-manylinux_x86_64, arch: x86_64, omit: ${{ env.skip_ci_redundant_jobs }} }
- { spec: cp311-manylinux_x86_64, arch: x86_64, omit: ${{ env.skip_ci_redundant_jobs }} }
- { spec: cp312-manylinux_x86_64, arch: x86_64, omit: ${{ env.skip_ci_redundant_jobs }} }
- { spec: cp313-manylinux_x86_64, arch: x86_64, omit: ${{ env.skip_ci_redundant_jobs }} }
- { spec: cp313-manylinux_x86_64, arch: x86_64, omit: ${{ env.skip_ci_redundant_jobs }} }
- { spec: cp313t-manylinux_x86_64, arch: x86_64, omit: ${{ env.skip_ci_redundant_jobs }} }
- { spec: cp314-manylinux_x86_64, arch: x86_64, cibw_version: cibuildwheel~=3.0b1 }
# 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
- { spec: cp314t-manylinux_x86_64, skip_artifact_upload: 'true', cibw_version: cibuildwheel~=3.0b1 }
- { spec: cp314t-manylinux_x86_64, cibw_version: cibuildwheel~=3.0b1 }

# x86_64 musllinux
- { spec: cp39-musllinux_x86_64, arch: x86_64, omit: ${{ env.skip_ci_redundant_jobs }} }
- { spec: cp310-musllinux_x86_64, arch: x86_64, omit: ${{ env.skip_ci_redundant_jobs }} }
- { spec: cp311-musllinux_x86_64, arch: x86_64, omit: ${{ env.skip_ci_redundant_jobs }} }
- { spec: cp312-musllinux_x86_64, arch: x86_64, omit: ${{ env.skip_ci_redundant_jobs }} }
- { spec: cp313-musllinux_x86_64, arch: x86_64, omit: ${{ env.skip_ci_redundant_jobs }} }
- { spec: cp313t-musllinux_x86_64, arch: x86_64, omit: ${{ env.skip_ci_redundant_jobs }} }
- { spec: cp314-musllinux_x86_64, arch: x86_64, cibw_version: cibuildwheel~=3.0b1 }
- { spec: cp314t-musllinux_x86_64, arch: x86_64, cibw_version: cibuildwheel~=3.0b1 }

# i686 manylinux
- { spec: cp39-manylinux_i686, arch: i686, omit: ${{ env.skip_ci_redundant_jobs }} }
- { spec: cp310-manylinux_i686, arch: i686, omit: ${{ env.skip_ci_redundant_jobs }} }
- { spec: cp311-manylinux_i686, arch: i686, omit: ${{ env.skip_ci_redundant_jobs }} }
- { spec: cp312-manylinux_i686, arch: i686, omit: ${{ env.skip_ci_redundant_jobs }} }
- { spec: cp313-manylinux_i686, arch: i686 }
- { spec: cp313t-manylinux_i686, arch: i686 }
# omit i686 releases > 3.13

# i686 musllinux
Expand All @@ -109,31 +112,39 @@ jobs:
- { spec: cp311-manylinux_aarch64, arch: aarch64, omit: ${{ env.skip_ci_redundant_jobs }} }
- { spec: cp312-manylinux_aarch64, arch: aarch64, omit: ${{ env.skip_ci_redundant_jobs }} }
- { spec: cp313-manylinux_aarch64, arch: aarch64, omit: ${{ env.skip_ci_redundant_jobs }} }
- { spec: cp313t-manylinux_aarch64, arch: aarch64, omit: ${{ env.skip_ci_redundant_jobs }} }
- { spec: cp314-manylinux_aarch64, arch: aarch64, cibw_version: cibuildwheel~=3.0b1 }
- { spec: cp314t-manylinux_aarch64, arch: aarch64, cibw_version: cibuildwheel~=3.0b1 }

# aarch64 musllinux
- { spec: cp39-musllinux_aarch64, arch: aarch64, omit: ${{ env.skip_ci_redundant_jobs }} }
- { spec: cp310-musllinux_aarch64, arch: aarch64, omit: ${{ env.skip_ci_redundant_jobs }} }
- { spec: cp311-musllinux_aarch64, arch: aarch64, omit: ${{ env.skip_ci_redundant_jobs }} }
- { spec: cp312-musllinux_aarch64, arch: aarch64, omit: ${{ env.skip_ci_redundant_jobs }} }
- { spec: cp313-musllinux_aarch64, arch: aarch64, omit: ${{ env.skip_ci_redundant_jobs }} }
- { spec: cp313t-musllinux_aarch64, arch: aarch64, omit: ${{ env.skip_ci_redundant_jobs }} }
- { spec: cp314-musllinux_aarch64, arch: aarch64, cibw_version: cibuildwheel~=3.0b1 }
- { spec: cp314t-musllinux_aarch64, arch: aarch64, cibw_version: cibuildwheel~=3.0b1 }

# ppc64le manylinux
- { spec: cp39-manylinux_ppc64le, arch: ppc64le, test_args: '{package}/src/c', omit: ${{ env.skip_slow_jobs }} }
- { spec: cp310-manylinux_ppc64le, arch: ppc64le, test_args: '{package}/src/c', omit: ${{ env.skip_slow_jobs || env.skip_ci_redundant_jobs }} }
- { spec: cp311-manylinux_ppc64le, arch: ppc64le, test_args: '{package}/src/c', omit: ${{ env.skip_slow_jobs || env.skip_ci_redundant_jobs }} }
- { spec: cp312-manylinux_ppc64le, arch: ppc64le, test_args: '{package}/src/c', omit: ${{ env.skip_slow_jobs || env.skip_ci_redundant_jobs }} }
- { spec: cp313-manylinux_ppc64le, arch: ppc64le, test_args: '{package}/src/c', omit: ${{ env.skip_slow_jobs || env.skip_ci_redundant_jobs }} }
- { spec: cp313t-manylinux_ppc64le, arch: ppc64le, test_args: '{package}/src/c', omit: ${{ env.skip_slow_jobs || env.skip_ci_redundant_jobs }} }
- { spec: cp314-manylinux_ppc64le, arch: ppc64le, omit: ${{ env.skip_slow_jobs }}, cibw_version: cibuildwheel~=3.0b1 }
- { spec: cp314t-manylinux_ppc64le, arch: ppc64le, omit: ${{ env.skip_slow_jobs }}, cibw_version: cibuildwheel~=3.0b1 }

# s390x manylinux
- { spec: cp39-manylinux_s390x, arch: s390x, test_args: '{package}/src/c', omit: ${{ env.skip_slow_jobs }} }
- { spec: cp310-manylinux_s390x, arch: s390x, test_args: '{package}/src/c', omit: ${{ env.skip_slow_jobs || env.skip_ci_redundant_jobs }} }
- { spec: cp311-manylinux_s390x, arch: s390x, test_args: '{package}/src/c', omit: ${{ env.skip_slow_jobs || env.skip_ci_redundant_jobs }} }
- { spec: cp312-manylinux_s390x, arch: s390x, test_args: '{package}/src/c', omit: ${{ env.skip_slow_jobs || env.skip_ci_redundant_jobs }} }
- { spec: cp313-manylinux_s390x, arch: s390x, test_args: '{package}/src/c', omit: ${{ env.skip_slow_jobs || env.skip_ci_redundant_jobs }} }
- { spec: cp313t-manylinux_s390x, arch: s390x, test_args: '{package}/src/c', omit: ${{ env.skip_slow_jobs || env.skip_ci_redundant_jobs }} }
- { spec: cp314-manylinux_s390x, arch: s390x, omit: ${{ env.skip_slow_jobs }}, cibw_version: cibuildwheel~=3.0b1 }
- { spec: cp314t-manylinux_s390x, arch: s390x, omit: ${{ env.skip_slow_jobs }}, cibw_version: cibuildwheel~=3.0b1 }

linux:
needs: [python_sdist, make_linux_matrix]
Expand Down Expand Up @@ -220,15 +231,19 @@ jobs:
- { spec: cp311-macosx_x86_64, runs_on: [macos-13], omit: ${{ env.skip_ci_redundant_jobs }} }
- { spec: cp312-macosx_x86_64, runs_on: [macos-13], omit: ${{ env.skip_ci_redundant_jobs }} }
- { spec: cp313-macosx_x86_64, runs_on: [macos-13], omit: ${{ env.skip_ci_redundant_jobs }} }
- { spec: cp313t-macosx_x86_64, runs_on: [macos-13], omit: ${{ env.skip_ci_redundant_jobs }} }
- { spec: cp314-macosx_x86_64, runs_on: [macos-13], cibw_version: cibuildwheel~=3.0b1 }
- { spec: cp314t-macosx_x86_64, runs_on: [macos-13], cibw_version: cibuildwheel~=3.0b1 }

# arm64 macos
- { spec: cp39-macosx_arm64, deployment_target: '11.0', run_wrapper: 'arch -arm64 bash --noprofile --norc -eo pipefail {0}', omit: ${{ env.skip_ci_redundant_jobs }} }
- { spec: cp310-macosx_arm64, deployment_target: '11.0', run_wrapper: 'arch -arm64 bash --noprofile --norc -eo pipefail {0}', omit: ${{ env.skip_ci_redundant_jobs}} }
- { spec: cp311-macosx_arm64, deployment_target: '11.0', run_wrapper: 'arch -arm64 bash --noprofile --norc -eo pipefail {0}', omit: ${{ env.skip_ci_redundant_jobs }} }
- { spec: cp312-macosx_arm64, deployment_target: '11.0', run_wrapper: 'arch -arm64 bash --noprofile --norc -eo pipefail {0}', omit: ${{ env.skip_ci_redundant_jobs }} }
- { spec: cp313-macosx_arm64, deployment_target: '11.0', run_wrapper: 'arch -arm64 bash --noprofile --norc -eo pipefail {0}', omit: ${{ env.skip_ci_redundant_jobs }} }
- { spec: cp313t-macosx_arm64, deployment_target: '11.0', run_wrapper: 'arch -arm64 bash --noprofile --norc -eo pipefail {0}', omit: ${{ env.skip_ci_redundant_jobs }} }
- { spec: cp314-macosx_arm64, deployment_target: '11.0', run_wrapper: 'arch -arm64 bash --noprofile --norc -eo pipefail {0}', cibw_version: cibuildwheel~=3.0b1 }
- { spec: cp314t-macosx_arm64, deployment_target: '11.0', run_wrapper: 'arch -arm64 bash --noprofile --norc -eo pipefail {0}', cibw_version: cibuildwheel~=3.0b1 }

macos:
needs: [python_sdist, make_macos_matrix]
Expand Down Expand Up @@ -263,7 +278,7 @@ jobs:
id: build
env:
CIBW_BUILD: ${{ matrix.spec }}
CIBW_ENABLE: cpython-prerelease
CIBW_ENABLE: "cpython-prerelease cpython-freethreading"
CIBW_TEST_REQUIRES: pytest setuptools
CIBW_TEST_COMMAND: pip install pip --upgrade; cd {project}; PYTHONUNBUFFERED=1 pytest
MACOSX_DEPLOYMENT_TARGET: ${{ matrix.deployment_target || '10.13' }}
Expand Down Expand Up @@ -306,21 +321,27 @@ jobs:
- { spec: cp311-win_amd64, omit: ${{ env.skip_ci_redundant_jobs }} }
- { spec: cp312-win_amd64, omit: ${{ env.skip_ci_redundant_jobs }} }
- { spec: cp313-win_amd64, omit: ${{ env.skip_ci_redundant_jobs }} }
- { spec: cp313t-win_amd64, omit: ${{ env.skip_ci_redundant_jobs }} }
- { spec: cp314-win_amd64, cibw_version: cibuildwheel~=3.0b1 }
- { spec: cp314t-win_amd64, cibw_version: cibuildwheel~=3.0b1 }

# x86 windows
- { spec: cp39-win32, omit: ${{ env.skip_ci_redundant_jobs }} }
- { spec: cp310-win32, omit: ${{ env.skip_ci_redundant_jobs }} }
- { spec: cp311-win32, omit: ${{ env.skip_ci_redundant_jobs }} }
- { spec: cp312-win32, omit: ${{ env.skip_ci_redundant_jobs }} }
- { spec: cp313-win32, omit: ${{ env.skip_ci_redundant_jobs }} }
- { spec: cp313t-win32, omit: ${{ env.skip_ci_redundant_jobs }} }
- { spec: cp314-win32, cibw_version: cibuildwheel~=3.0b1 }
- { spec: cp314t-win32, cibw_version: cibuildwheel~=3.0b1 }

# arm64 windows
- { spec: cp311-win_arm64, runs_on: windows-11-arm, omit: ${{ env.skip_ci_redundant_jobs }}, cibw_version: cibuildwheel~=3.0b1 }
- { spec: cp312-win_arm64, runs_on: windows-11-arm, omit: ${{ env.skip_ci_redundant_jobs }}, cibw_version: cibuildwheel~=3.0b1 }
- { spec: cp313-win_arm64, runs_on: windows-11-arm, omit: ${{ env.skip_ci_redundant_jobs }}, cibw_version: cibuildwheel~=3.0b1 }
- { spec: cp313t-win_arm64, runs_on: windows-11-arm, omit: ${{ env.skip_ci_redundant_jobs }}, cibw_version: cibuildwheel~=3.0b1 }
- { spec: cp314-win_arm64, runs_on: windows-11-arm, cibw_version: cibuildwheel~=3.0b1 }
- { spec: cp314t-win_arm64, runs_on: windows-11-arm, cibw_version: cibuildwheel~=3.0b1 }

windows:
needs: [python_sdist, make_windows_matrix]
Expand All @@ -345,7 +366,7 @@ jobs:
id: build
env:
CIBW_BUILD: ${{ matrix.spec }}
CIBW_ENABLE: cpython-prerelease
CIBW_ENABLE: "cpython-prerelease cpython-freethreading"
CIBW_TEST_REQUIRES: pytest setuptools
CIBW_TEST_COMMAND: ${{ matrix.test_cmd || 'python -m pytest {package}/src/c' }}
# FIXME: /testing takes ~45min on Windows and has some failures...
Expand All @@ -358,7 +379,7 @@ jobs:
tar zxf cffi*.tar.gz --strip-components=1 -C cffi

python -m pip install --upgrade pip
pip install "${{ matrix.cibw_version || 'cibuildwheel'}}"
pip install "${{ matrix.cibw_version || 'cibuildwheel' }}"
python -m cibuildwheel --output-dir dist cffi

echo "artifact_name=$(ls ./dist/)" >> "$GITHUB_OUTPUT"
Expand All @@ -384,10 +405,76 @@ jobs:
delete-merged: true
if: ${{ env.skip_artifact_upload != 'true' }}

make_run_parallel_matrix:
runs-on: ubuntu-24.04
outputs:
matrix_json: ${{ steps.make_matrix.outputs.matrix_json }}
steps:
- uses: actions/checkout@v4
- name: make a matrix
id: make_matrix
uses: ./.github/actions/dynamatrix
with:
matrix_yaml: |
include:
- { runner: ubuntu-latest, python-version: 3.13t, omit: ${{env.skip_ci_redundant_jobs }} }
- { runner: ubuntu-latest, python-version: 3.14t-dev }
- { runner: macos-latest, python-version: 3.13t, omit: ${{env.skip_ci_redundant_jobs }} }
- { runner: macos-latest, python-version: 3.14t-dev }
- { runner: windows-latest, python-version: 3.13t, omit: ${{env.skip_ci_redundant_jobs }} }
- { runner: windows-latest, python-version: 3.14t-dev }


pytest-run-parallel:
needs: make_run_parallel_matrix
strategy:
fail-fast: false
matrix: ${{ fromJSON(needs.make_run_parallel_matrix.outputs.matrix_json) }}

runs-on: ${{ matrix.runner }}
steps:
- name: clone repo
uses: actions/checkout@v4

- name: install python
uses: actions/setup-python@v5
with:
python-version: ${{ matrix.python-version }}

- name: build and install
run: |
python -m pip install pytest setuptools pytest-run-parallel
python -m pip install .

- name: run tests under pytest-run-parallel
if: runner.os == 'Windows'
run: |
python -m pytest --parallel-threads=4 src/c

- name: run tests under pytest-run-parallel
if: runner.os != 'Windows'
run: |
python -m pytest --parallel-threads=4

clang_TSAN:
runs-on: ubuntu-latest
container: ghcr.io/nascheme/numpy-tsan:3.14t
steps:
- uses: actions/checkout@v4

- name: build and install
run: |
python -m pip install setuptools pytest pytest-run-parallel
CFLAGS="-g -O3 -fsanitize=thread" python -m pip install -v .

- name: run tests under pytest-run-parallel
run: |
TSAN_OPTIONS="suppressions=$PWD/suppressions_free_threading.txt" \
python -m pytest --parallel-threads=4 --skip-thread-unsafe=True -sv

check:
if: always()
needs: [python_sdist, linux, macos, windows, merge_artifacts]
needs: [python_sdist, linux, macos, windows, clang_TSAN, pytest-run-parallel, merge_artifacts]
runs-on: ubuntu-24.04
steps:
- name: Verify all previous jobs succeeded (provides a single check to sample for gating purposes)
Expand Down
4 changes: 2 additions & 2 deletions doc/source/conf.py
Original file line number Diff line number Diff line change
Expand Up @@ -45,9 +45,9 @@
# built documents.
#
# The short X.Y version.
version = '1.18'
version = '2.0'
# The full version, including alpha/beta/rc tags.
release = '1.18.0.dev0'
release = '2.0.0.dev0'

# The language for content autogenerated by Sphinx. Refer to documentation
# for a list of supported languages.
Expand Down
10 changes: 9 additions & 1 deletion doc/source/whatsnew.rst
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,19 @@
What's New
======================

v1.18.0.dev0
v2.0.0.dev0
============

* Added support for free threaded Python. (`#178`_)
Note that the free-threaded build does not yet support building extensions
with the limited API, so you must set py_limited_api=False when building
extensions for the free-threaded build.
* Added support for Python 3.14. (`#177`_)
* WIP

.. _`#177`: https://github.com/python-cffi/cffi/pull/177
.. _`#178`: https://github.com/python-cffi/cffi/pull/178

v1.17.1
=======

Expand Down
3 changes: 2 additions & 1 deletion pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ build-backend = "setuptools.build_meta"

[project]
name = "cffi"
version = "1.18.0.dev0"
version = "2.0.0.dev0"
dependencies = [
"pycparser; implementation_name != 'PyPy'",
]
Expand All @@ -26,6 +26,7 @@ classifiers = [
"Programming Language :: Python :: 3.12",
"Programming Language :: Python :: 3.13",
"Programming Language :: Python :: 3.14",
"Programming Language :: Python :: Free Threading :: 2 - Beta",
"Programming Language :: Python :: Implementation :: CPython",
"Programming Language :: Python :: Implementation :: PyPy",
]
Expand Down
Loading