X-Git-Url: https://vilimpoc.org/repos/dotfiles/blobdiff_plain/d68d73b6badfe1170a30008073d69fbcc38d80c1..422ce8c735062050411d37ea8958eb3f71a42eea:/setup-windows.bat diff --git a/setup-windows.bat b/setup-windows.bat index cc12420..250d4cb 100644 --- a/setup-windows.bat +++ b/setup-windows.bat @@ -7,17 +7,45 @@ @rem --- Non-admin (per-user) winget installs --- winget install Anthropic.ClaudeCode winget install Git.Git +winget install Microsoft.DotNet.SDK.10 winget install Microsoft.PowerShell Microsoft.Sysinternals.ProcessExplorer Microsoft.Sysinternals.ProcessMonitor Microsoft.Sysinternals.SDelete Microsoft.VisualStudioCode Microsoft.WindowsTerminal winget install Oracle.VirtualBox winget install Python.Python.3.13 winget install WinMerge.WinMerge -winget install WiXToolset.WiXCLI @rem OpenCppCoverage: native (PE) line coverage for the C++ binaries. run-coverage-occ.py drives the @rem pytest suite under it to produce an HTML report (the binaries under test build with PDBs, @rem which it reads). The installer elevates via UAC. winget install OpenCppCoverage.OpenCppCoverage +@rem --- WiX 5.0.2, pinned on purpose --- +@rem WiX packages our proprietary software into MSIs, and the version is pinned to keep that +@rem free of a fee. 5.0.2 is the last release distributed under the Microsoft Reciprocal +@rem License alone. From 6.0 onward the package also carries OSMFEULA.txt, an Open Source +@rem Maintenance Fee agreement: a monthly fee owed by anyone who uses the PREBUILT BINARIES +@rem as part of revenue-generating activity and has annual gross revenue >= US$10,000. +@rem +@rem It is a fee for the binaries, not a restriction on what we ship - MS-RL is file-scoped +@rem and never reached the MSIs WiX builds, under any version - but 5.0.2 owes nothing. +@rem The 6.x/7.x SOURCE is still MS-RL too, so self-compiling is another way out; a pin is +@rem the cheaper one. This replaces `winget install WiXToolset.WiXCLI`, which has no version +@rem selector and so installs the latest (7.0.0 today, EULA and all). +@rem +@rem PIN THE MSBUILD SIDE TOO. A .wixproj referencing WixToolset.Sdk without a version +@rem resolves to the latest - 7.x, same EULA - and nothing here constrains it. Pin it in the +@rem project: . +@rem +@rem dotnet.exe is called by full path: winget put the SDK on the machine PATH a few lines +@rem ago, but this cmd session inherited its environment before that and cannot see it. +@rem install-then-update is for re-runs - install fails once the tool is there, and update +@rem then holds it at exactly 5.0.2 - which keeps this script idempotent like the rest. +set "DOTNET_EXE=%ProgramFiles%\dotnet\dotnet.exe" +"%DOTNET_EXE%" tool install --global wix --version 5.0.2 || "%DOTNET_EXE%" tool update --global wix --version 5.0.2 + +@rem Report what the pin actually produced. By full path again, and because the shim lands in +@rem a directory this session's PATH predates: expect "5.0.2+", not 7.x. +"%USERPROFILE%\.dotnet\tools\wix.exe" --version + @rem --------------------------------------------------------------------------- @rem No package manager needed for the Windows build @rem @@ -28,10 +56,25 @@ winget install OpenCppCoverage.OpenCppCoverage @rem --- Elevated installs (VS2022, WDK, system tools) --- @rem The elevated script runs in its own window and logs to setup-windows-uac.log. @rem -PassThru + $p.ExitCode propagates its real exit code back through to ERRORLEVEL. +@rem +@rem -TraceUser passes YOU across the UAC boundary. Accepting that prompt with an +@rem administrator's credentials runs the elevated half AS that administrator, so +@rem it cannot see whose box this is; the account named here is the one it grants +@rem non-elevated ETW collection rights to (xperf / wpr without a UAC prompt). +@rem +@rem The two values go through the environment, and the quotes the child needs +@rem around them are built in PowerShell as [char]34, so the command line below +@rem contains no embedded quote characters at all. Writing them inline as "".."" +@rem works for ONE argument and quietly breaks at two: the quote-state parsing +@rem swallows everything after the first into the -File value, and the elevated +@rem PowerShell dies with "failed because the file does not have a '.ps1' +@rem extension" and exit code -196608 (0xFFFD0000) before it can log a thing. set "UAC_LOG=%~dp0setup-windows-uac.log" if exist "%UAC_LOG%" del "%UAC_LOG%" +set "UAC_SCRIPT=%~dp0setup-windows-with-uac.ps1" +set "UAC_TRACE_USER=%USERDOMAIN%\%USERNAME%" -powershell -NoProfile -Command "$p = Start-Process powershell -Verb RunAs -ArgumentList '-NoProfile','-ExecutionPolicy','Bypass','-File','""%~dp0setup-windows-with-uac.ps1""' -Wait -PassThru; exit $p.ExitCode" +powershell -NoProfile -Command "$q = [char]34; $p = Start-Process powershell -Verb RunAs -ArgumentList '-NoProfile','-ExecutionPolicy','Bypass','-File',($q + $env:UAC_SCRIPT + $q),'-TraceUser',($q + $env:UAC_TRACE_USER + $q) -Wait -PassThru; exit $p.ExitCode" set "UAC_RC=%ERRORLEVEL%" @rem --- Surface the elevated session's output (its window has already closed) ---