Skip to content
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

gh-111650: Ensure pyconfig.h includes Py_GIL_DISABLED on Windows #112778

Merged
merged 10 commits into from
Dec 13, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
6 changes: 3 additions & 3 deletions .github/workflows/reusable-windows.yml
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ jobs:
steps:
- uses: actions/checkout@v4
- name: Build CPython
run: .\PCbuild\build.bat -e -d -p Win32 ${{ inputs.free-threaded && '--disable-gil' || '' }}
run: .\PCbuild\build.bat -e -d -v -p Win32 ${{ inputs.free-threaded && '--disable-gil' || '' }}
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Did you want to keep this?

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I don't think it slows down CI enough to be a problem.

- name: Display build info
run: .\python.bat -m test.pythoninfo
- name: Tests
Expand All @@ -33,7 +33,7 @@ jobs:
- name: Register MSVC problem matcher
run: echo "::add-matcher::.github/problem-matchers/msvc.json"
- name: Build CPython
run: .\PCbuild\build.bat -e -d -p x64 ${{ inputs.free-threaded && '--disable-gil' || '' }}
run: .\PCbuild\build.bat -e -d -v -p x64 ${{ inputs.free-threaded && '--disable-gil' || '' }}
- name: Display build info
run: .\python.bat -m test.pythoninfo
- name: Tests
Expand All @@ -50,4 +50,4 @@ jobs:
- name: Register MSVC problem matcher
run: echo "::add-matcher::.github/problem-matchers/msvc.json"
- name: Build CPython
run: .\PCbuild\build.bat -e -d -p arm64 ${{ inputs.free-threaded && '--disable-gil' || '' }}
run: .\PCbuild\build.bat -e -d -v -p arm64 ${{ inputs.free-threaded && '--disable-gil' || '' }}
11 changes: 10 additions & 1 deletion Lib/sysconfig/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -404,7 +404,16 @@ def get_config_h_filename():
"""Return the path of pyconfig.h."""
if _PYTHON_BUILD:
if os.name == "nt":
inc_dir = os.path.join(_PROJECT_BASE, "PC")
# This ought to be as simple as dirname(sys._base_executable), but
# if a venv uses symlinks to a build in the source tree, then this
# fails. So instead we guess the subdirectory name from sys.winver
if sys.winver.endswith('-32'):
arch = 'win32'
elif sys.winver.endswith('-arm64'):
arch = 'arm64'
else:
arch = 'amd64'
inc_dir = os.path.join(_PROJECT_BASE, 'PCbuild', arch)
else:
inc_dir = _PROJECT_BASE
else:
Expand Down
8 changes: 6 additions & 2 deletions Lib/test/test_sysconfig.py
Original file line number Diff line number Diff line change
Expand Up @@ -472,11 +472,15 @@ def test_srcdir(self):
# should be a full source checkout.
Python_h = os.path.join(srcdir, 'Include', 'Python.h')
self.assertTrue(os.path.exists(Python_h), Python_h)
# <srcdir>/PC/pyconfig.h always exists even if unused on POSIX.
pyconfig_h = os.path.join(srcdir, 'PC', 'pyconfig.h')
# <srcdir>/PC/pyconfig.h.in always exists even if unused
pyconfig_h = os.path.join(srcdir, 'PC', 'pyconfig.h.in')
self.assertTrue(os.path.exists(pyconfig_h), pyconfig_h)
pyconfig_h_in = os.path.join(srcdir, 'pyconfig.h.in')
self.assertTrue(os.path.exists(pyconfig_h_in), pyconfig_h_in)
if os.name == 'nt':
# <executable dir>/pyconfig.h exists on Windows in a build tree
pyconfig_h = os.path.join(sys.executable, '..', 'pyconfig.h')
self.assertTrue(os.path.exists(pyconfig_h), pyconfig_h)
elif os.name == 'posix':
makefile_dir = os.path.dirname(sysconfig.get_makefile_filename())
# Issue #19340: srcdir has been realpath'ed already
Expand Down
18 changes: 11 additions & 7 deletions Lib/test/test_venv.py
Original file line number Diff line number Diff line change
Expand Up @@ -46,14 +46,18 @@
def check_output(cmd, encoding=None):
p = subprocess.Popen(cmd,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE,
encoding=encoding)
stderr=subprocess.PIPE)
out, err = p.communicate()
if p.returncode:
if verbose and err:
print(err.decode('utf-8', 'backslashreplace'))
print(err.decode(encoding or 'utf-8', 'backslashreplace'))
raise subprocess.CalledProcessError(
p.returncode, cmd, out, err)
if encoding:
return (
out.decode(encoding, 'backslashreplace'),
err.decode(encoding, 'backslashreplace'),
)
return out, err

