From a83efe59700a0fb133e03f01ed348795b8ff706c Mon Sep 17 00:00:00 2001 From: Charles Zablit Date: Mon, 6 Oct 2025 16:50:29 +0100 Subject: [PATCH] [windows] add Embeddable Python to build.ps1 --- utils/build.ps1 | 52 +++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 50 insertions(+), 2 deletions(-) diff --git a/utils/build.ps1 b/utils/build.ps1 index e6efe8baa2a46..bc23a530a5880 100644 --- a/utils/build.ps1 +++ b/utils/build.ps1 @@ -413,11 +413,19 @@ $KnownPythons = @{ URL = "https://www.nuget.org/api/v2/package/python/3.10.1"; SHA256 = "987a0e446d68900f58297bc47dc7a235ee4640a49dace58bc9f573797d3a8b33"; }; + AMD64_Embedded = @{ + URL = "https://www.python.org/ftp/python/3.10.1/python-3.10.1-embed-amd64.zip"; + SHA256 = "502670dcdff0083847abf6a33f30be666594e7e5201cd6fccd4a523b577403de"; + }; ARM64 = @{ URL = "https://www.nuget.org/api/v2/package/pythonarm64/3.10.1"; SHA256 = "16becfccedf1269ff0b8695a13c64fac2102a524d66cecf69a8f9229a43b10d3"; }; - }; + ARM64_Embedded = @{ + URL = "https://www.python.org/ftp/python/3.10.1/python-3.10.1-embed-arm64.zip"; + SHA256 = "1f9e215fe4e8f22a8e8fba1859efb1426437044fb3103ce85794630e3b511bc2"; + }; + } } $PythonModules = @{ @@ -741,6 +749,10 @@ function Get-PythonPath([Hashtable] $Platform) { return [IO.Path]::Combine("$BinaryCache\", "Python$($Platform.Architecture.CMakeName)-$PythonVersion") } +function Get-EmbeddedPythonPath([Hashtable] $Platform) { + return [IO.Path]::Combine("$BinaryCache\", "EmbeddedPython$($Platform.Architecture.CMakeName)-$PythonVersion") +} + function Get-PythonExecutable { return [IO.Path]::Combine((Get-PythonPath $BuildPlatform), "tools", "python.exe") } @@ -749,6 +761,10 @@ function Get-PythonScriptsPath { return [IO.Path]::Combine((Get-PythonPath $BuildPlatform), "tools", "Scripts") } +function Get-EmbeddedPythonInstallDir() { + return [IO.Path]::Combine("$ImageRoot\", "Program Files", "Swift", "Python-$PythonVersion") +} + function Get-Syft { return $KnownSyft[$SyftVersion][$BuildArchName] } @@ -1250,11 +1266,33 @@ function Get-Dependencies { return $KnownPythons[$PythonVersion].$ArchName } + function Get-KnownEmbeddedPython([string] $ArchName) { + if (-not $KnownPythons.ContainsKey($PythonVersion)) { + throw "Unknown python version: $PythonVersion" + } + if (-not $KnownPythons[$PythonVersion].ContainsKey("${ArchName}_Embedded")) { + return $null + } + return $KnownPythons[$PythonVersion]["${ArchName}_Embedded"] + } + function Install-Python([string] $ArchName) { $Python = Get-KnownPython $ArchName DownloadAndVerify $Python.URL "$BinaryCache\Python$ArchName-$PythonVersion.zip" $Python.SHA256 if (-not $ToBatch) { - Expand-ZipFile Python$ArchName-$PythonVersion.zip "$BinaryCache" Python$ArchName-$PythonVersion + Expand-ZipFile "Python$ArchName-$PythonVersion.zip" "$BinaryCache" "Python$ArchName-$PythonVersion" + } + } + + function Install-EmbeddedPython([string] $ArchName) { + $Python = Get-KnownEmbeddedPython $ArchName + if ($null -eq $Python) { + Write-Output "Python $PythonVersion does not have an embeddable version." + return + } + DownloadAndVerify $Python.URL "$BinaryCache\EmbeddedPython$ArchName-$PythonVersion.zip" $Python.SHA256 + if (-not $ToBatch) { + Expand-ZipFile "EmbeddedPython$ArchName-$PythonVersion.zip" "$BinaryCache" "EmbeddedPython$ArchName-$PythonVersion" } } @@ -1305,6 +1343,7 @@ function Get-Dependencies { } Install-Python $HostArchName + Install-EmbeddedPython $HostArchName if ($IsCrossCompiling) { Install-Python $BuildArchName } @@ -2163,6 +2202,7 @@ function Get-CompilersDefines([Hashtable] $Platform, [string] $Variant, [switch] LLDB_PYTHON_EXE_RELATIVE_PATH = "python.exe"; LLDB_PYTHON_EXT_SUFFIX = ".pyd"; LLDB_PYTHON_RELATIVE_PATH = "lib/site-packages"; + LLDB_PYTHON_DLL_RELATIVE_PATH = "../../../../Python-$PythonVersion"; LLDB_TABLEGEN = (Join-Path -Path $BuildTools -ChildPath "lldb-tblgen.exe"); LLDB_TEST_MAKE = "$BinaryCache\GnuWin32Make-4.4.1\bin\make.exe"; LLVM_CONFIG_PATH = (Join-Path -Path $BuildTools -ChildPath "llvm-config.exe"); @@ -2187,6 +2227,7 @@ function Get-CompilersDefines([Hashtable] $Platform, [string] $Variant, [switch] Python3_INCLUDE_DIR = "$PythonRoot\include"; Python3_LIBRARY = "$PythonRoot\libs\$PythonLibName.lib"; Python3_ROOT_DIR = $PythonRoot; + Python3_VERSION = $PythonVersion; SWIFT_TOOLCHAIN_VERSION = "${ToolchainIdentifier}"; SWIFT_BUILD_SWIFT_SYNTAX = "YES"; SWIFT_CLANG_LOCATION = (Get-PinnedToolchainToolsDir); @@ -3831,6 +3872,12 @@ function Install-HostToolchain() { Copy-Item -Force ` -Path $SwiftDriver ` -Destination "$($HostPlatform.ToolchainInstallRoot)\usr\bin\swiftc.exe" + + # Copy embeddable Python + New-Item -Type Directory -Path "$(Get-EmbeddedPythonInstallDir)" -ErrorAction Ignore | Out-Null + Copy-Item -Force -Recurse ` + -Path "$(Get-EmbeddedPythonPath $HostPlatform)\*" ` + -Destination "$(Get-EmbeddedPythonInstallDir)" } function Build-Inspect([Hashtable] $Platform) { @@ -3903,6 +3950,7 @@ function Build-Installer([Hashtable] $Platform) { INCLUDE_SWIFT_DOCC = $INCLUDE_SWIFT_DOCC; SWIFT_DOCC_BUILD = "$(Get-ProjectBinaryCache $HostPlatform DocC)\release"; SWIFT_DOCC_RENDER_ARTIFACT_ROOT = "${SourceCache}\swift-docc-render-artifact"; + PythonVersion = $PythonVersion } Invoke-IsolatingEnvVars {