CMake: Win XP (v141_xp) VS install script
Move the PowerShell code from .github/workflow/cmake-builds.yml into its own script, cmake/github_v141_xp.ps1, to keep cmake-buils.yml readable. The script also facilitates synchronizng with the Chocolatey installer's Wait-VSIstallerProcesses function easier (from which this this code is derived.) cmake-builds.yml: Check the output from Get-VSSetupInstance and Set-VSSetupInstance. Empty (or null) output indicates that the v141_xp install did not complete successfully. Build process will bail when that happens. cmake/v141_xp_install.ps1: Unused and now unnecessary script.
This commit is contained in:
parent
eeebbed273
commit
06d41835fe
4 changed files with 166 additions and 182 deletions
107
.github/workflows/cmake-builds.yml
vendored
107
.github/workflows/cmake-builds.yml
vendored
|
@ -127,101 +127,8 @@ jobs:
|
||||||
Where-Object { $_ -notlike "*\Strawberry\*" -and $_ -notlike "*/Strawberry/*" }) -join ';'
|
Where-Object { $_ -notlike "*\Strawberry\*" -and $_ -notlike "*/Strawberry/*" }) -join ';'
|
||||||
$env:Path = $fixPATH
|
$env:Path = $fixPATH
|
||||||
|
|
||||||
#+
|
## Install the XP toolkit, aka v141_xp. This script is specific to the Github environment.
|
||||||
# Update the existing Github Visual Studio installation in-place. `vswhere` may find multiple
|
./cmake/github_v141_xp.ps1
|
||||||
# VS installations, so iterate through them all.
|
|
||||||
#
|
|
||||||
# This is Grey Magic. `vs_installer` exits almost immediately if you run it from the command
|
|
||||||
# line. However, `vs_installer`'s subprocesses are well known and we look for them and wait
|
|
||||||
# for them to terminate.
|
|
||||||
#
|
|
||||||
# GH Actions does something strange with stdout and stderr, so you won't get any
|
|
||||||
# indication of failure or output that shows you that something is happening.
|
|
||||||
#
|
|
||||||
# The waiting code was adapted from the Chocolatey VS installer scripts.
|
|
||||||
#-
|
|
||||||
$vswhere = "${env:ProgramFiles} (x86)\Microsoft Visual Studio\Installer\vswhere"
|
|
||||||
$vsinstaller = "${env:ProgramFiles} (x86)\Microsoft Visual Studio\Installer\vs_installer.exe"
|
|
||||||
$vsInstallOut = "$env:TEMP\vsinstall-out.txt"
|
|
||||||
$vsInstallErr = "$env:TEMP\vsinstall-err.txt"
|
|
||||||
|
|
||||||
& ${vswhere} -property installationPath | `
|
|
||||||
Foreach-Object -process {
|
|
||||||
## --quiet: Don't open/show UI
|
|
||||||
## --force: Terminate any VS instances forcibly
|
|
||||||
## --norestart: Delay reboot after install, if needed
|
|
||||||
## --installWhileDownloading: Self-explanitory.
|
|
||||||
$Params = @(
|
|
||||||
"modify",
|
|
||||||
"--installPath", "$_",
|
|
||||||
"--add", "Microsoft.VisualStudio.Component.VC.v141.x86.x64",
|
|
||||||
"--add", "Microsoft.VisualStudio.Component.WinXP",
|
|
||||||
"--quiet", "--force", "--norestart", "--installWhileDownloading"
|
|
||||||
)
|
|
||||||
|
|
||||||
& $vsInstaller $Params 2> $vsInstallErr > $vsInstallOut
|
|
||||||
|
|
||||||
$vsinstallerProcesses = @('vs_installer', 'vs_installershell', 'vs_installerservice')
|
|
||||||
$vsInstallerStartup = $true
|
|
||||||
$vsInstallerStartCount = 10
|
|
||||||
|
|
||||||
do
|
|
||||||
{
|
|
||||||
Write-Debug ('Looking for running VS installer processes')
|
|
||||||
$vsInstallerRemaining = Get-Process -Name $vsinstallerProcesses -ErrorAction SilentlyContinue | Where-Object { $null -ne $_ -and -not $_.HasExited }
|
|
||||||
$vsInstallerProcessCount = ($vsInstallerRemaining | Measure-Object).Count
|
|
||||||
if ($vsInstallerProcessCount -gt 0)
|
|
||||||
{
|
|
||||||
## Installer processes are present, so obviously not starting up.
|
|
||||||
$vsInstallerStartup = $false
|
|
||||||
try
|
|
||||||
{
|
|
||||||
Write-Debug "Found $vsInstallerProcessCount running Visual Studio installer processes which are known to exit asynchronously:"
|
|
||||||
$vsInstallerRemaining | Sort-Object -Property Name, Id | ForEach-Object { '[{0}] {1}' -f $_.Id, $_.Name } | Write-Debug
|
|
||||||
Write-Debug ('Giving the processes some time to exit')
|
|
||||||
$vsInstallerRemaining | Wait-Process -Timeout 45 -ErrorAction SilentlyContinue
|
|
||||||
}
|
|
||||||
finally
|
|
||||||
{
|
|
||||||
$vsInstallerRemaining | ForEach-Object { $_.Dispose() }
|
|
||||||
$vsInstallerRemaining = $null
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
if ($vsInstallerStartup) {
|
|
||||||
if ($vsInstallerStartCount -gt 0) {
|
|
||||||
Write-Debug "No VS installer processes detected; sleeping with $vsInstallerStartCount tries remaining."
|
|
||||||
Start-Sleep -Seconds 10.0
|
|
||||||
$vsInstallerStartCount -= 1
|
|
||||||
} else {
|
|
||||||
$vsInstallerStartup = $false
|
|
||||||
Write-Debug "VS installer never started? Exiting."
|
|
||||||
Exit 99
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
while (($vsInstallerStartup -and $vsInstallerStartCount -gt 0) -or $vsInstallerProcessCount -gt 0)
|
|
||||||
}
|
|
||||||
|
|
||||||
if ((Test-Path $vsInstallOut -PathType Leaf) -and (Get-Item $vsInstallOut).length -gt 0kb)
|
|
||||||
{
|
|
||||||
Write-Output "-- vsinstaller output:"
|
|
||||||
Get-Content $vsInstallOut
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
Write-Debug "-- No vsinstaller output."
|
|
||||||
}
|
|
||||||
|
|
||||||
if ((Test-Path $vsInstallErr -PathType Leaf) -and (Get-Item $vsInstallErr).length -gt 0kb)
|
|
||||||
{
|
|
||||||
Write-Output "-- vsinstaller error output:"
|
|
||||||
Get-Content $vsInstallErr
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
Write-Debug "-- No vsinstaller error/diag output."
|
|
||||||
}
|
|
||||||
|
|
||||||
#+
|
#+
|
||||||
# The GH Windows runner image documentation says that the VSSetup module is installed, from
|
# The GH Windows runner image documentation says that the VSSetup module is installed, from
|
||||||
|
@ -229,7 +136,15 @@ jobs:
|
||||||
# paranoia, ensuring that we really, truly and honestly have WinXP support.
|
# paranoia, ensuring that we really, truly and honestly have WinXP support.
|
||||||
#-
|
#-
|
||||||
Write-Debug "Get-VSSetupInstance/Select-VSSetupInstance"
|
Write-Debug "Get-VSSetupInstance/Select-VSSetupInstance"
|
||||||
Get-VSSetupInstance -All | Select-VSSetupInstance -Require 'Microsoft.VisualStudio.Component.WinXP' -Latest
|
$instances=$(Get-VSSetupInstance -All | Select-VSSetupInstance -Require 'Microsoft.VisualStudio.Component.WinXP' -Latest)
|
||||||
|
if ($null -eq $instances)
|
||||||
|
{
|
||||||
|
throw "v141_xp didn't install correctly or incomplete install."
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
$instances | Write-Output
|
||||||
|
}
|
||||||
|
|
||||||
## Don't use LTO for XP. XP compatibility comes from VS2017 -- MS is
|
## Don't use LTO for XP. XP compatibility comes from VS2017 -- MS is
|
||||||
## at VS2022. There are likely legacy bugs that have been fixed.
|
## at VS2022. There are likely legacy bugs that have been fixed.
|
||||||
|
|
|
@ -130,6 +130,8 @@ open-simh This is CMAKE_SOURCE_DIR
|
||||||
| | CMakeLists.txt from the makefile
|
| | CMakeLists.txt from the makefile
|
||||||
| +-- git-commit-id.cmake CMake script to update .git-commit-id and
|
| +-- git-commit-id.cmake CMake script to update .git-commit-id and
|
||||||
| | .git-commit-id.h
|
| | .git-commit-id.h
|
||||||
|
| +-- github_v141_xp.ps1 Visual Studio "XP toolkit" installer PowerShell
|
||||||
|
| | script
|
||||||
| +-- installer-customizations Installer-specific customization files
|
| +-- installer-customizations Installer-specific customization files
|
||||||
| +-- os-features.cmake Operating system feature probes, e.g., -lm
|
| +-- os-features.cmake Operating system feature probes, e.g., -lm
|
||||||
| +-- patches Patches applied to external dependency libs
|
| +-- patches Patches applied to external dependency libs
|
||||||
|
@ -142,8 +144,6 @@ open-simh This is CMAKE_SOURCE_DIR
|
||||||
| | CPack components (simulator "families")
|
| | CPack components (simulator "families")
|
||||||
| +-- simh-simulators.cmake Simulator add_subdirectory includes, variable
|
| +-- simh-simulators.cmake Simulator add_subdirectory includes, variable
|
||||||
| | definitions
|
| | definitions
|
||||||
| +-- v141_xp_install.ps1 Experimental Powershell script to install XP
|
|
||||||
| | compatibility support in Visual Studio (unused)
|
|
||||||
| +-- vcpkg-setup.cmake vcpkg package manager setup code
|
| +-- vcpkg-setup.cmake vcpkg package manager setup code
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
153
cmake/github_v141_xp.ps1
Normal file
153
cmake/github_v141_xp.ps1
Normal file
|
@ -0,0 +1,153 @@
|
||||||
|
<#
|
||||||
|
.SYNOPSIS
|
||||||
|
Install Visual Studio's 'v141_xp' XP toolkit on Github.
|
||||||
|
|
||||||
|
.DESCRIPTION
|
||||||
|
Update the existing Github Visual Studio installation in-place. This script
|
||||||
|
will iterate through all VS installations identified by the `vswhere` utility.
|
||||||
|
|
||||||
|
This script is Grey Magic. The `vs_installer` installer utility exits almost
|
||||||
|
immediately if you run it from the command line. `vs_installer`'s subprocesses
|
||||||
|
are reasonably well known, which allows this script to query the processes and
|
||||||
|
wait for them to terminate.
|
||||||
|
|
||||||
|
GitHub Actions does something strange with stdout and stderr, so you won't get any
|
||||||
|
indication of failure or output that shows you that something is happening.
|
||||||
|
|
||||||
|
The waiting code was adapted from the Chocolatey VS installer scripts (Wait-VSIstallerProcesses).
|
||||||
|
|
||||||
|
Ref: https://github.com/jberezanski/ChocolateyPackages/blob/master/chocolatey-visualstudio.extension/extensions/Wait-VSInstallerProcesses.ps1
|
||||||
|
#>
|
||||||
|
|
||||||
|
$exitcode = $null
|
||||||
|
$vswhere = "${env:ProgramFiles} (x86)\Microsoft Visual Studio\Installer\vswhere"
|
||||||
|
$vsinstaller = "${env:ProgramFiles} (x86)\Microsoft Visual Studio\Installer\vs_installer.exe"
|
||||||
|
$vsInstallOut = "$env:TEMP\vsinstall-out.txt"
|
||||||
|
$vsInstallErr = "$env:TEMP\vsinstall-err.txt"
|
||||||
|
|
||||||
|
& ${vswhere} -property installationPath | Foreach-Object -process {
|
||||||
|
# Save the installlation path for the current iteration
|
||||||
|
$installPath = $_
|
||||||
|
|
||||||
|
# Make sure that previously running installers have all exited.
|
||||||
|
Write-Debug ('Looking for previously running VS installer processes')
|
||||||
|
$lazyQuitterProcessNames = @('vs_installershell', 'vs_installerservice')
|
||||||
|
do
|
||||||
|
{
|
||||||
|
$lazyQuitterProcesses = Get-Process -Name $lazyQuitterProcessNames -ErrorAction SilentlyContinue | `
|
||||||
|
Where-Object { $null -ne $_ -and -not $_.HasExited }
|
||||||
|
$lazyQuitterProcessCount = ($lazyQuitterProcesses | Measure-Object).Count
|
||||||
|
if ($lazyQuitterProcessCount -gt 0)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
$lazyQuitterProcesses | Sort-Object -Property Name, Id | ForEach-Object { '[{0}] {1}' -f $_.Id, $_.Name } | Write-Debug
|
||||||
|
$lazyQuitterProcesses | Wait-Process -Timeout 10 -ErrorAction SilentlyContinue
|
||||||
|
}
|
||||||
|
finally
|
||||||
|
{
|
||||||
|
$lazyQuitterProcesses | ForEach-Object { $_.Dispose() }
|
||||||
|
$lazyQuitterProcesses = $null
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
while ($lazyQuitterProcessCount -gt 0)
|
||||||
|
|
||||||
|
## Now kick off our install:
|
||||||
|
##
|
||||||
|
## --quiet: Don't open/show UI
|
||||||
|
## --force: Terminate any VS instances forcibly
|
||||||
|
## --norestart: Delay reboot after install, if needed
|
||||||
|
## --installWhileDownloading: Self-explanitory.
|
||||||
|
##
|
||||||
|
## Note: "--wait" doesn't.
|
||||||
|
$vsinstallParams = @(
|
||||||
|
"modify",
|
||||||
|
"--installPath", "$installPath",
|
||||||
|
"--add", "Microsoft.VisualStudio.Component.VC.v141.x86.x64",
|
||||||
|
"--add", "Microsoft.VisualStudio.Component.WinXP",
|
||||||
|
"--quiet", "--force", "--norestart", "--installWhileDownloading"
|
||||||
|
)
|
||||||
|
|
||||||
|
& $vsInstaller $vsinstallParams 2> $vsInstallErr > $vsInstallOut
|
||||||
|
|
||||||
|
## VS installer processes for which we want to wait because installation isn't complete. Yet.
|
||||||
|
$vsinstallerProcesses = @( 'vs_bootstrapper', 'vs_setup_bootstrapper', 'vs_installer', 'vs_installershell', `
|
||||||
|
'vs_installerservice', 'setup')
|
||||||
|
$vsInstallerProcessFilter = { $_.Name -ne 'setup' -or $_.Path -like '*\Microsoft Visual Studio\Installer*\setup.exe' }
|
||||||
|
do
|
||||||
|
{
|
||||||
|
Write-Debug ('Looking for running VS installer processes')
|
||||||
|
$vsInstallerRemaining = Get-Process -Name $vsinstallerProcesses -ErrorAction SilentlyContinue | `
|
||||||
|
Where-Object { $null -ne $_ -and -not $_.HasExited } | `
|
||||||
|
Where-Object $vsInstallerProcessFilter
|
||||||
|
$vsInstallerProcessCount = ($vsInstallerRemaining | Measure-Object).Count
|
||||||
|
if ($vsInstallerProcessCount -gt 0)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
Write-Debug "Found $vsInstallerProcessCount running Visual Studio installer processes:"
|
||||||
|
$vsInstallerRemaining | Sort-Object -Property Name, Id | ForEach-Object { '[{0}] {1}' -f $_.Id, $_.Name } | Write-Debug
|
||||||
|
|
||||||
|
foreach ($p in $vsInstallerProcesses)
|
||||||
|
{
|
||||||
|
[void] $p.Handle # make sure we get the exit code http://stackoverflow.com/a/23797762/266876
|
||||||
|
}
|
||||||
|
|
||||||
|
Write-Debug ('Waiting 60 seconds for process(es) to exit...')
|
||||||
|
$vsInstallerRemaining | Wait-Process -Timeout 60 -ErrorAction SilentlyContinue
|
||||||
|
|
||||||
|
foreach ($proc in $vsInstallerProcesses)
|
||||||
|
{
|
||||||
|
if (-not $proc.HasExited)
|
||||||
|
{
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
if ($null -eq $exitCode)
|
||||||
|
{
|
||||||
|
$exitCode = $proc.ExitCode
|
||||||
|
}
|
||||||
|
if ($proc.ExitCode -ne 0 -and $null -ne $proc.ExitCode)
|
||||||
|
{
|
||||||
|
Write-Debug "$($proc.Name) process $($proc.Id) exited with code $($proc.ExitCode)"
|
||||||
|
if ($exitCode -eq 0)
|
||||||
|
{
|
||||||
|
$exitCode = $proc.ExitCode
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
finally
|
||||||
|
{
|
||||||
|
$vsInstallerRemaining | ForEach-Object { $_.Dispose() }
|
||||||
|
$vsInstallerRemaining = $null
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
while (($vsInstallerStartup -and $vsInstallerStartCount -gt 0) -or $vsInstallerProcessCount -gt 0)
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((Test-Path $vsInstallOut -PathType Leaf) -and (Get-Item $vsInstallOut).length -gt 0kb)
|
||||||
|
{
|
||||||
|
Write-Output "-- vsinstaller output:"
|
||||||
|
Get-Content $vsInstallOut
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Write-Debug "-- No vsinstaller output."
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((Test-Path $vsInstallErr -PathType Leaf) -and (Get-Item $vsInstallErr).length -gt 0kb)
|
||||||
|
{
|
||||||
|
Write-Output "-- vsinstaller error output:"
|
||||||
|
Get-Content $vsInstallErr
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Write-Debug "-- No vsinstaller error/diag output."
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($null -ne $exitcode -and $exitcode -ne 0)
|
||||||
|
{
|
||||||
|
throw "VS installer exited with non-zero exit status: $exitcode"
|
||||||
|
}
|
|
@ -1,84 +0,0 @@
|
||||||
$vsFlavor=$args[0]
|
|
||||||
$vsSetupDir="C:\Program Files (x86)\Microsoft Visual Studio\installer"
|
|
||||||
$vswhere="${vsSetupDir}\vswhere.exe"
|
|
||||||
$vsinstaller="${vsSetupDir}\vs_installer.exe"
|
|
||||||
|
|
||||||
$vstudios = @{
|
|
||||||
"vs2017" = @{
|
|
||||||
names = @{
|
|
||||||
"Visual Studio Enterprise 2019" = "Microsoft.VisualStudio.Product.Enterprise"
|
|
||||||
"Visual Studio Professional 2019" = "Microsoft.VisualStudio.Product.Professional"
|
|
||||||
"Visual Studio Community 2019" = "Microsoft.VisualStudio.Product.Community"
|
|
||||||
}
|
|
||||||
channelId = "VisualStudio.15.Release"
|
|
||||||
v141toolkit = @( "Microsoft.VisualStudio.Component.WinXP" )
|
|
||||||
}
|
|
||||||
"vs2019" = @{
|
|
||||||
names = @{
|
|
||||||
"Visual Studio Enterprise 2019" = "Microsoft.VisualStudio.Product.Enterprise"
|
|
||||||
"Visual Studio Professional 2019" = "Microsoft.VisualStudio.Product.Professional"
|
|
||||||
"Visual Studio Community 2019" = "Microsoft.VisualStudio.Product.Community"
|
|
||||||
}
|
|
||||||
displayName = "Visual Studio Community 2019"
|
|
||||||
channelId = "VisualStudio.16.Release"
|
|
||||||
v141toolkit = @( "Microsoft.VisualStudio.Component.VC.v141.x86.x64", "Microsoft.VisualStudio.Component.WinXP" )
|
|
||||||
}
|
|
||||||
"vs2022" = @{
|
|
||||||
names = @{
|
|
||||||
"Visual Studio Enterprise 2022" = "Microsoft.VisualStudio.Product.Enterprise"
|
|
||||||
"Visual Studio Professional 2022" = "Microsoft.VisualStudio.Product.Professional"
|
|
||||||
"Visual Studio Community 2022" = "Microsoft.VisualStudio.Product.Community"
|
|
||||||
}
|
|
||||||
installedChannelId = "VisualStudio.17.Release"
|
|
||||||
v141toolkit = @( "Microsoft.VisualStudio.Component.VC.v141.x86.x64", "Microsoft.VisualStudio.Component.WinXP" )
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if ($args.length -eq 0) {
|
|
||||||
"Womabt!!"
|
|
||||||
exit 1
|
|
||||||
}
|
|
||||||
|
|
||||||
$wantedVS = $vstudios[$args[0]]
|
|
||||||
if ($wantedVS -eq $null) {
|
|
||||||
"Wibbles."
|
|
||||||
exit 1
|
|
||||||
}
|
|
||||||
|
|
||||||
Set-PSDebug -Trace 1
|
|
||||||
|
|
||||||
if (Test-Path -Path $vsinstaller) {
|
|
||||||
if (Test-Path -Path $vswhere) {
|
|
||||||
$vsinfo=$(& $vswhere -format json | ConvertFrom-JSON)
|
|
||||||
foreach ($vs in $vsinfo) {
|
|
||||||
$productId = $wantedVS.names[$vs.displayName]
|
|
||||||
if ($productId -ne $null) {
|
|
||||||
Write-Output $("Found: " + $vs.displayName)
|
|
||||||
|
|
||||||
$args = @( "modify", "--quiet")
|
|
||||||
$args += @( "--channelId", $wantedVS.installedChannelId )
|
|
||||||
$args += @( "--productId", $productId )
|
|
||||||
|
|
||||||
foreach ($c in $wantedVS.v141toolkit) {
|
|
||||||
$args += @( "--add", $c )
|
|
||||||
}
|
|
||||||
|
|
||||||
Write-Output $( ( @("Executing: ", $vsinstaller) + $args ) -join " " )
|
|
||||||
|
|
||||||
$proc = Start-Process -Verbose -NoNewWindow -PassThru $vsinstaller -ArgumentList $args
|
|
||||||
$proc.WaitForExit()
|
|
||||||
|
|
||||||
$proc = Start-Process -NoNewWindow -PassThru $vsinstaller -ArgumentList @("export", "--channelId", $wantedVS.installedChannelId, "--productId", $productId, "--config", "vsinstall.after", "--quiet")
|
|
||||||
$proc.WaitForExit()
|
|
||||||
|
|
||||||
if (Test-Path -Path .\vsinstall.after) {
|
|
||||||
Get-Content .\vsinstall.after
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
Write-Ouput @("vswhere not found or available. ", $vswhere) -join " "
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
Write-Ouput @("VS installer not found or available. ", $vsinstaller) -join " "
|
|
||||||
}
|
|
Loading…
Add table
Reference in a new issue