class BaseTest(unittest.TestCase):
Expand Down Expand Up @@ -281,8 +285,8 @@ def test_sysconfig(self):
('get_config_h_filename()', sysconfig.get_config_h_filename())):
with self.subTest(call):
cmd[2] = 'import sysconfig; print(sysconfig.%s)' % call
out, err = check_output(cmd)
self.assertEqual(out.strip(), expected.encode(), err)
out, err = check_output(cmd, encoding='utf-8')
self.assertEqual(out.strip(), expected, err)

@requireVenvCreate
@unittest.skipUnless(can_symlink(), 'Needs symlinks')
Expand All @@ -303,8 +307,8 @@ def test_sysconfig_symlinks(self):
('get_config_h_filename()', sysconfig.get_config_h_filename())):
with self.subTest(call):
cmd[2] = 'import sysconfig; print(sysconfig.%s)' % call
out, err = check_output(cmd)
self.assertEqual(out.strip(), expected.encode(), err)
out, err = check_output(cmd, encoding='utf-8')
self.assertEqual(out.strip(), expected, err)

if sys.platform == 'win32':
ENV_SUBDIRS = (
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
Ensures the ``Py_GIL_DISABLED`` preprocessor variable is defined in
:file:`pyconfig.h` so that extension modules written in C are able to use
it.
2 changes: 0 additions & 2 deletions Modules/_ctypes/_ctypes_test.c
Original file line number Diff line number Diff line change
@@ -1,6 +1,4 @@
#ifndef _MSC_VER
#include "pyconfig.h" // Py_GIL_DISABLED
#endif

#ifndef Py_GIL_DISABLED
// Need limited C API version 3.12 for Py_MOD_PER_INTERPRETER_GIL_SUPPORTED
Expand Down
2 changes: 0 additions & 2 deletions Modules/_scproxy.c
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,7 @@
* using the SystemConfiguration framework.
*/

#ifndef _MSC_VER
#include "pyconfig.h" // Py_GIL_DISABLED
#endif

#ifndef Py_GIL_DISABLED
// Need limited C API version 3.12 for Py_MOD_PER_INTERPRETER_GIL_SUPPORTED
Expand Down
2 changes: 0 additions & 2 deletions Modules/_stat.c
Original file line number Diff line number Diff line change
Expand Up @@ -11,9 +11,7 @@
*
*/

#ifndef _MSC_VER
#include "pyconfig.h" // Py_GIL_DISABLED
#endif

#ifndef Py_GIL_DISABLED
// Need limited C API version 3.13 for PyModule_Add() on Windows
Expand Down
2 changes: 0 additions & 2 deletions Modules/_testcapi/heaptype_relative.c
Original file line number Diff line number Diff line change
@@ -1,6 +1,4 @@
#ifndef _MSC_VER
#include "pyconfig.h" // Py_GIL_DISABLED
#endif

#ifndef Py_GIL_DISABLED
#define Py_LIMITED_API 0x030c0000 // 3.12
Expand Down
2 changes: 0 additions & 2 deletions Modules/_testcapi/vectorcall_limited.c
Original file line number Diff line number Diff line change
@@ -1,8 +1,6 @@
/* Test Vectorcall in the limited API */

#ifndef _MSC_VER
#include "pyconfig.h" // Py_GIL_DISABLED
#endif

#ifndef Py_GIL_DISABLED
#define Py_LIMITED_API 0x030c0000 // 3.12
Expand Down
2 changes: 0 additions & 2 deletions Modules/_testclinic_limited.c
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,7 @@
#undef Py_BUILD_CORE_MODULE
#undef Py_BUILD_CORE_BUILTIN

#ifndef _MSC_VER
#include "pyconfig.h" // Py_GIL_DISABLED
#endif

#ifndef Py_GIL_DISABLED
// For now, only limited C API 3.13 is supported
Expand Down
2 changes: 0 additions & 2 deletions Modules/_testimportmultiple.c
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,7 @@
* foo, bar), only the first one is called the same as the compiled file.
*/

