summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSteve Dower <steve.dower@python.org>2023-12-13 15:38:45 (GMT)
committerGitHub <noreply@github.com>2023-12-13 15:38:45 (GMT)
commit79dad03747fe17634136209f1bcaf346a8c10617 (patch)
tree0ca624c64faee7dba75917b1483ab9318c2676f5
parent498a096a51a215cd3084845131e619222b906b3e (diff)
downloadcpython-79dad03747fe17634136209f1bcaf346a8c10617.zip
cpython-79dad03747fe17634136209f1bcaf346a8c10617.tar.gz
cpython-79dad03747fe17634136209f1bcaf346a8c10617.tar.bz2
gh-111650: Ensure pyconfig.h includes Py_GIL_DISABLED on Windows (GH-112778)
-rw-r--r--.github/workflows/reusable-windows.yml6
-rw-r--r--Lib/sysconfig/__init__.py11
-rw-r--r--Lib/test/test_sysconfig.py8
-rw-r--r--Lib/test/test_venv.py18
-rw-r--r--Misc/NEWS.d/next/Windows/2023-12-05-22-56-30.gh-issue-111650.xlWmvM.rst3
-rw-r--r--Modules/_ctypes/_ctypes_test.c2
-rw-r--r--Modules/_scproxy.c2
-rw-r--r--Modules/_stat.c2
-rw-r--r--Modules/_testcapi/heaptype_relative.c2
-rw-r--r--Modules/_testcapi/vectorcall_limited.c2
-rw-r--r--Modules/_testclinic_limited.c2
-rw-r--r--Modules/_testimportmultiple.c2
-rw-r--r--Modules/_uuidmodule.c2
-rw-r--r--Modules/errnomodule.c2
-rw-r--r--Modules/resource.c2
-rw-r--r--Modules/xxlimited.c2
-rw-r--r--Modules/xxlimited_35.c2
-rw-r--r--PC/layout/main.py8
-rw-r--r--PC/pyconfig.h.in (renamed from PC/pyconfig.h)3
-rw-r--r--PC/winsound.c2
-rw-r--r--PCbuild/_freeze_module.vcxproj30
-rw-r--r--PCbuild/pyproject.props6
-rw-r--r--PCbuild/pythoncore.vcxproj31
-rw-r--r--Tools/msi/dev/dev_files.wxs2
-rw-r--r--Tools/peg_generator/pegen/build.py4
25 files changed, 112 insertions, 44 deletions
diff --git a/.github/workflows/reusable-windows.yml b/.github/workflows/reusable-windows.yml
index 29e0a7e..47a3c10 100644
--- a/.github/workflows/reusable-windows.yml
+++ b/.github/workflows/reusable-windows.yml
@@ -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' || '' }}
- name: Display build info
run: .\python.bat -m test.pythoninfo
- name: Tests
@@ -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
@@ -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' || '' }}
diff --git a/Lib/sysconfig/__init__.py b/Lib/sysconfig/__init__.py
index 2a7fa45..c60c9f3 100644
--- a/Lib/sysconfig/__init__.py
+++ b/Lib/sysconfig/__init__.py
@@ -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:
diff --git a/Lib/test/test_sysconfig.py b/Lib/test/test_sysconfig.py
index 2a6813f..a19c04b 100644
--- a/Lib/test/test_sysconfig.py
+++ b/Lib/test/test_sysconfig.py
@@ -472,11 +472,15 @@ class TestSysConfig(unittest.TestCase):
# 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
diff --git a/Lib/test/test_venv.py b/Lib/test/test_venv.py
index 890672c..617d14d 100644
--- a/Lib/test/test_venv.py
+++ b/Lib/test/test_venv.py
@@ -46,14 +46,18 @@ if is_emscripten or is_wasi:
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):
@@ -281,8 +285,8 @@ class BasicTest(BaseTest):
('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')
@@ -303,8 +307,8 @@ class BasicTest(BaseTest):
('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 = (
diff --git a/Misc/NEWS.d/next/Windows/2023-12-05-22-56-30.gh-issue-111650.xlWmvM.rst b/Misc/NEWS.d/next/Windows/2023-12-05-22-56-30.gh-issue-111650.xlWmvM.rst
new file mode 100644
index 0000000..5a34933
--- /dev/null
+++ b/Misc/NEWS.d/next/Windows/2023-12-05-22-56-30.gh-issue-111650.xlWmvM.rst
@@ -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.
diff --git a/Modules/_ctypes/_ctypes_test.c b/Modules/_ctypes/_ctypes_test.c
index fc9fc13..2681b9c 100644
--- a/Modules/_ctypes/_ctypes_test.c
+++ b/Modules/_ctypes/_ctypes_test.c
@@ -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
diff --git a/Modules/_scproxy.c b/Modules/_scproxy.c
index 7920d2c..fe82e91 100644
--- a/Modules/_scproxy.c
+++ b/Modules/_scproxy.c
@@ -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
diff --git a/Modules/_stat.c b/Modules/_stat.c
index 1ef1e97..80f8a92 100644
--- a/Modules/_stat.c
+++ b/Modules/_stat.c
@@ -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
diff --git a/Modules/_testcapi/heaptype_relative.c b/Modules/_testcapi/heaptype_relative.c
index 52286f0..52bda75 100644
--- a/Modules/_testcapi/heaptype_relative.c
+++ b/Modules/_testcapi/heaptype_relative.c
@@ -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
diff --git a/Modules/_testcapi/vectorcall_limited.c b/Modules/_testcapi/vectorcall_limited.c
index 0a650f1..d7b8d33 100644
--- a/Modules/_testcapi/vectorcall_limited.c
+++ b/Modules/_testcapi/vectorcall_limited.c
@@ -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
diff --git a/Modules/_testclinic_limited.c b/Modules/_testclinic_limited.c
index 61bc841..ef595be 100644
--- a/Modules/_testclinic_limited.c
+++ b/Modules/_testclinic_limited.c
@@ -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
diff --git a/Modules/_testimportmultiple.c b/Modules/_testimportmultiple.c
index 245e81b..7e6556a 100644
--- a/Modules/_testimportmultiple.c
+++ b/Modules/_testimportmultiple.c
@@ -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
diff --git a/Modules/_uuidmodule.c b/Modules/_uuidmodule.c
index d8b211c..4b6852c 100644
--- a/Modules/_uuidmodule.c
+++ b/Modules/_uuidmodule.c
@@ -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
diff --git a/Modules/errnomodule.c b/Modules/errnomodule.c
index 8287edb..1100e9f 100644
--- a/Modules/errnomodule.c
+++ b/Modules/errnomodule.c
@@ -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
diff --git a/Modules/resource.c b/Modules/resource.c
index a4b8f64..19020b8 100644
--- a/Modules/resource.c
+++ b/Modules/resource.c
@@ -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()
diff --git a/Modules/xxlimited.c b/Modules/xxlimited.c
index 19f6121..0bb5e12 100644
--- a/Modules/xxlimited.c
+++ b/Modules/xxlimited.c
@@ -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
diff --git a/Modules/xxlimited_35.c b/Modules/xxlimited_35.c
index 867820a..754a368 100644
--- a/Modules/xxlimited_35.c
+++ b/Modules/xxlimited_35.c
@@ -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
diff --git a/PC/layout/main.py b/PC/layout/main.py
index cb2e487..accfd51 100644
--- a/PC/layout/main.py
+++ b/PC/layout/main.py
@@ -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):
@@ -208,8 +211,7 @@ def get_layout(ns):
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
diff --git a/PC/pyconfig.h b/PC/pyconfig.h.in
index e6b368c..d8f0a6b 100644
--- a/PC/pyconfig.h
+++ b/PC/pyconfig.h.in
@@ -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 */
diff --git a/PC/winsound.c b/PC/winsound.c
index b0e416c..7e4ebd9 100644
--- a/PC/winsound.c
+++ b/PC/winsound.c
@@ -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
diff --git a/PCbuild/_freeze_module.vcxproj b/PCbuild/_freeze_module.vcxproj
index a1c37e1..f8c5faf 100644
--- a/PCbuild/_freeze_module.vcxproj
+++ b/PCbuild/_freeze_module.vcxproj
@@ -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>
@@ -258,6 +259,9 @@
<ClCompile Include="..\Python\tracemalloc.c" />
</ItemGroup>
<ItemGroup>
+ <ClInclude Include="..\PC\pyconfig.h.in" />
+ </ItemGroup>
+ <ItemGroup>
<!-- BEGIN frozen modules -->
<None Include="..\Lib\importlib\_bootstrap.py">
<ModName>importlib._bootstrap</ModName>
@@ -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)"' />
diff --git a/PCbuild/pyproject.props b/PCbuild/pyproject.props
index 0acc704..68c0550 100644
--- a/PCbuild/pyproject.props
+++ b/PCbuild/pyproject.props
@@ -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>
@@ -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>
<PreprocessorDefinitions Condition="'$(SupportPGO)' and ($(Configuration) == 'PGInstrument' or $(Configuration) == 'PGUpdate')">_Py_USING_PGO=1;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<Optimization>MaxSpeed</Optimization>
@@ -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>
diff --git a/PCbuild/pythoncore.vcxproj b/PCbuild/pythoncore.vcxproj
index 778fc83..90aa8cf 100644
--- a/PCbuild/pythoncore.vcxproj
+++ b/PCbuild/pythoncore.vcxproj
@@ -378,7 +378,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" />
@@ -646,6 +646,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>
diff --git a/Tools/msi/dev/dev_files.wxs b/Tools/msi/dev/dev_files.wxs
index 21f9c84..4357dc8 100644
--- a/Tools/msi/dev/dev_files.wxs
+++ b/Tools/msi/dev/dev_files.wxs
@@ -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>
diff --git a/Tools/peg_generator/pegen/build.py b/Tools/peg_generator/pegen/build.py
index 30bfb31..7df39a3 100644
--- a/Tools/peg_generator/pegen/build.py
+++ b/Tools/peg_generator/pegen/build.py
@@ -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],