You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
Py_GIL_DISABLED not defined in "free-threaded" Windows C-API extensions #111650
On Windows, the Py_GIL_DISABLED macro is not defined when building C API extensions with the free-threaded build of CPython 3.13 (i.e., --disable-gil). Now that biased reference counting (6dfb8fe) landed, this leads to incorrect/failed compilation of extensions on Windows 1. The problem does not occur on Linux/macOS and other ./configure based builds because that build system defines the Py_NOGIL macro as part of pyconfig.h. On Windows, Py_GIL_DISABLED instead defined as a pre-processor definition in pyproject.props, but that's used by C-API extensions.
Among other problems, this leads to test_peg_generator failing on the nogil Windows buildbot (example failure).
I can think of two possible approaches to fixing this:
Modify setuptools (maybe setuptools.distutils?) to define Py_GIL_DISABLED when invoking the compiler if sysconfig.get_config_var("Py_NOGIL") is True.
In the CPython Windows build, generate a header file defining/undefing Py_GIL_DISABLED depending on if the build is invoked with --disable-gil or not.
The first option seems a little more straightforward to me, but there is a risk that we might encounter this same issue across multiple extension build systems. The second option seems like it would more robustly address this issue.
@zooba, I'd appreciate your feedback and suggestions about the best way to make sure that Windows C API extensions have Py_NOGIL defined when building with the free-threaded (--disable-gil) 3.13 builds.
I think we probably need to start modifying pyconfig.h at some stage in the build process. Eventually we should get an improved sysconfig [alternative] that can include the flag, but until then I don't think we want to make modifications in every build backend that's out there, nor do we want to force them to launch the target interpreter in order to get the right settings (which prevents cross-compilation, for example).
I'm not sure how best to do it though. Probably the ideal looks like:
copy/patch pyconfig.h and write it to $(IntDir) (not back into the source tree)
do rest of build referencing that directory instead of PC\
copy patched pyconfig.h into $(OutDir)
make sure Tools/msi and PC/layout pull it from the output directory and not the sources
make sure the build in release-tools does the same (though I think it should happen automatically with the previous changes)
We shouldn't have to patch anything in the stdlib that finds the header, I'm pretty sure they were only in distutils. And an install layout should have it end up in the Include directory if Tools/msi and PC/layout are updated.
So there's a lot of moving parts, plus we need to figure out the best way to template the header so it can be modified as part of the build. There's not really anything built into our build system for this yet.
Hi @zooba, I started implementing this and ran into a few issues. Not having a pyconfig.h in PC or Include breaks setuptools. The install layout can place the generated pyconfig.h in the installed Include directory, but you can also run pip directly from the CPython source directory without the installer. It seems like we'll run into fewer issues if we place the generated pyconfig.h in the PC directory.
Left a few suggestions on the draft PR - in short:
I prefer Include\pyconfig.h over PC\pyconfig.h, and I suspect/hope every other tool will, too.
setuptools is definitely going to need an update of some kind here, at least for running within build directories (likely in code taken from distutils). Regular installs shouldn't have any issue. I think we should do the setuptools update in parallel, and not try to make their older versions work.
As neat as the PowerShell script is, we already assume a bootstrap Python is available, so it may as well be a Python script
POSIX places the generated pyconfig.h in the root directory, not in Include. Placing it in Include/pyconfig.h is would be a third location for tools to handle, breaks setuptools (and possibly other build tools), and does not get us any closer to unifying the builds.
setuptools is definitely going to need an update of some kind here...
If we don't move pyconfig.h, what update will setuptools need?
As neat as the PowerShell script is, we already assume a bootstrap Python is available, so it may as well be a Python script
changed the title [-]Py_NOGIL not defined in "free-threaded" Windows C-API extensions [/-][+]Py_GIL_DISABLED not defined in "free-threaded" Windows C-API extensions [/+]on Dec 6, 2023
Activity
colesbury commentedon Nov 2, 2023
@zooba, I'd appreciate your feedback and suggestions about the best way to make sure that Windows C API extensions have
Py_NOGILdefined when building with the free-threaded (--disable-gil) 3.13 builds.corona10 commentedon Nov 2, 2023
I was curious about how GHA passed the test, but I noticed that it was skipped from the GHA..
https://github.com/python/cpython/actions/runs/6695685454/job/18191835485
zooba commentedon Nov 2, 2023
I think we probably need to start modifying pyconfig.h at some stage in the build process. Eventually we should get an improved sysconfig [alternative] that can include the flag, but until then I don't think we want to make modifications in every build backend that's out there, nor do we want to force them to launch the target interpreter in order to get the right settings (which prevents cross-compilation, for example).
I'm not sure how best to do it though. Probably the ideal looks like:
$(IntDir)(not back into the source tree)PC\$(OutDir)We shouldn't have to patch anything in the stdlib that finds the header, I'm pretty sure they were only in distutils. And an install layout should have it end up in the
Includedirectory if Tools/msi and PC/layout are updated.So there's a lot of moving parts, plus we need to figure out the best way to template the header so it can be modified as part of the build. There's not really anything built into our build system for this yet.
colesbury commentedon Nov 16, 2023
Hi @zooba, I started implementing this and ran into a few issues. Not having a
pyconfig.hinPCorIncludebreaks setuptools. The install layout can place the generatedpyconfig.hin the installedIncludedirectory, but you can also runpipdirectly from the CPython source directory without the installer. It seems like we'll run into fewer issues if we place the generatedpyconfig.hin thePCdirectory.pythongh-111650: Generate pyconfig.h on Windows
pythongh-111650: Generate pyconfig.h on Windows
pythongh-111650: Generate pyconfig.h on Windows
pythongh-111650: Generate pyconfig.h on Windows
pythongh-111650: Generate pyconfig.h on Windows
pythongh-111650: Generate pyconfig.h on Windows
zooba commentedon Nov 29, 2023
Left a few suggestions on the draft PR - in short:
Include\pyconfig.hoverPC\pyconfig.h, and I suspect/hope every other tool will, too.setuptoolsis definitely going to need an update of some kind here, at least for running within build directories (likely in code taken fromdistutils). Regular installs shouldn't have any issue. I think we should do the setuptools update in parallel, and not try to make their older versions work.colesbury commentedon Nov 29, 2023
POSIX places the generated
pyconfig.hin the root directory, not inInclude. Placing it inInclude/pyconfig.his would be a third location for tools to handle, breakssetuptools(and possibly other build tools), and does not get us any closer to unifying the builds.If we don't move
pyconfig.h, what update will setuptools need?Sure - I'll convert the script to Python.
1 remaining item
colesbury commentedon Dec 4, 2023
I don't know how to implement what you are asking for and I've already spent a few days on this, so I'm going to defer this and come back to it later.
zooba commentedon Dec 5, 2023
I'll get it figured out. Chances are I'm going to have to do all the integration into the release process anyway, so I may as well go end-to-end.
pythongh-111650: Ensure pyconfig.h includes PY_GIL_DISABLED on Windows
[-]Py_NOGIL not defined in "free-threaded" Windows C-API extensions [/-][+]Py_GIL_DISABLED not defined in "free-threaded" Windows C-API extensions [/+]Merge remote-tracking branch 'upstream/main' into pythongh-111650
Merge remote-tracking branch 'upstream/main' into pythongh-111650
gh-111650: Ensure pyconfig.h includes Py_GIL_DISABLED on Windows (GH-…
ambv commentedon Jan 7, 2024
Is there anything left to do here?
pythongh-111650: Ensure pyconfig.h includes Py_GIL_DISABLED on Windows (
pythongh-111650: Ensure pyconfig.h includes Py_GIL_DISABLED on Windows (
Define Py_GIL_DISABLED macro on Windows
Define Py_GIL_DISABLED macro on Windows
Define Py_GIL_DISABLED macro on Windows (#2442)