#ifndef _MSC_VER
#include "pyconfig.h" // Py_GIL_DISABLED
#endif

#ifndef Py_GIL_DISABLED
#define Py_LIMITED_API 0x03020000
Expand Down
2 changes: 0 additions & 2 deletions Modules/_uuidmodule.c
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,7 @@
* DCE compatible Universally Unique Identifier library.
*/

#ifndef _MSC_VER
#include "pyconfig.h" // Py_GIL_DISABLED
#endif

#ifndef Py_GIL_DISABLED
// Need limited C API version 3.12 for Py_MOD_PER_INTERPRETER_GIL_SUPPORTED
Expand Down
2 changes: 0 additions & 2 deletions Modules/errnomodule.c
Original file line number Diff line number Diff line change
@@ -1,8 +1,6 @@
/* Errno module */

#ifndef _MSC_VER
#include "pyconfig.h" // Py_GIL_DISABLED
#endif

#ifndef Py_GIL_DISABLED
// Need limited C API version 3.12 for Py_MOD_PER_INTERPRETER_GIL_SUPPORTED
Expand Down
2 changes: 0 additions & 2 deletions Modules/resource.c
Original file line number Diff line number Diff line change
@@ -1,6 +1,4 @@
#ifndef _MSC_VER
#include "pyconfig.h" // Py_GIL_DISABLED
#endif

#ifndef Py_GIL_DISABLED
// Need limited C API version 3.13 for PySys_Audit()
Expand Down
2 changes: 0 additions & 2 deletions Modules/xxlimited.c
Original file line number Diff line number Diff line change
Expand Up @@ -62,9 +62,7 @@
pass
*/

#ifndef _MSC_VER
#include "pyconfig.h" // Py_GIL_DISABLED
#endif

#ifndef Py_GIL_DISABLED
// Need limited C API version 3.12 for Py_MOD_PER_INTERPRETER_GIL_SUPPORTED
Expand Down
2 changes: 0 additions & 2 deletions Modules/xxlimited_35.c
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,7 @@
* See the xxlimited module for an extension module template.
*/

#ifndef _MSC_VER
#include "pyconfig.h" // Py_GIL_DISABLED
#endif

#ifndef Py_GIL_DISABLED
#define Py_LIMITED_API 0x03050000
Expand Down
8 changes: 5 additions & 3 deletions PC/layout/main.py
Original file line number Diff line number Diff line change
Expand Up @@ -73,7 +73,10 @@ def copy_if_modified(src, dest):
)

if do_copy:
shutil.copy2(src, dest)
try:
shutil.copy2(src, dest)
except FileNotFoundError:
raise FileNotFoundError(src) from None


def get_lib_layout(ns):
Expand Down Expand Up @@ -208,8 +211,7 @@ def _c(d):

for dest, src in rglob(ns.source / "Include", "**/*.h"):
yield "include/{}".format(dest), src
src = ns.source / "PC" / "pyconfig.h"
yield "include/pyconfig.h", src
yield "include/pyconfig.h", ns.build / "pyconfig.h"

for dest, src in get_tcltk_lib(ns):
yield dest, src
Expand Down
3 changes: 3 additions & 0 deletions PC/pyconfig.h → PC/pyconfig.h.in
Original file line number Diff line number Diff line change
Expand Up @@ -739,4 +739,7 @@ Py_NO_ENABLE_SHARED to find out. Also support MS_NO_COREDLL for b/w compat */
/* Define if libssl has X509_VERIFY_PARAM_set1_host and related function */
#define HAVE_X509_VERIFY_PARAM_SET1_HOST 1

