aboutsummaryrefslogtreecommitdiff
path: root/scripts/bootstrap.ps1
diff options
context:
space:
mode:
authorBilly O'Neal <bion@microsoft.com>2021-02-04 10:15:44 -0800
committerGitHub <noreply@github.com>2021-02-04 10:15:44 -0800
commitaa60b7efa56a83ead743718941d8b320ef4a05af (patch)
treedb9f9ebd6fa37598b2f5f2ad564eb858cdeddcb0 /scripts/bootstrap.ps1
parentf226416d2eafc495dd03572cb61542fb1670ffdc (diff)
downloadvcpkg-aa60b7efa56a83ead743718941d8b320ef4a05af.tar.gz
vcpkg-aa60b7efa56a83ead743718941d8b320ef4a05af.zip
[vcpkg] Download vcpkg.exe rather than building it in bootstrap on Windows. (#15474)
This reduces bootstrap cost for Windows customers, resolving the issue initially submitted as #12502 . The `toolsrc` tree was extracted to https://github.com/microsoft/vcpkg-tool. `bootstrap.sh` was changed to download the right source tarball, extract, and build it. This was chosen over the previous attempt, a submodule, over concerns of accidentally destroying people's local modifications.
Diffstat (limited to 'scripts/bootstrap.ps1')
-rw-r--r--scripts/bootstrap.ps1401
1 files changed, 18 insertions, 383 deletions
diff --git a/scripts/bootstrap.ps1 b/scripts/bootstrap.ps1
index b4c6295c0..e4153aad4 100644
--- a/scripts/bootstrap.ps1
+++ b/scripts/bootstrap.ps1
@@ -1,10 +1,10 @@
[CmdletBinding()]
param(
$badParam,
- [Parameter(Mandatory=$False)][switch]$disableMetrics = $false,
[Parameter(Mandatory=$False)][switch]$win64 = $false,
[Parameter(Mandatory=$False)][string]$withVSPath = "",
- [Parameter(Mandatory=$False)][string]$withWinSDK = ""
+ [Parameter(Mandatory=$False)][string]$withWinSDK = "",
+ [Parameter(Mandatory=$False)][switch]$disableMetrics = $false
)
Set-StrictMode -Version Latest
# Powershell2-compatible way of forcing named-parameters
@@ -12,407 +12,48 @@ if ($badParam)
{
if ($disableMetrics -and $badParam -eq "1")
{
- Write-Warning "'disableMetrics 1' is deprecated, please change to 'disableMetrics' (without '1')"
+ Write-Warning "'disableMetrics 1' is deprecated, please change to 'disableMetrics' (without '1')."
}
else
{
- throw "Only named parameters are allowed"
+ throw "Only named parameters are allowed."
}
}
-$scriptsDir = split-path -parent $script:MyInvocation.MyCommand.Definition
-$withVSPath = $withVSPath -replace "\\$" # Remove potential trailing backslash
-
-function vcpkgHasProperty([Parameter(Mandatory=$true)][AllowNull()]$object, [Parameter(Mandatory=$true)]$propertyName)
+if ($win64)
{
- if ($null -eq $object)
- {
- return $false
- }
-
- return [bool]($object.psobject.Properties | Where-Object { $_.Name -eq "$propertyName"})
+ Write-Warning "-win64 no longer has any effect; ignored."
}
-function getProgramFiles32bit()
+if (-Not [string]::IsNullOrWhiteSpace($withVSPath))
{
- $out = ${env:PROGRAMFILES(X86)}
- if ($null -eq $out)
- {
- $out = ${env:PROGRAMFILES}
- }
-
- if ($null -eq $out)
- {
- throw "Could not find [Program Files 32-bit]"
- }
+ Write-Warning "-withVSPath no longer has any effect; ignored."
+}
- return $out
+if (-Not [string]::IsNullOrWhiteSpace($withWinSDK))
+{
+ Write-Warning "-withWinSDK no longer has any effect; ignored."
}
+$scriptsDir = split-path -parent $script:MyInvocation.MyCommand.Definition
$vcpkgRootDir = $scriptsDir
while (!($vcpkgRootDir -eq "") -and !(Test-Path "$vcpkgRootDir\.vcpkg-root"))
{
Write-Verbose "Examining $vcpkgRootDir for .vcpkg-root"
$vcpkgRootDir = Split-path $vcpkgRootDir -Parent
}
-Write-Verbose "Examining $vcpkgRootDir for .vcpkg-root - Found"
-
-$vcpkgBootstrapPath = "$vcpkgRootDir\toolsrc\windows-bootstrap"
-
-if (-not (Test-Path $vcpkgBootstrapPath))
-{
- Write-Error "Unable to determine vcpkg build directory. '$vcpkgBootstrapPath' does not exist."
- throw
-}
-
-function getVisualStudioInstances()
-{
- $programFiles = getProgramFiles32bit
- $results = New-Object System.Collections.ArrayList
- $vswhereExe = "$programFiles\Microsoft Visual Studio\Installer\vswhere.exe"
- if (Test-Path $vswhereExe)
- {
- $output = & $vswhereExe -prerelease -legacy -products * -format xml
- [xml]$asXml = $output
-
- foreach ($instance in $asXml.instances.instance)
- {
- $installationPath = $instance.InstallationPath -replace "\\$" # Remove potential trailing backslash
- $installationVersion = $instance.InstallationVersion
-
- $isPrerelease = -7
- if (vcpkgHasProperty -object $instance -propertyName "isPrerelease")
- {
- $isPrerelease = $instance.isPrerelease
- }
-
- if ($isPrerelease -eq 0)
- {
- $releaseType = "PreferenceWeight3::StableRelease"
- }
- elseif ($isPrerelease -eq 1)
- {
- $releaseType = "PreferenceWeight2::PreRelease"
- }
- else
- {
- $releaseType = "PreferenceWeight1::Legacy"
- }
-
- # Placed like that for easy sorting according to preference
- $results.Add("${releaseType}::${installationVersion}::${installationPath}") > $null
- }
- }
- else
- {
- Write-Verbose "Could not locate vswhere at $vswhereExe"
- }
-
- if ("$env:vs140comntools" -ne "")
- {
- $installationPath = Split-Path -Parent $(Split-Path -Parent "$env:vs140comntools")
- $clExe = "$installationPath\VC\bin\cl.exe"
- $vcvarsallbat = "$installationPath\VC\vcvarsall.bat"
-
- if ((Test-Path $clExe) -And (Test-Path $vcvarsallbat))
- {
- $results.Add("PreferenceWeight1::Legacy::14.0::$installationPath") > $null
- }
- }
-
- $installationPath = "$programFiles\Microsoft Visual Studio 14.0"
- $clExe = "$installationPath\VC\bin\cl.exe"
- $vcvarsallbat = "$installationPath\VC\vcvarsall.bat"
-
- if ((Test-Path $clExe) -And (Test-Path $vcvarsallbat))
- {
- $results.Add("PreferenceWeight1::Legacy::14.0::$installationPath") > $null
- }
-
- $results.Sort()
- $results.Reverse()
-
- return $results
-}
-
-function findAnyMSBuildWithCppPlatformToolset([string]$withVSPath)
-{
- $VisualStudioInstances = getVisualStudioInstances
- if ($null -eq $VisualStudioInstances)
- {
- throw "Could not find Visual Studio. VS2015, VS2017, or VS2019 (with C++) needs to be installed."
- }
-
- Write-Verbose "VS Candidates:`n`r$([system.String]::Join([Environment]::NewLine, $VisualStudioInstances))"
- foreach ($instanceCandidate in $VisualStudioInstances)
- {
- Write-Verbose "Inspecting: $instanceCandidate"
- $split = $instanceCandidate -split "::"
- # $preferenceWeight = $split[0]
- # $releaseType = $split[1]
- $version = $split[2]
- $path = $split[3]
-
- if ($withVSPath -ne "" -and $withVSPath -ne $path)
- {
- Write-Verbose "Skipping: $instanceCandidate"
- continue
- }
-
- $majorVersion = $version.Substring(0,2);
- if ($majorVersion -eq "16")
- {
- $VCFolder= "$path\VC\Tools\MSVC\"
- if (Test-Path $VCFolder)
- {
- Write-Verbose "Picking: $instanceCandidate"
- return "$path\MSBuild\Current\Bin\MSBuild.exe", "v142"
- }
- }
-
- if ($majorVersion -eq "15")
- {
- $VCFolder= "$path\VC\Tools\MSVC\"
- if (Test-Path $VCFolder)
- {
- Write-Verbose "Picking: $instanceCandidate"
- return "$path\MSBuild\15.0\Bin\MSBuild.exe", "v141"
- }
- }
-
- if ($majorVersion -eq "14")
- {
- $clExe= "$path\VC\bin\cl.exe"
- if (Test-Path $clExe)
- {
- Write-Verbose "Picking: $instanceCandidate"
- $programFilesPath = getProgramFiles32bit
- return "$programFilesPath\MSBuild\14.0\Bin\MSBuild.exe", "v140"
- }
- }
- }
-
- throw "Could not find MSBuild version with C++ support. VS2015, VS2017, or VS2019 (with C++) needs to be installed."
-}
-function getWindowsSDK( [Parameter(Mandatory=$False)][switch]$DisableWin10SDK = $False,
- [Parameter(Mandatory=$False)][switch]$DisableWin81SDK = $False,
- [Parameter(Mandatory=$False)][string]$withWinSDK)
-{
- if ($DisableWin10SDK -and $DisableWin81SDK)
- {
- throw "Both Win10SDK and Win81SDK were disabled."
- }
-
- Write-Verbose "Finding WinSDK"
-
- $validInstances = New-Object System.Collections.ArrayList
- # Windows 10 SDK
- function CheckWindows10SDK($path)
- {
- if ($null -eq $path)
- {
- return
- }
-
- $folder = (Join-Path $path "Include")
- if (!(Test-Path $folder))
- {
- Write-Verbose "$folder - Not Found"
- return
- }
-
- Write-Verbose "$folder - Found"
- $win10sdkVersions = @(Get-ChildItem $folder | Where-Object {$_.Name -match "^10"} | Sort-Object)
- [array]::Reverse($win10sdkVersions) # Newest SDK first
-
- foreach ($win10sdk in $win10sdkVersions)
- {
- $win10sdkV = $win10sdk.Name
- $windowsheader = "$folder\$win10sdkV\um\windows.h"
- if (!(Test-Path $windowsheader))
- {
- Write-Verbose "$windowsheader - Not Found"
- continue
- }
- Write-Verbose "$windowsheader - Found"
-
- $ddkheader = "$folder\$win10sdkV\shared\sdkddkver.h"
- if (!(Test-Path $ddkheader))
- {
- Write-Verbose "$ddkheader - Not Found"
- continue
- }
-
- Write-Verbose "$ddkheader - Found"
- $win10sdkVersionString = $win10sdkV.ToString()
- Write-Verbose "Found $win10sdkVersionString"
- $validInstances.Add($win10sdkVersionString) > $null
- }
- }
-
- Write-Verbose "`n"
- Write-Verbose "Looking for Windows 10 SDK"
- $regkey10 = Get-ItemProperty -Path 'HKLM:\SOFTWARE\Microsoft\Windows Kits\Installed Roots\' -Name 'KitsRoot10' -ErrorAction SilentlyContinue
- $regkey10Wow6432 = Get-ItemProperty -Path 'HKLM:\SOFTWARE\WOW6432Node\Microsoft\Windows Kits\Installed Roots\' -Name 'KitsRoot10' -ErrorAction SilentlyContinue
- if (vcpkgHasProperty -object $regkey10 "KitsRoot10") { CheckWindows10SDK($regkey10.KitsRoot10) }
- if (vcpkgHasProperty -object $regkey10Wow6432 "KitsRoot10") { CheckWindows10SDK($regkey10Wow6432.KitsRoot10) }
- CheckWindows10SDK("$env:ProgramFiles\Windows Kits\10")
- CheckWindows10SDK("${env:ProgramFiles(x86)}\Windows Kits\10")
-
- # Windows 8.1 SDK
- function CheckWindows81SDK($path)
- {
- if ($null -eq $path)
- {
- return
- }
-
- $folder = "$path\Include"
- if (!(Test-Path $folder))
- {
- Write-Verbose "$folder - Not Found"
- return
- }
-
- Write-Verbose "$folder - Found"
- $win81sdkVersionString = "8.1"
- Write-Verbose "Found $win81sdkVersionString"
- $validInstances.Add($win81sdkVersionString) > $null
- }
-
- Write-Verbose "`n"
- Write-Verbose "Looking for Windows 8.1 SDK"
- $regkey81 = Get-ItemProperty -Path 'HKLM:\SOFTWARE\Microsoft\Windows Kits\Installed Roots\' -Name 'KitsRoot81' -ErrorAction SilentlyContinue
- $regkey81Wow6432 = Get-ItemProperty -Path 'HKLM:\SOFTWARE\WOW6432Node\Microsoft\Windows Kits\Installed Roots\' -Name 'KitsRoot81' -ErrorAction SilentlyContinue
- if (vcpkgHasProperty -object $regkey81 "KitsRoot81") { CheckWindows81SDK($regkey81.KitsRoot81) }
- if (vcpkgHasProperty -object $regkey81Wow6432 "KitsRoot81") { CheckWindows81SDK($regkey81Wow6432.KitsRoot81) }
- CheckWindows81SDK("$env:ProgramFiles\Windows Kits\8.1")
- CheckWindows81SDK("${env:ProgramFiles(x86)}\Windows Kits\8.1")
-
- Write-Verbose "`n`n`n"
- Write-Verbose "The following Windows SDKs were found:"
- foreach ($instance in $validInstances)
- {
- Write-Verbose $instance
- }
-
- # Selecting
- if ($withWinSDK -ne "")
- {
- foreach ($instance in $validInstances)
- {
- if ($instance -eq $withWinSDK)
- {
- return $instance
- }
- }
-
- throw "Could not find the requested Windows SDK version: $withWinSDK"
- }
-
- foreach ($instance in $validInstances)
- {
- if (!$DisableWin10SDK -and $instance -match "10.")
- {
- return $instance
- }
-
- if (!$DisableWin81SDK -and $instance -match "8.1")
- {
- return $instance
- }
- }
-
- throw "Could not detect a Windows SDK / TargetPlatformVersion"
-}
-
-$msbuildExeWithPlatformToolset = findAnyMSBuildWithCppPlatformToolset $withVSPath
-$msbuildExe = $msbuildExeWithPlatformToolset[0]
-$platformToolset = $msbuildExeWithPlatformToolset[1]
-$windowsSDK = getWindowsSDK -withWinSDK $withWinSDK
-
-$disableMetricsValue = "0"
-if ($disableMetrics)
-{
- $disableMetricsValue = "1"
-}
-
-$platform = "x86"
-$vcpkgReleaseDir = "$vcpkgBootstrapPath\msbuild.x86.release"
-if($PSVersionTable.PSVersion.Major -le 2)
-{
- $architecture=(Get-WmiObject win32_operatingsystem | Select-Object osarchitecture).osarchitecture
-}
-else
-{
- $architecture=(Get-CimInstance win32_operatingsystem | Select-Object osarchitecture).osarchitecture
-}
-if ($win64)
-{
- if (-not $architecture -like "*64*")
- {
- throw "Cannot build 64-bit on non-64-bit system"
- }
-
- $platform = "x64"
- $vcpkgReleaseDir = "$vcpkgBootstrapPath\msbuild.x64.release"
-}
-
-if ($architecture -like "*64*")
-{
- $PreferredToolArchitecture = "x64"
-}
-else
-{
- $PreferredToolArchitecture = "x86"
-}
-
-$arguments = (
-"`"/p:VCPKG_VERSION=unknownhash`"",
-"`"/p:VCPKG_BASE_VERSION=2021-01-13`"", # Note: This duplicate date version will be short lived. See https://github.com/microsoft/vcpkg/pull/15474
-"/p:Configuration=Release",
-"/p:Platform=$platform",
-"/p:PlatformToolset=$platformToolset",
-"/p:TargetPlatformVersion=$windowsSDK",
-"/p:PreferredToolArchitecture=$PreferredToolArchitecture",
-"/verbosity:minimal",
-"/m",
-"/nologo",
-"`"$vcpkgBootstrapPath\vcpkg.vcxproj`"") -join " "
-
-function vcpkgInvokeCommandClean()
-{
- param ( [Parameter(Mandatory=$true)][string]$executable,
- [string]$arguments = "")
-
- Write-Verbose "Clean-Executing: ${executable} ${arguments}"
- $scriptsDir = split-path -parent $script:MyInvocation.MyCommand.Definition
- $cleanEnvScript = "$scriptsDir\cleanEnvironmentHelper.ps1"
- $tripleQuotes = "`"`"`""
- $argumentsWithEscapedQuotes = $arguments -replace "`"", $tripleQuotes
- $command = ". $tripleQuotes$cleanEnvScript$tripleQuotes; & $tripleQuotes$executable$tripleQuotes $argumentsWithEscapedQuotes"
- $arg = "-NoProfile", "-ExecutionPolicy Bypass", "-command $command"
-
- $process = Start-Process -FilePath powershell.exe -ArgumentList $arg -PassThru -NoNewWindow
- Wait-Process -InputObject $process
- $ec = $process.ExitCode
- Write-Verbose "Execution terminated with exit code $ec."
- return $ec
-}
+Write-Verbose "Examining $vcpkgRootDir for .vcpkg-root - Found"
-# vcpkgInvokeCommandClean cmd "/c echo %PATH%"
-Write-Host "`nBuilding vcpkg.exe ...`n"
-$ec = vcpkgInvokeCommandClean $msbuildExe $arguments
+& "$scriptsDir/tls12-download.exe" github.com "/microsoft/vcpkg-tool/releases/download/2021-01-13-768d8f95c9e752603d2c5901c7a7c7fbdb08af35/vcpkg.exe" "$vcpkgRootDir/vcpkg.exe"
+Write-Host ""
-if ($ec -ne 0)
+if ($LASTEXITCODE -ne 0)
{
- Write-Error "Building vcpkg.exe failed. Please ensure you have installed Visual Studio with the Desktop C++ workload and the Windows SDK for Desktop C++."
+ Write-Error "Downloading vcpkg.exe failed. Please check your internet connection, or consider downloading a recent vcpkg.exe from https://github.com/microsoft/vcpkg-tool with a browser."
throw
}
-Write-Host "`nBuilding vcpkg.exe... done.`n"
-
if ($disableMetrics)
{
Set-Content -Value "" -Path "$vcpkgRootDir\vcpkg.disable-metrics" -Force
@@ -433,9 +74,3 @@ or by setting the VCPKG_DISABLE_METRICS environment variable.
Read more about vcpkg telemetry at docs/about/privacy.md
"@
}
-
-Write-Verbose "Placing vcpkg.exe in the correct location"
-
-Copy-Item "$vcpkgReleaseDir\vcpkg.exe" "$vcpkgRootDir\vcpkg.exe"
-
-Remove-Item "$vcpkgReleaseDir" -Force -Recurse -ErrorAction SilentlyContinue