-
-
Notifications
You must be signed in to change notification settings - Fork 30.5k
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: Generate pyconfig.h on Windows #112179
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,2 @@ | ||
On Windows, ``PC\pyconfig.h`` is now generated from ``PC\pyconfig.h.in`` | ||
during the build process. |
Original file line number | Diff line number | Diff line change | ||||||||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
@@ -0,0 +1,50 @@ | ||||||||||||||||||||||||||||||||||||||||||||||||
# | ||||||||||||||||||||||||||||||||||||||||||||||||
# Generates pyconfig.h from PC\pyconfig.h.in | ||||||||||||||||||||||||||||||||||||||||||||||||
# | ||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||
param ( | ||||||||||||||||||||||||||||||||||||||||||||||||
[string[]]$define, | ||||||||||||||||||||||||||||||||||||||||||||||||
[string]$File | ||||||||||||||||||||||||||||||||||||||||||||||||
) | ||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||
$definedValues = @{} | ||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||
foreach ($arg in $define) { | ||||||||||||||||||||||||||||||||||||||||||||||||
$parts = $arg -split '=' | ||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||
if ($parts.Count -eq 1) { | ||||||||||||||||||||||||||||||||||||||||||||||||
$key = $parts[0] | ||||||||||||||||||||||||||||||||||||||||||||||||
$definedValues[$key] = "" | ||||||||||||||||||||||||||||||||||||||||||||||||
} elseif ($parts.Count -eq 2) { | ||||||||||||||||||||||||||||||||||||||||||||||||
$key = $parts[0] | ||||||||||||||||||||||||||||||||||||||||||||||||
$value = $parts[1] | ||||||||||||||||||||||||||||||||||||||||||||||||
$definedValues[$key] = $value | ||||||||||||||||||||||||||||||||||||||||||||||||
} else { | ||||||||||||||||||||||||||||||||||||||||||||||||
Write-Host "Invalid argument: $arg" | ||||||||||||||||||||||||||||||||||||||||||||||||
exit 1 | ||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||
$cpythonRoot = Split-Path $PSScriptRoot -Parent | ||||||||||||||||||||||||||||||||||||||||||||||||
$pyconfigPath = Join-Path $cpythonRoot "PC\pyconfig.h.in" | ||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||
$header = "/* pyconfig.h. Generated from PC\pyconfig.h.in by generate_pyconfig.ps1. */" | ||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||
$lines = Get-Content -Path $pyconfigPath | ||||||||||||||||||||||||||||||||||||||||||||||||
$lines = @($header) + $lines | ||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||
foreach ($i in 0..($lines.Length - 1)) { | ||||||||||||||||||||||||||||||||||||||||||||||||
if ($lines[$i] -match "^#undef (\w+)$") { | ||||||||||||||||||||||||||||||||||||||||||||||||
$key = $Matches[1] | ||||||||||||||||||||||||||||||||||||||||||||||||
if ($definedValues.ContainsKey($key)) { | ||||||||||||||||||||||||||||||||||||||||||||||||
$value = $definedValues[$key] | ||||||||||||||||||||||||||||||||||||||||||||||||
$lines[$i] = "#define $key $value".TrimEnd() | ||||||||||||||||||||||||||||||||||||||||||||||||
} else { | ||||||||||||||||||||||||||||||||||||||||||||||||
$lines[$i] = "/* #undef $key */" | ||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||
Comment on lines
+36
to
+46
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
Suggested change
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Okay, that was a bit of a self-indulgent rewrite that didn't actually make it shorter, simpler, or probably faster 😆 But if you want, we already assume that a copy of Python is available for bootstrapping on Windows (and I believe we require 3.10), so you could make this a Python script. IIRC, |
||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||
$ParentDir = Split-Path -Path $File -Parent | ||||||||||||||||||||||||||||||||||||||||||||||||
New-Item -ItemType Directory -Force -Path $ParentDir | Out-Null | ||||||||||||||||||||||||||||||||||||||||||||||||
Set-Content -Path $File -Value $lines |
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -3,6 +3,7 @@ | |
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props"/> | ||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props"/> | ||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets"/> | ||
<Import Project="python.props" /> | ||
<PropertyGroup Label="Globals"> | ||
<ProjectGuid>{CC9B93A2-439D-4058-9D29-6DCF43774405}</ProjectGuid> | ||
<Platform Condition="'$(Platform)' == ''">Win32</Platform> | ||
|
@@ -14,6 +15,7 @@ | |
<IncludeSSL Condition="'$(IncludeSSL)' == ''">true</IncludeSSL> | ||
<IncludeTkinter Condition="'$(IncludeTkinter)' == ''">true</IncludeTkinter> | ||
<IncludeUwp Condition="'$(IncludeUwp)' == ''">false</IncludeUwp> | ||
<PyConfigArgs Condition="'$(DisableGil)' == 'true'">Py_GIL_DISABLED=1,$(PyConfigArgs)</PyConfigArgs> | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Semicolon separated is the usual for MSBuild files. I know I'll think this is wrong every time I see it - can we maybe |
||
</PropertyGroup> | ||
|
||
<ItemDefinitionGroup> | ||
|
@@ -94,6 +96,11 @@ | |
<Projects2 Include="venvlauncher.vcxproj;venvwlauncher.vcxproj" /> | ||
</ItemGroup> | ||
|
||
<Target Name="PreBuild" BeforeTargets="Build"> | ||
<!-- Stick a _PLACEHOLDER=1 after $(PyConfigArgs) to handle both trailing commas and empty $(PyConfigArgs) --> | ||
<Exec Command="powershell.exe $(PySourcePath)PCbuild\generate_pyconfig.ps1 -File $(PySourcePath)PC\pyconfig.h -define $(PyConfigArgs)_PLACEHOLDER=1" /> | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Would rather have this happen in It probably also belongs in the |
||
</Target> | ||
|
||
<Target Name="Build"> | ||
<MSBuild Projects="@(FreezeProjects)" | ||
Properties="Configuration=%(Configuration);Platform=%(Platform);%(Properties)" | ||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Honestly, it's probably a better long-term move to get rid of
PC/pyconfig.h
completely and generate it inInclude
where the POSIX one would be.Eventually (though I suspect it's "likely never") we'll get a combined build system. At that point, it'll be much more sensible to have a coherent set of include files.
The code that tries to include header files in installers already assumes it can pick it up directly from a repository checkout (
Tools/msi/dev
andPC/layout
, IIRC). That will need additional logic to pick it up from somewhere else - I'd suggest the build directory$(Py_OutDir)
along with every other generated file that we include in the distribution.