/* Define if you want to disable the GIL */
#undef Py_GIL_DISABLED

#endif /* !Py_CONFIG_H */
2 changes: 2 additions & 0 deletions PC/winsound.c
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,8 @@
winsound.PlaySound(None, 0)
*/

#include "pyconfig.h" // Py_GIL_DISABLED

#ifndef Py_GIL_DISABLED
// Need limited C API version 3.12 for Py_MOD_PER_INTERPRETER_GIL_SUPPORTED
#define Py_LIMITED_API 0x030c0000
Expand Down
30 changes: 30 additions & 0 deletions PCbuild/_freeze_module.vcxproj
Original file line number Diff line number Diff line change
Expand Up @@ -89,6 +89,7 @@
<ItemDefinitionGroup>
<ClCompile>
<PreprocessorDefinitions>Py_NO_ENABLE_SHARED;Py_BUILD_CORE;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<AdditionalIncludeDirectories>$(IntDir);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<Optimization>Disabled</Optimization>
<WholeProgramOptimization>false</WholeProgramOptimization>
</ClCompile>
Expand Down Expand Up @@ -257,6 +258,9 @@
<ClCompile Include="..\Python\traceback.c" />
<ClCompile Include="..\Python\tracemalloc.c" />
</ItemGroup>
<ItemGroup>
<ClInclude Include="..\PC\pyconfig.h.in" />
</ItemGroup>
<ItemGroup>
<!-- BEGIN frozen modules -->
<None Include="..\Lib\importlib\_bootstrap.py">
Expand Down Expand Up @@ -414,6 +418,32 @@
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
<ImportGroup Label="ExtensionTargets">
</ImportGroup>

<!-- Direct copy from pythoncore.vcxproj, but this one is only used for our
own build. All other extension modules will use the copy that pythoncore
generates. -->
<Target Name="_UpdatePyconfig" BeforeTargets="PrepareForBuild">
<MakeDir Directories="$(IntDir)" Condition="!Exists($(IntDir))" />
<ItemGroup>
<PyConfigH Remove="@(PyConfigH)" />
<PyConfigH Include="@(ClInclude)" Condition="'%(Filename)%(Extension)' == 'pyconfig.h.in'" />
</ItemGroup>
<Error Text="Did not find pyconfig.h" Condition="@(ClInclude) == ''" />
<PropertyGroup>
<PyConfigH>@(PyConfigH->'%(FullPath)', ';')</PyConfigH>
<PyConfigHText>$([System.IO.File]::ReadAllText($(PyConfigH)))</PyConfigHText>
<OldPyConfigH Condition="Exists('$(IntDir)pyconfig.h')">$([System.IO.File]::ReadAllText('$(IntDir)pyconfig.h'))</OldPyConfigH>
</PropertyGroup>
<PropertyGroup Condition="$(DisableGil) == 'true'">
<PyConfigHText>$(PyConfigHText.Replace('#undef Py_GIL_DISABLED', '#define Py_GIL_DISABLED 1'))</PyConfigHText>
</PropertyGroup>
<Message Text="Updating pyconfig.h" Condition="$(PyConfigHText.TrimEnd()) != $(OldPyConfigH.TrimEnd())" />
<WriteLinesToFile File="$(IntDir)pyconfig.h"
Lines="$(PyConfigHText)"
Overwrite="true"
Condition="$(PyConfigHText.TrimEnd()) != $(OldPyConfigH.TrimEnd())" />
</Target>

<Target Name="_RebuildGetPath" AfterTargets="_RebuildFrozen" Condition="$(Configuration) != 'PGUpdate'">
<Exec Command='"$(TargetPath)" "%(GetPath.ModName)" "%(GetPath.FullPath)" "%(GetPath.IntFile)"' />

