diff --git a/utils/build.ps1 b/utils/build.ps1 index 2193bc386ec25..67f971dfdbe68 100644 --- a/utils/build.ps1 +++ b/utils/build.ps1 @@ -139,7 +139,7 @@ param [ValidateSet("Asserts", "NoAsserts")] [string] $PinnedToolchainVariant = "Asserts", [ValidatePattern('^\d+(\.\d+)*$')] - [string] $PythonVersion = "3.9.10", + [string] $PythonVersion = "3.10.1", [ValidatePattern("^r(?:[1-9]|[1-9][0-9])(?:[a-z])?$")] [string] $AndroidNDKVersion = "r27c", [ValidatePattern("^\d+\.\d+\.\d+(?:-\w+)?")] @@ -348,7 +348,25 @@ $KnownPythons = @{ URL = "https://www.nuget.org/api/v2/package/pythonarm64/3.9.10"; SHA256 = "429ada77e7f30e4bd8ff22953a1f35f98b2728e84c9b1d006712561785641f69"; }; - } + }; + "3.10.1" = @{ + AMD64 = @{ + 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"; + }; + }; } $PythonWheels = @{ @@ -527,6 +545,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") } @@ -535,6 +557,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-InstallDir([Hashtable] $Platform) { if ($Platform -eq $HostPlatform) { return [IO.Path]::Combine("$ImageRoot\", "Program Files", "Swift") @@ -852,6 +878,10 @@ function Invoke-VsDevShell([Hashtable] $Platform) { } } +function Get-PythonLibName() { + return "python{0}{1}" -f ([System.Version]$PythonVersion).Major, ([System.Version]$PythonVersion).Minor +} + function Get-Dependencies { Write-Host "[$([DateTime]::Now.ToString("yyyy-MM-dd HH:mm:ss"))] Fetch-Dependencies ..." -ForegroundColor Cyan $ProgressPreference = "SilentlyContinue" @@ -967,18 +997,21 @@ function Get-Dependencies { New-Item -ItemType Directory -ErrorAction Ignore $BinaryCache\toolchains | Out-Null Export-Toolchain "$PinnedToolchain.exe" $BinaryCache $PinnedToolchain - function Get-KnownPython([string] $ArchName) { + function Get-KnownPython([string] $ArchName, [bool] $EmbeddedPython = $false) { if (-not $KnownPythons.ContainsKey($PythonVersion)) { throw "Unknown python version: $PythonVersion" } - return $KnownPythons[$PythonVersion].$ArchName + $Key = $(if ($EmbeddedPython) { "${ArchName}_Embedded" } else { $ArchName }) + return $KnownPythons[$PythonVersion][$Key] } - function Install-Python([string] $ArchName) { - $Python = Get-KnownPython $ArchName - DownloadAndVerify $Python.URL "$BinaryCache\Python$ArchName-$PythonVersion.zip" $Python.SHA256 + function Install-Python([string] $ArchName, [bool] $EmbeddedPython = $false) { + $Python = Get-KnownPython $ArchName $EmbeddedPython + $FileName = $(if ($EmbeddedPython) { "EmbeddedPython$ArchName-$PythonVersion" } else { "Python$ArchName-$PythonVersion" }) + DownloadAndVerify $Python.URL "$BinaryCache\$FileName.zip" $Python.SHA256 if (-not $ToBatch) { - Expand-ZipFile Python$ArchName-$PythonVersion.zip "$BinaryCache" Python$ArchName-$PythonVersion + Expand-ZipFile "$FileName.zip" "$BinaryCache" "$FileName" + Write-Output "$ArchName Python $PythonVersion installed." } } @@ -1017,12 +1050,13 @@ function Get-Dependencies { } } + # Ensure Python modules that are required as host build tools Install-Python $HostArchName + Install-Python $HostArchName $true if ($IsCrossCompiling) { Install-Python $BuildArchName + Install-Python $BuildArchName $true } - - # Ensure Python modules that are required as host build tools Install-PythonModules if ($Android) { @@ -1706,7 +1740,7 @@ function Load-LitTestOverrides($Filename) { function Get-CompilersDefines([Hashtable] $Platform, [switch] $Test) { $BuildTools = [IO.Path]::Combine((Get-ProjectBinaryCache $BuildPlatform BuildTools), "bin") $PythonRoot = [IO.Path]::Combine((Get-PythonPath $Platform), "tools") - $PythonLibName = "python{0}{1}" -f ([System.Version]$PythonVersion).Major, ([System.Version]$PythonVersion).Minor + $PythonLibName = Get-PythonLibName $TestDefines = if ($Test) { @{ @@ -1745,6 +1779,7 @@ function Get-CompilersDefines([Hashtable] $Platform, [switch] $Test) { 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/usr/bin"; 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"); @@ -1758,6 +1793,7 @@ function Get-CompilersDefines([Hashtable] $Platform, [switch] $Test) { 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); @@ -3072,8 +3108,18 @@ function Install-HostToolchain() { # Switch to swift-driver $SwiftDriver = ([IO.Path]::Combine((Get-ProjectBinaryCache $HostPlatform Driver), "bin", "swift-driver.exe")) - Copy-Item -Force $SwiftDriver "$($HostPlatform.ToolchainInstallRoot)\usr\bin\swift.exe" - Copy-Item -Force $SwiftDriver "$($HostPlatform.ToolchainInstallRoot)\usr\bin\swiftc.exe" + Copy-Item -Force ` + -Path $SwiftDriver ` + -Destination "$($HostPlatform.ToolchainInstallRoot)\usr\bin\swift.exe" + 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) { @@ -3146,6 +3192,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 {