mirror of
https://github.com/microsoft/vcpkg.git
synced 2024-12-27 18:31:15 +08:00
[bootstrap] Build vcpkg in a clean environment
This commit is contained in:
parent
a5fe308ea3
commit
0df743d625
52
scripts/VcpkgPowershellUtils-ClearEnvironment.ps1
Normal file
52
scripts/VcpkgPowershellUtils-ClearEnvironment.ps1
Normal file
@ -0,0 +1,52 @@
|
||||
# Capture environment variables for the System and User. Also add some special/built-in variables.
|
||||
# These will be used to synthesize a clean environment
|
||||
$specialEnvironmentMap = @{ "SystemDrive"=$env:SystemDrive; "SystemRoot"=$env:SystemRoot; "UserProfile"=$env:UserProfile } # These are built-in and not set in the registry
|
||||
$machineEnvironmentMap = [Environment]::GetEnvironmentVariables('Machine') # HKEY_CURRENT_USER\Environment
|
||||
$userEnvironmentMap = [Environment]::GetEnvironmentVariables('User') # HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment
|
||||
|
||||
# Identify the keySet of environment variable names
|
||||
$nameSet = ($specialEnvironmentMap.Keys + $machineEnvironmentMap.Keys + $userEnvironmentMap.Keys) | Sort-Object | Select-Object -Unique
|
||||
|
||||
# Any environment variable in the $nameSet should be restored to its original value
|
||||
foreach ($name in $nameSet)
|
||||
{
|
||||
if ($specialEnvironmentMap.ContainsKey($name))
|
||||
{
|
||||
[Environment]::SetEnvironmentVariable($name, $specialEnvironmentMap[$name], 'Process')
|
||||
continue;
|
||||
}
|
||||
|
||||
# PATH needs to be concatenated as it has values in both machine and user environment. Any other values should be set.
|
||||
if ($name -match 'path')
|
||||
{
|
||||
$pathValuePartial = @()
|
||||
# Machine values before user values
|
||||
$pathValuePartial += $machineEnvironmentMap[$name] -split ';'
|
||||
$pathValuePartial += $userEnvironmentMap[$name] -split ';'
|
||||
$pathValue = $pathValuePartial -join ';'
|
||||
[Environment]::SetEnvironmentVariable($name, $pathValue, 'Process')
|
||||
continue;
|
||||
}
|
||||
|
||||
if ($userEnvironmentMap.ContainsKey($name))
|
||||
{
|
||||
[Environment]::SetEnvironmentVariable($name, $userEnvironmentMap[$name], 'Process')
|
||||
continue;
|
||||
}
|
||||
|
||||
if ($machineEnvironmentMap.ContainsKey($name))
|
||||
{
|
||||
[Environment]::SetEnvironmentVariable($name, $machineEnvironmentMap[$name], 'Process')
|
||||
continue;
|
||||
}
|
||||
|
||||
throw "Unreachable: Unknown variable $name"
|
||||
}
|
||||
|
||||
# Any environment variable NOT in the $nameSet should be removed
|
||||
$processEnvironmentMap = [Environment]::GetEnvironmentVariables('Process')
|
||||
$variablesForRemoval = $processEnvironmentMap.Keys | Where-Object {$nameSet -notcontains $_}
|
||||
foreach ($name in $variablesForRemoval)
|
||||
{
|
||||
[Environment]::SetEnvironmentVariable($name, $null, 'Process')
|
||||
}
|
@ -168,10 +168,33 @@ function vcpkgInvokeCommand()
|
||||
{
|
||||
param ( [Parameter(Mandatory=$true)][string]$executable,
|
||||
[string]$arguments = "",
|
||||
[switch]$wait)
|
||||
[Parameter(Mandatory=$true)][switch]$wait)
|
||||
|
||||
Write-Verbose "Executing: ${executable} ${arguments}"
|
||||
$process = Start-Process -FilePath $executable -ArgumentList $arguments -PassThru -NoNewWindow
|
||||
$process = Start-Process -FilePath "`"$executable`"" -ArgumentList $arguments -PassThru -NoNewWindow
|
||||
if ($wait)
|
||||
{
|
||||
Wait-Process -InputObject $process
|
||||
$ec = $process.ExitCode
|
||||
Write-Verbose "Execution terminated with exit code $ec."
|
||||
}
|
||||
}
|
||||
|
||||
function vcpkgInvokeCommandClean()
|
||||
{
|
||||
param ( [Parameter(Mandatory=$true)][string]$executable,
|
||||
[string]$arguments = "",
|
||||
[Parameter(Mandatory=$true)][switch]$wait)
|
||||
|
||||
Write-Verbose "Clean-Executing: ${executable} ${arguments}"
|
||||
$scriptsDir = split-path -parent $script:MyInvocation.MyCommand.Definition
|
||||
$cleanEnvScript = "$scriptsDir\VcpkgPowershellUtils-ClearEnvironment.ps1"
|
||||
$command = "& `"$cleanEnvScript`"; & `"$executable`" $arguments"
|
||||
$bytes = [System.Text.Encoding]::Unicode.GetBytes($command)
|
||||
$encodedCommand = [Convert]::ToBase64String($bytes)
|
||||
$arg = "-encodedCommand $encodedCommand"
|
||||
|
||||
$process = Start-Process -FilePath powershell.exe -ArgumentList $arg -PassThru -NoNewWindow
|
||||
if ($wait)
|
||||
{
|
||||
Wait-Process -InputObject $process
|
||||
|
@ -5,6 +5,7 @@ param(
|
||||
)
|
||||
|
||||
$scriptsDir = split-path -parent $script:MyInvocation.MyCommand.Definition
|
||||
. "$scriptsDir\VcpkgPowershellUtils.ps1"
|
||||
$vcpkgRootDir = & $scriptsDir\findFileRecursivelyUp.ps1 $scriptsDir .vcpkg-root
|
||||
Write-Verbose("vcpkg Path " + $vcpkgRootDir)
|
||||
|
||||
@ -52,9 +53,11 @@ try
|
||||
"/p:PlatformToolset=$platformToolset",
|
||||
"/p:TargetPlatformVersion=$windowsSDK",
|
||||
"/m",
|
||||
"dirs.proj")
|
||||
"dirs.proj") -join " "
|
||||
|
||||
# vcpkgInvokeCommandClean cmd "/c echo %PATH%" -wait:$true
|
||||
vcpkgInvokeCommandClean $msbuildExe $arguments -wait:$true
|
||||
|
||||
& $msbuildExe $arguments
|
||||
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++."
|
||||
|
Loading…
x
Reference in New Issue
Block a user