Expand Down
6 changes: 4 additions & 2 deletions PCbuild/pyproject.props
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,8 @@
<Py_IntDir Condition="'$(Py_IntDir)' == ''">$(MSBuildThisFileDirectory)obj\</Py_IntDir>
<IntDir>$(Py_IntDir)\$(MajorVersionNumber)$(MinorVersionNumber)$(ArchName)_$(Configuration)\$(ProjectName)\</IntDir>
<IntDir>$(IntDir.Replace(`\\`, `\`))</IntDir>
<!-- pyconfig.h is updated by pythoncore.vcxproj, so it's always in pythoncore's IntDir -->
<GeneratedPyConfigDir>$(Py_IntDir)\$(MajorVersionNumber)$(MinorVersionNumber)$(ArchName)_$(Configuration)\pythoncore\</GeneratedPyConfigDir>
<TargetName Condition="'$(TargetName)' == ''">$(ProjectName)</TargetName>
<TargetName>$(TargetName)$(PyDebugExt)</TargetName>
<GenerateManifest>false</GenerateManifest>
Expand Down Expand Up @@ -38,9 +40,8 @@
</PropertyGroup>
<ItemDefinitionGroup>
<ClCompile>
<AdditionalIncludeDirectories>$(PySourcePath)Include;$(PySourcePath)Include\internal;$(PySourcePath)Include\internal\mimalloc;$(PySourcePath)PC;$(IntDir);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<AdditionalIncludeDirectories>$(PySourcePath)Include;$(PySourcePath)Include\internal;$(PySourcePath)Include\internal\mimalloc;$(GeneratedPyConfigDir);$(PySourcePath)PC;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<PreprocessorDefinitions>WIN32;$(_Py3NamePreprocessorDefinition);$(_PlatformPreprocessorDefinition)$(_DebugPreprocessorDefinition)$(_PydPreprocessorDefinition)%(PreprocessorDefinitions)</PreprocessorDefinitions>
<PreprocessorDefinitions Condition="'$(DisableGil)' == 'true'">Py_GIL_DISABLED=1;%(PreprocessorDefinitions)</PreprocessorDefinitions>
zooba marked this conversation as resolved.
Show resolved Hide resolved
<PreprocessorDefinitions Condition="'$(SupportPGO)' and ($(Configuration) == 'PGInstrument' or $(Configuration) == 'PGUpdate')">_Py_USING_PGO=1;%(PreprocessorDefinitions)</PreprocessorDefinitions>

<Optimization>MaxSpeed</Optimization>
Expand All @@ -60,6 +61,7 @@
<AdditionalOptions Condition="$(PlatformToolset) == 'ClangCL'">-Wno-deprecated-non-prototype -Wno-unused-label -Wno-pointer-sign -Wno-incompatible-pointer-types-discards-qualifiers -Wno-unused-function %(AdditionalOptions)</AdditionalOptions>
<AdditionalOptions Condition="$(Configuration) != 'Debug' and $(PlatformToolset) == 'ClangCL'">-flto %(AdditionalOptions)</AdditionalOptions>
<AdditionalOptions Condition="$(MSVCHasBrokenARM64Clamping) == 'true' and $(Platform) == 'ARM64'">-d2pattern-opt-disable:-932189325 %(AdditionalOptions)</AdditionalOptions>
<AdditionalOptions Condition="$(GenerateSourceDependencies) == 'true'">/sourceDependencies "$(IntDir.Trim(`\`))" %(AdditionalOptions)</AdditionalOptions>
</ClCompile>
<ClCompile Condition="$(Configuration) == 'Debug'">
<InlineFunctionExpansion>OnlyExplicitInline</InlineFunctionExpansion>
Expand Down
31 changes: 30 additions & 1 deletion PCbuild/pythoncore.vcxproj
Original file line number Diff line number Diff line change
Expand Up @@ -377,7 +377,7 @@
<ClInclude Include="..\Parser\string_parser.h" />
<ClInclude Include="..\Parser\pegen.h" />
<ClInclude Include="..\PC\errmap.h" />
<ClInclude Include="..\PC\pyconfig.h" />
<ClInclude Include="..\PC\pyconfig.h.in" />
<ClInclude Include="..\Python\condvar.h" />
<ClInclude Include="..\Python\stdlib_module_names.h" />
<ClInclude Include="..\Python\thread_nt.h" />
Expand Down Expand Up @@ -644,6 +644,35 @@
<Import Project="regen.targets" />
</ImportGroup>
<Target Name="_TriggerRegen" BeforeTargets="PrepareForBuild" DependsOnTargets="Regen" />

<Target Name="_UpdatePyconfig" BeforeTargets="PrepareForBuild">
<MakeDir Directories="$(IntDir)" Condition="!Exists($(IntDir))" />
<ItemGroup>
<PyConfigH Remove="@(PyConfigH)" />
<PyConfigH Include="@(ClInclude)" Condition="'%(Filename)%(Extension)' == 'pyconfig.h.in'" />
</ItemGroup>
<Error Text="Did not find pyconfig.h" Condition="@(ClInclude) == ''" />
<PropertyGroup>
<PyConfigH>@(PyConfigH->'%(FullPath)', ';')</PyConfigH>
<PyConfigHText>$([System.IO.File]::ReadAllText($(PyConfigH)))</PyConfigHText>
<OldPyConfigH Condition="Exists('$(IntDir)pyconfig.h')">$([System.IO.File]::ReadAllText('$(IntDir)pyconfig.h'))</OldPyConfigH>
</PropertyGroup>
<PropertyGroup Condition="$(DisableGil) == 'true'">
<PyConfigHText>$(PyConfigHText.Replace('#undef Py_GIL_DISABLED', '#define Py_GIL_DISABLED 1'))</PyConfigHText>
</PropertyGroup>
<Message Text="Updating pyconfig.h" Condition="$(PyConfigHText.TrimEnd()) != $(OldPyConfigH.TrimEnd())" />
<WriteLinesToFile File="$(IntDir)pyconfig.h"
Lines="$(PyConfigHText)"
Overwrite="true"
Condition="$(PyConfigHText.TrimEnd()) != $(OldPyConfigH.TrimEnd())" />
</Target>
<Target Name="_CopyPyconfig" Inputs="$(IntDir)pyconfig.h" Outputs="$(OutDir)pyconfig.h" AfterTargets="Build" DependsOnTargets="_UpdatePyconfig">
<Copy SourceFiles="$(IntDir)pyconfig.h" DestinationFolder="$(OutDir)" />
</Target>
<Target Name="_CleanPyconfig" AfterTargets="Clean">
<Delete Files="$(IntDir)pyconfig.h;$(OutDir)pyconfig.h" />
</Target>

<Target Name="_GetBuildInfo" BeforeTargets="PrepareForBuild">
<PropertyGroup>
<GIT Condition="$(GIT) == ''">git</GIT>
Expand Down
2 changes: 1 addition & 1 deletion Tools/msi/dev/dev_files.wxs
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
<Fragment>
<ComponentGroup Id="dev_pyconfig">
<Component Id="include_pyconfig.h" Directory="include" Guid="*">
<File Id="include_pyconfig.h" Name="pyconfig.h" Source="!(bindpath.src)PC\pyconfig.h" KeyPath="yes" />
<File Id="include_pyconfig.h" Name="pyconfig.h" Source="pyconfig.h" KeyPath="yes" />
</Component>
</ComponentGroup>
</Fragment>
Expand Down
4 changes: 4 additions & 0 deletions Tools/peg_generator/pegen/build.py
Original file line number Diff line number Diff line change
Expand Up @@ -143,6 +143,10 @@ def compile_c_extension(
str(MOD_DIR.parent.parent.parent / "Parser" / "lexer"),
str(MOD_DIR.parent.parent.parent / "Parser" / "tokenizer"),
]
if sys.platform == "win32":
# HACK: The location of pyconfig.h has moved within our build, and
# setuptools hasn't updated for it yet. So add the path manually for now
include_dirs.append(pathlib.Path(sysconfig.get_config_h_filename()).parent)
extension = Extension(
extension_name,
sources=[generated_source_path],
Expand Down
Loading