mirror of
https://github.com/microsoft/vcpkg.git
synced 2024-11-25 01:51:39 +08:00
b357d2d0c3
* Fix issue with compiling vcpkg.exe (#4149) The check for environment variable PATH match other environment variables. When environment variable VCTargetsPath used by msbuild is changed in cleanEnvironmentHelper.ps1 the path is broken. This makes the compilation of vcpkg.exe fail. This commit fix the issue by checking that environment variable PATH is exactly PATH. * [cleanEnvironmentHelper] Use -eq instead of -match
53 lines
2.3 KiB
PowerShell
53 lines
2.3 KiB
PowerShell
# 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_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment
|
|
$userEnvironmentMap = [Environment]::GetEnvironmentVariables('User') # HKEY_CURRENT_USER\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 -eq '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')
|
|
}
|