diff options
| author | 5an7y <[email protected]> | 2026-03-31 15:58:46 -0700 |
|---|---|---|
| committer | 5an7y <[email protected]> | 2026-03-31 16:22:25 -0700 |
| commit | 12f94c8573a5ef79abf7842d3ea0faf458c3f733 (patch) | |
| tree | 7489e982431897dc2fc9abb5143d6d0ae1cf9a2e | |
| parent | e021472d548bb26ff390b6b90b42caf21def7024 (diff) | |
fix: detect WDK component version from the selected VS installation
Previously, WdkVsComponentVersion was read from the global ProgramData
package cache, which is shared across all VS installations and could
return the wrong version when multiple installs are present.
- Add -include packages to the vswhere call in Get-VsInstallationsWithWdk
so each returned installation includes its WdkVsComponentVersion
- Initialize-DevShell now returns the selected installation object
- Resolve-BuildEnvironment accepts an optional -VsInstallation parameter;
when provided it reuses the already-selected install (no second prompt);
when absent (Dev Shell was pre-active) it calls Select-VsInstallation once
- Build-Samples.ps1 threads the result of Initialize-DevShell through to
Resolve-BuildEnvironment
Co-authored-by: Copilot <[email protected]>
| -rw-r--r-- | Build-Samples.ps1 | 4 | ||||
| -rw-r--r-- | BuildEnvironment.ps1 | 34 |
2 files changed, 26 insertions, 12 deletions
diff --git a/Build-Samples.ps1 b/Build-Samples.ps1 index 3dcbaa94..50f48949 100644 --- a/Build-Samples.ps1 +++ b/Build-Samples.ps1 @@ -300,7 +300,7 @@ function Build-SingleSample { $root = (Get-Location).Path -Initialize-DevShell -ReturnToDirectory $root +$selectedVsInstall = Initialize-DevShell -ReturnToDirectory $root Assert-MsBuildAvailable # ============================================================================= @@ -386,7 +386,7 @@ if ($sampleSet.Count -eq 0) { # Step 5 - Detect Build Environment # ============================================================================= -$buildEnv = Resolve-BuildEnvironment -RepoRoot $root -RunMode $RunMode +$buildEnv = Resolve-BuildEnvironment -RepoRoot $root -RunMode $RunMode -VsInstallation $selectedVsInstall $buildNumber = $buildEnv.BuildNumber # ============================================================================= diff --git a/BuildEnvironment.ps1 b/BuildEnvironment.ps1 index b0b03ee1..285f3d7e 100644 --- a/BuildEnvironment.ps1 +++ b/BuildEnvironment.ps1 @@ -18,12 +18,14 @@ function Get-VsInstallationsWithWdk { exit 1 } - $json = & $vswhere -all -format json -requires Microsoft.Windows.DriverKit 2>$null + $json = & $vswhere -all -format json -requires Microsoft.Windows.DriverKit -include packages 2>$null $installations = $json | ConvertFrom-Json return $installations | ForEach-Object { + $wdkPackage = $_.packages | Where-Object { $_.id -eq 'Microsoft.Windows.DriverKit' } | Select-Object -First 1 [PSCustomObject]@{ - DisplayName = $_.displayName - InstallationPath = $_.installationPath + DisplayName = $_.displayName + InstallationPath = $_.installationPath + WdkVsComponentVersion = $wdkPackage.version } } } @@ -67,13 +69,19 @@ function Select-VsInstallation { function Initialize-DevShell { <# - .SYNOPSIS Imports the Visual Studio Developer PowerShell if not already active. + .SYNOPSIS + Imports the Visual Studio Developer PowerShell if not already active. + .OUTPUTS + Returns the selected VS installation object ({ DisplayName, InstallationPath, + WdkVsComponentVersion }), or $null if the shell was already active. + Callers should pass the returned object to Resolve-BuildEnvironment so VS + selection happens exactly once. #> param([string]$ReturnToDirectory) if ($env:VSCMD_VER) { Write-Verbose "VS Developer Shell already active (VSCMD_VER=$env:VSCMD_VER)." - return + return $null } $vsInstall = Select-VsInstallation (Get-VsInstallationsWithWdk) @@ -87,6 +95,7 @@ function Initialize-DevShell { Import-Module $devShellDll Enter-VsDevShell -VsInstallPath $vsInstall.InstallationPath Set-Location $ReturnToDirectory + return $vsInstall } function Assert-MsBuildAvailable { @@ -115,11 +124,14 @@ function Resolve-BuildEnvironment { When RunMode is 'Auto', checks in priority order: NuGet, EWDK, WDK. When RunMode is 'Github', behaves identically to 'NuGet' and sets IsGithubMode. When RunMode is explicitly set to WDK/NuGet/EWDK, skips detection and uses that mode. + Pass the VsInstallation returned by Initialize-DevShell to avoid prompting the user + a second time when multiple VS installations are present. Returns a hashtable: Name, BuildNumber (int), NuGetVersion, WdkVsComponentVersion, IsGithubMode. #> param( [string]$RepoRoot, - [string]$RunMode = 'Auto' + [string]$RunMode = 'Auto', + [object]$VsInstallation = $null ) $result = @{ @@ -180,12 +192,14 @@ function Resolve-BuildEnvironment { $result.WdkVsComponentVersion = '(not available for EWDK builds)' } else { - $vsComponent = Get-ChildItem "${env:ProgramData}\Microsoft\VisualStudio\Packages\Microsoft.Windows.DriverKit,version=*" -ErrorAction SilentlyContinue - if (-not $vsComponent) { - Write-Error "WDK Visual Studio Component not found. Ensure the WDK Component is installed." + # Re-use the installation selected during Initialize-DevShell if available, + # otherwise query vswhere again (e.g. when the Dev Shell was already active). + $vsInstall = if ($VsInstallation) { $VsInstallation } else { Select-VsInstallation (Get-VsInstallationsWithWdk) } + if (-not $vsInstall.WdkVsComponentVersion) { + Write-Error "Could not determine WDK component version for '$($vsInstall.DisplayName)'. Ensure the WDK Visual Studio component is installed." exit 1 } - $result.WdkVsComponentVersion = [regex]::Match($vsComponent.Name, '(\d+\.){3}\d+').Value + $result.WdkVsComponentVersion = $vsInstall.WdkVsComponentVersion } return $result |
