From f98a4ca93a9b558408660372f2fd27eb08c7b216 Mon Sep 17 00:00:00 2001 From: Mark Pizzolato Date: Thu, 24 Nov 2022 11:11:52 -1000 Subject: [PATCH] Visual Studio Projects: Add extensive support for Visual Studio 2022 - Pre-Pre-Build-Event.cmd now dynamically determines the available compiler version along with any alternate toolset which may be part of the build environment and makes the appropriate windows-build library support available for linking. - build_vstudio.bat now supports VS2022 and will dynamically adjust the converted VS2008 project files to leverage any available XP build support which might be installed so that the generated executables will support all versions of Windows from XP onward. The VS2008 generated executables automatically support all versions of Windows from XP onward. --- .github/workflows/build.yml | 31 ++++++++- Visual Studio Projects/0ReadMe_Projects.txt | 40 ++++++++++- Visual Studio Projects/ConvertToXPProject.ps1 | 26 ++++++++ Visual Studio Projects/Pre-Build-Event.cmd | 66 ++++++++++++++++--- build_vstudio.bat | 28 +++++++- 5 files changed, 176 insertions(+), 15 deletions(-) create mode 100644 Visual Studio Projects/ConvertToXPProject.ps1 diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 40fb3797..fdab50a0 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -7,7 +7,7 @@ defaults: shell: bash jobs: - build: + cmake-unix: runs-on: ${{ matrix.os }} strategy: matrix: @@ -22,7 +22,7 @@ jobs: - pdp8 pdp9 pdq3 rtvax1000 s3 sage scelbi sds sel32 sigma ssem swtp6800mp-a swtp6800mp-a2 tt2500 tx-0 - uc15 vax vax730 vax750 vax780 vax8200 vax8600 vaxstation3100m30 vaxstation3100m38 vaxstation3100m76 vaxstation4000m60 vaxstation4000vlc steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v3 - name: Install dependencies if: ${{runner.os == 'macOS'}} run: sh -ex .travis/deps.sh osx @@ -33,3 +33,30 @@ jobs: env: SIM: ${{matrix.simulators}} run: make LTO=1 OPTIMIZE=-O3 $SIM + + cmake-vs2022xp: + name: VS 2022 XP-compatible + runs-on: ${{ matrix.os }} + + strategy: + matrix: + os: [windows-latest] + + steps: + - uses: actions/checkout@v3 + - name: Install v141_xp (XP toolkit) + shell: pwsh + run: | + $packageParams = @( "--productId", "Microsoft.VisualStudio.Product.Enterprise", + "--channelId", "VisualStudio.17.Release", + "--add", "Microsoft.VisualStudio.Component.VC.v141.x86.x64", + "--add", "Microsoft.VisualStudio.Component.WinXP", + "--no-includeRecommended", + "--includeOptional", + "--quiet", + "--locale en-US" ) -join " " + choco install visualstudio2022-workload-nativedesktop --package-parameters $packageParams + + - name: vs2022-xp build + shell: cmd + build_vstudio.bat diff --git a/Visual Studio Projects/0ReadMe_Projects.txt b/Visual Studio Projects/0ReadMe_Projects.txt index a2497742..cfed9b00 100644 --- a/Visual Studio Projects/0ReadMe_Projects.txt +++ b/Visual Studio Projects/0ReadMe_Projects.txt @@ -58,7 +58,7 @@ in this directory. The installer for Visual Studio 2008 SP1 is available from: -http://download.microsoft.com/download/E/8/E/E8EEB394-7F42-4963-A2D8-29559B738298/VS2008ExpressWithSP1ENUX1504728.iso +https://download.microsoft.com/download/E/8/E/E8EEB394-7F42-4963-A2D8-29559B738298/VS2008ExpressWithSP1ENUX1504728.iso Then install Visual Studio Express Visual C++ by executing VCExpress\setup.exe on that DVD image. No need to install "Silverlight Runtime" or @@ -66,6 +66,9 @@ on that DVD image. No need to install "Silverlight Runtime" or you may be prompted to install an older version of .NET Framework which should be installed. +Visual Studio Express 2008 will build executables that will run on all Windows +versions from XP onward with equivalent functionality. + Note: VS2008 can readily coexist on Windows systems that also have later versions of Visual Studio installed. @@ -76,4 +79,37 @@ conversion process. If you have a version of Visual Studio installed and want to build all the simulators from a command prompt, the file build_vstudio.bat in the root -of the simh source tree will do that without any furthur interaction. \ No newline at end of file +of the simh source tree will do that without any furthur interaction. + +Almost all newer Visual Studio versions after VS2008 will build executables +that only run on the system that built it or one running the same OS. + +If you're using Visual Studio Community 2022, and you follow these +installation instructions, you can also build simulator executables which +will run on all versions of Windows from XP onward if you install as +indicated here and you use the build_vstudio.bat file to perform the +project conversions. Once projects are converted, they can be used in +the Visual Studio 2022 IDE for further development. + +- New install + - In the "Workloads" pane, check "Desktop development with C++" workload's + checkbox, if not already checked. + - Click on the tab labeled "Individual components" + - In the "Individual components" pane: + - Enter "XP" in the "Search components (Ctrl-Q)" field. + - Locate the "Compilers, build tools and runtimes" heading + - Select "C++ for Windows XP Support for VS 2017 (v141) tools [Deprecated]" checkbox. + - Continue to customize your VS 2022 installation as needed. + - Click on "Install" in the lower right hand corner + +- Modifying an existing VS2022 installation + - Click on the Visual Studio 2022 `Modify` button. + - In the "Modifying --" window, click on "Individual Components" + - Click on the tab labeled "Individual components" + - In the "Individual components" pane: + - Enter "XP" in the "Search components (Ctrl-Q)" field. + - Locate the "Compilers, build tools and runtimes" heading + - Select "C++ for Windows XP Support for VS 2017 (v141) tools [Deprecated]" checkbox. + - Continue to customize your VS 2022 installation as needed. + - Click on the "Modify" button in the lower right corner of the Window. + diff --git a/Visual Studio Projects/ConvertToXPProject.ps1 b/Visual Studio Projects/ConvertToXPProject.ps1 new file mode 100644 index 00000000..c5663ef4 --- /dev/null +++ b/Visual Studio Projects/ConvertToXPProject.ps1 @@ -0,0 +1,26 @@ +# This script converts Visual Studio 2022 upgraded VS2008 projects to produce VS2022 +# projects that will build executables that will run on all versions of windows since XP +# +ForEach ($arg in ($args)) +{ + if (-not (Test-Path -Path $arg -PathType Any)) {if (-not (Get-Item -Path $arg -ErrorAction Ignore)) {Write-Host "No such file: $arg"; continue; }} + ForEach ($file in (Get-Item -Path $arg)) + { + $string = Get-Content -Path $file -Raw + if ($string.Contains("10.0")) {Write-Host "$file - already converted"; continue; } + Write-Host "Processing: $file" + $string = $string.Replace( +"Win32Proj +", +"Win32Proj + 10.0 +") + $string = $string.Replace("v143","v141_xp") + $string = $string.Replace( +' Label="LocalAppDataPlatform" /> + ',' Label="LocalAppDataPlatform" /> + + ') + $string | Out-File -Force -FilePath "$file" -Encoding utf8 + } +} diff --git a/Visual Studio Projects/Pre-Build-Event.cmd b/Visual Studio Projects/Pre-Build-Event.cmd index b69a932e..f20d6e42 100644 --- a/Visual Studio Projects/Pre-Build-Event.cmd +++ b/Visual Studio Projects/Pre-Build-Event.cmd @@ -30,7 +30,11 @@ rem Everything implicitly requires BUILD to also be set to have rem any meaning, it always gets set. set _X_BUILD=BUILD set _X_REQUIRED_WINDOWS_BUILD=20221109 -call :FindVCVersion _VC_VER +call :FindVCVersion _VC_VER _MSVC_VER _MSVC_TOOLSET_VER _MSVC_TOOLSET_DIR +echo _VC_VER=%_VC_VER% +echo _MSVC_VER=%_MSVC_VER% +echo _MSVC_TOOLSET_VER=%_MSVC_TOOLSET_VER% +echo _MSVC_TOOLSET_DIR=%_MSVC_TOOLSET_DIR% set _PDB=%~dpn1.pdb if exist "%_PDB%" del/q "%_PDB%" @@ -118,7 +122,7 @@ ren ..\..\windows-build-windows-build windows-build if errorlevel 1 goto _notice3 if exist ../../windows-build-windows-build goto _notice3 :_check_files -call :FindVCVersion _VC_VER +call :FindVCVersion _VC_VER _MSVC_VER _MSVC_TOOLSET_VER _MSVC_TOOLSET_DIR if not exist ..\..\windows-build goto _notice1 if not exist ..\..\windows-build/lib goto _notice2 set _X_WINDOWS_BUILD= @@ -138,6 +142,10 @@ set _X_LAST_WINDOWS_BUILD= if not exist ../../windows-build/lib/VisualCVersionSupport.txt goto _find_vc_support set _X_VC_VER= +if "%_MSVC_TOOLSET_VER%" EQU "v140" set _VC_VER=2015 +if "%_MSVC_TOOLSET_VER%" EQU "v141" set _VC_VER=2017 +if "%_MSVC_TOOLSET_VER%" EQU "v142" set _VC_VER=2019 +if "%_MSVC_TOOLSET_VER%" EQU "v143" set _VC_VER=2022 for /F "usebackq tokens=2*" %%i in (`findstr /C:"_VC_VER=%_VC_VER% " ..\..\windows-build\lib\VisualCVersionSupport.txt`) do SET _X_VC_VER=%%i %%j if "%_X_VC_VER%" neq "" echo Library support for %_X_VC_VER% is available if "%_X_VC_VER%" neq "" goto _done_libsdl @@ -150,7 +158,7 @@ for /F "usebackq tokens=2*" %%i in (`findstr /C:"_VC_VER=%_VC_VER% " "%_X_VC_VER echo Enabling Library support for %_X_VC_VER% call "%_X_VC_VER_DIR%\Install-Library-Support.cmd" :_done_libsdl -call :FindVCVersion _VC_VER +call :FindVCVersion _VC_VER _MSVC_VER _MSVC_TOOLSET_VER _MSVC_TOOLSET_DIR if not exist "..\..\windows-build\libpng-1.6.18\projects\Release Library" goto _setup_library if not exist "..\..\windows-build\libpng-1.6.18\projects\Release Library\VisualC.version" set _LIB_VC_VER=9 if exist "..\..\windows-build\libpng-1.6.18\projects\Release Library\VisualC.version" for /f "usebackq delims=." %%v in (`type "..\..\windows-build\libpng-1.6.18\projects\Release Library\VisualC.version"`) do set _LIB_VC_VER=%%v @@ -314,10 +322,10 @@ goto _ProjectInfo :_notice4 echo ********************************* echo ********************************* -echo ** Visual Studio Version: %_VC_VER% ** -echo ** Visual Studio Version: %_VC_VER% ** -echo ** Visual Studio Version: %_VC_VER% ** -echo ** Visual Studio Version: %_VC_VER% ** +echo ** Visual Studio Version: %_VC_VER% Compiler Version: %_MSVC_VER% Toolset Version: %_MSVC_TOOLSET_VER% ** +echo ** Visual Studio Version: %_VC_VER% Compiler Version: %_MSVC_VER% Toolset Version: %_MSVC_TOOLSET_VER% ** +echo ** Visual Studio Version: %_VC_VER% Compiler Version: %_MSVC_VER% Toolset Version: %_MSVC_TOOLSET_VER% ** +echo ** Visual Studio Version: %_VC_VER% Compiler Version: %_MSVC_VER% Toolset Version: %_MSVC_TOOLSET_VER% ** echo ***************************************************** echo ***************************************************** echo ** Windows Build support for your Microsoft ** @@ -446,13 +454,29 @@ exit /B 0 :FindVCVersion call :WhichInPath cl.exe _VC_CL_ -for /f "tokens=3-9 delims=\" %%a in ("%_VC_CL_%") do call :VCCheck _VC_VER_NUM_ "%%a" "%%b" "%%c" "%%d" "%%e" "%%f" "%%g" +for /f "tokens=3-10 delims=\" %%a in ("%_VC_CL_%") do call :VCCheck _VC_VER_NUM_ "%%a" "%%b" "%%c" "%%d" "%%e" "%%f" "%%g" "%%h" for /f "delims=." %%a in ("%_VC_VER_NUM_%") do set %1=%%a +set _VC_CL_STDERR_=%TEMP%\cl_stderr%RANDOM%.tmp +set VS_UNICODE_OUTPUT= +"%_VC_CL_%" /? 2>"%_VC_CL_STDERR_%" 1>NUL +for /f "usebackq tokens=4-9" %%a in (`findstr Version "%_VC_CL_STDERR_%"`) do call :MSVCCheck _MSVC_VER_NUM_ "%%a" "%%b" "%%c" "%%d" "%%e" +if "%4" NEQ "" set %4=%_MSVC_TOOLSET_% +if "%_MSVC_TOOLSET_%" NEQ "" set _MSVC_TOOLSET_=v%_MSVC_TOOLSET_:~0,2%%_MSVC_TOOLSET_:~3,1% +if "%3" NEQ "" set %3=%_MSVC_TOOLSET_% +set _MSVC_TOOLSET_= +set %2=%_MSVC_VER_NUM_% +set _MSVC_VER_NUM_= +for /f "delims=." %%a in ("%_MSVC_VER_NUM_%") do set %2=%%a +del %_VC_CL_STDERR_% +set _VC_CL_STDERR_= set _VC_CL= exit /B 0 +:: Scan the elements of the file path of cl.exe to determine the Visual +:: Studio Version and potentially the toolset version :VCCheck set _VC_TMP=%1 +set _VC_TOOLSET= :_VCCheck_Next shift set _VC_TMP_=%~1 @@ -463,11 +487,37 @@ if "%_VC_NUM_%" neq "" set %_VC_TMP%=%~1 if "%_VC_NUM_%" neq "" goto _VCCheck_Done goto _VCCheck_Next :_VCCheck_Done +set _VC_TMP=_MSVC_TOOLSET_ +:_VCTSCheck_Next +shift +set _VC_TMP_=%~1 +if "%_VC_TMP_%" equ "" goto _VCTSCheck_Done +call :IsNumeric _VC_NUM_ %_VC_TMP_% +if "%_VC_NUM_%" neq "" set %_VC_TMP%=%~1 +if "%_VC_NUM_%" neq "" goto _VCTSCheck_Done +goto _VCTSCheck_Next +:_VCTSCheck_Done set _VC_TMP_= set _VC_TMP= set _VC_NUM_= exit /B 0 +:MSVCCheck +set _MSVC_TMP=%1 +:_MSVCCheck_Next +shift +set _MSVC_TMP_=%~1 +if "%_MSVC_TMP_%" equ "" goto _VCCheck_Done +call :IsNumeric _MSVC_NUM_ %_MSVC_TMP_% +if "%_MSVC_NUM_%" neq "" set %_MSVC_TMP%=%~1 +if "%_MSVC_NUM_%" neq "" goto _MSVCCheck_Done +goto _MSVCCheck_Next +:_MSVCCheck_Done +set _MSVC_TMP_= +set _MSVC_TMP= +set _MSVC_NUM_= +exit /B 0 + :CheckDirectoryVCSupport set _VC_Check_Path=%~3%~2/ set _VC_Check_Path=%_VC_Check_Path:/=\% diff --git a/build_vstudio.bat b/build_vstudio.bat index 5b7f4669..24324f76 100644 --- a/build_vstudio.bat +++ b/build_vstudio.bat @@ -6,6 +6,12 @@ :: otherwise the installed Visual Studio tools will be used :: prefering newer Visual Studio versions over older ones. :: +:: If this is invoked with Visual Studio 2022 installed along with +:: the "C++ for Windows XP Support for VS 2017 (v141) tools" option +:: installed, then the project files will be converted, if needed +:: to leverage the available support so that the executables created +:: will run on all versions of Windows from XP onward. +:: :: If this procedure is invoked from a Developer command prompt :: then the tool chain provided with the command prompt is used :: to build the simh projects. @@ -52,6 +58,15 @@ if not "%_VC_VER%" == "" goto GotVC if exist "%ProgramFiles(x86)%\Microsoft Visual Studio 9.0\VC\vcvarsall.bat" call "%ProgramFiles(x86)%\Microsoft Visual Studio 9.0\VC\vcvarsall.bat" call :FindVCVersion _VC_VER if not "%_VC_VER%" == "" goto GotVC +if exist "%ProgramFiles%\Microsoft Visual Studio\2022\Enterprise\VC\Auxiliary\Build\vcvars32.bat" call "%ProgramFiles%\Microsoft Visual Studio\2022\Enterprise\VC\Auxiliary\Build\vcvars32.bat" +call :FindVCVersion _VC_VER +if not "%_VC_VER%" == "" goto GotVC +if exist "%ProgramFiles%\Microsoft Visual Studio\2022\Professional\VC\Auxiliary\Build\vcvars32.bat" call "%ProgramFiles%\Microsoft Visual Studio\2022\Professional\VC\Auxiliary\Build\vcvars32.bat" +call :FindVCVersion _VC_VER +if not "%_VC_VER%" == "" goto GotVC +if exist "%ProgramFiles%\Microsoft Visual Studio\2022\Community\VC\Auxiliary\Build\vcvars32.bat" call "%ProgramFiles%\Microsoft Visual Studio\2022\Community\VC\Auxiliary\Build\vcvars32.bat" +call :FindVCVersion _VC_VER +if not "%_VC_VER%" == "" goto GotVC if exist "%ProgramFiles(x86)%\Microsoft Visual Studio\2019\Community\VC\Auxiliary\Build\vcvars32.bat" call "%ProgramFiles(x86)%\Microsoft Visual Studio\2019\Community\VC\Auxiliary\Build\vcvars32.bat" call :FindVCVersion _VC_VER if not "%_VC_VER%" == "" goto GotVC @@ -169,8 +184,15 @@ goto _NextProject :_DoMSBuild if "%_X_SLN_VERSION%" == "10.00" echo Converting the VS2008 projects to VS%_VC_VER%, this will take several (3-5) minutes & DevEnv /Upgrade "%_BUILD_PROJECT_DIR%Simh.sln" -if "%_BUILD_PROJECTS%" == "" MSBuild /nologo "%_BUILD_PROJECT_DIR%Simh.sln" /maxCpuCount:%_BUILD_PARALLEL% /Target:Rebuild /Property:Configuration=%_BUILD_CONFIG% /Property:Platform=Win32 & goto :EOF - +if not "%_VC_VER%" == "2022" goto _RunBuild +if not exist "%ProgramFiles%\Microsoft Visual Studio\2022\Community\MSBuild\Microsoft\VC\v150\Platforms\x64\PlatformToolsets\v141_xp" goto _RunBuild +for /F "usebackq tokens=1" %%a in (`findstr /C:"10.0" "%_BUILD_PROJECT_DIR%BuildROMs.vcxproj"`) do SET _X_PROJS_CONVERTED=%%a +if not "%_X_PROJS_CONVERTED%" == "" goto _RunBuild +echo Converting the VS2022 projects to generate XP compatible binaries +Powershell -NoLogo -File "%~dp0\Visual Studio Projects\ConvertToXPProject.ps1" "%~dp0\Visual Studio Projects\*.vcxproj" +set _X_PROJS_CONVERTED= +:_RunBuild +if "%_BUILD_PROJECTS%" == "" MSBuild /nologo "%_BUILD_PROJECT_DIR%Simh.sln" /maxCpuCount:%_BUILD_PARALLEL% /Target:Rebuild /Property:Configuration=%_BUILD_CONFIG% /Property:Platform=Win32 /fileLogger "/fileLoggerParameters:LogFile=%_BUILD_PROJECT_DIR%Build-VS%_VC_VER%.log" & goto :EOF set _BUILD_PROJECTS=%_BUILD_PROJECTS:~1% set _REBUILD_PROJECTS=%_REBUILD_PROJECTS:~1% -MSBuild /nologo "%_BUILD_PROJECT_DIR%Simh.sln" /maxCpuCount:%_BUILD_PARALLEL% /Target:%_REBUILD_PROJECTS% /Property:Configuration=%_BUILD_CONFIG% /Property:Platform=Win32 & goto :EOF +MSBuild /nologo "%_BUILD_PROJECT_DIR%Simh.sln" /maxCpuCount:%_BUILD_PARALLEL% /Target:%_REBUILD_PROJECTS% /Property:Configuration=%_BUILD_CONFIG% /Property:Platform=Win32 "/fileLoggerParameters:LogFile=%_BUILD_PROJECT_DIR%Build-VS%_VC_VER%.log" & goto :EOF