summaryrefslogtreecommitdiff
path: root/Build-Samples.ps1
diff options
context:
space:
mode:
Diffstat (limited to 'Build-Samples.ps1')
-rw-r--r--Build-Samples.ps1145
1 files changed, 24 insertions, 121 deletions
diff --git a/Build-Samples.ps1 b/Build-Samples.ps1
index 7eafb54d..a73a2afa 100644
--- a/Build-Samples.ps1
+++ b/Build-Samples.ps1
@@ -7,7 +7,7 @@
1. Ensures a developer build environment (VS DevShell or EWDK) is active
2. Discovers samples via ListAllSamples.ps1 (or uses the -Samples parameter if provided)
- 3. Detects the build environment (GitHub CI, NuGet, EWDK, or WDK) and build number
+ 3. Resolves the build environment (auto-detected or forced via -RunMode) and build number
4. Loads exclusions from exclusions.csv (supports wildcard paths)
5. Builds all non-excluded sample/configuration/platform combinations in parallel
6. Generates CSV and HTML overview reports
@@ -38,6 +38,10 @@
Additional InfVerif options (e.g. '/samples', '/msft'). If not provided, determined
automatically based on the WDK build number.
+.PARAMETER RunMode
+ Selects the build environment mode. Valid values: Auto, WDK, NuGet, EWDK.
+ Defaults to 'Auto', which detects the environment automatically (NuGet → EWDK → WDK).
+
.PARAMETER ThrottleLimit
Maximum parallel build jobs. Defaults to 5 x logical processors.
@@ -60,6 +64,11 @@
.\Build-Samples -ThrottleLimit 8
Discovers all samples and builds them with limited parallelism.
+
+.EXAMPLE
+ .\Build-Samples -RunMode WDK
+
+ Forces WDK mode regardless of environment variables.
#>
#Requires -Version 7.0
@@ -72,6 +81,8 @@ param(
[string]$LogFilesDirectory = (Join-Path (Get-Location) "_logs"),
[string]$ReportFileName = $(if ([string]::IsNullOrEmpty($env:WDS_ReportFileName)) { "_overview" } else { $env:WDS_ReportFileName }),
[string]$InfOptions,
+ [ValidateSet('Auto', 'WDK', 'NuGet', 'EWDK')]
+ [string]$RunMode = 'Auto',
[int]$ThrottleLimit = 0
)
@@ -79,108 +90,7 @@ param(
# Helper Functions
# =============================================================================
-function Initialize-DevShell {
- <#
- .SYNOPSIS Imports the Visual Studio Developer PowerShell if not already active.
- #>
- param([string]$ReturnToDirectory)
-
- if ($env:VSCMD_VER) {
- Write-Verbose "VS Developer Shell already active (VSCMD_VER=$env:VSCMD_VER)."
- return
- }
-
- $devShellDll = Resolve-Path "$env:ProgramFiles\Microsoft Visual Studio\*\*\Common7\Tools\Microsoft.VisualStudio.DevShell.dll" `
- -ErrorAction SilentlyContinue | Select-Object -First 1
- if (-not $devShellDll) {
- Write-Error "Visual Studio Developer Shell module not found."
- exit 1
- }
-
- Import-Module $devShellDll.Path
- $vsInstall = Resolve-Path "$env:ProgramFiles\Microsoft Visual Studio\*\*" | Select-Object -First 1
- Enter-VsDevShell -VsInstallPath $vsInstall.Path
- Set-Location $ReturnToDirectory
-}
-
-function Assert-MsBuildAvailable {
- <#
- .SYNOPSIS Verifies msbuild.exe is on PATH. Exits with error if not found.
- #>
- $savedPref = $ErrorActionPreference
- $ErrorActionPreference = 'Stop'
- try {
- Get-Command 'msbuild' | Out-Null
- }
- catch {
- Write-Error "msbuild cannot be called from current environment. Ensure it is on PATH (run from VS Developer Command Prompt or EWDK)."
- exit 1
- }
- finally {
- $ErrorActionPreference = $savedPref
- }
-}
-
-function Resolve-BuildEnvironment {
- <#
- .SYNOPSIS
- Detects the active build environment and returns metadata.
- .DESCRIPTION
- Checks (in priority order) for GitHub CI, local NuGet packages, EWDK, or WDK.
- Returns a hashtable: Name, BuildNumber (int), NuGetVersion, WdkVsComponentVersion.
- #>
- param([string]$RepoRoot)
-
- $result = @{
- Name = ''
- BuildNumber = [int]0
- NuGetVersion = ''
- WdkVsComponentVersion = ''
- }
-
- if ($env:GITHUB_REPOSITORY) {
- $result.Name = 'GitHub'
- $wdkPackage = Get-ChildItem "$RepoRoot\packages\*WDK.x64*" -Name -ErrorAction SilentlyContinue
- $result.NuGetVersion = ([regex]'(?<=x64\.)(\d+\.){3}\d+').Match($wdkPackage).Value
- $result.BuildNumber = [int]($result.NuGetVersion.Split('.')[2])
- }
- elseif (Test-Path "$RepoRoot\packages\*") {
- $result.Name = 'NuGet'
- $wdkPackage = Get-ChildItem "$RepoRoot\packages\*WDK.x64*" -Name -ErrorAction SilentlyContinue
- $result.NuGetVersion = ([regex]'(?<=x64\.)(\d+\.){3}\d+').Match($wdkPackage).Value
- $result.BuildNumber = [int]($result.NuGetVersion.Split('.')[2])
- }
- elseif ($env:BuildLab -match '^(?<branch>[^.]+)\.(?<build>\d+)\.(?<qfe>[^.]+)$') {
- $result.Name = "EWDK.$($Matches.branch).$($Matches.build).$($Matches.qfe)"
- $result.BuildNumber = [int]$Matches.build
- }
- elseif ($env:UCRTVersion -match '10\.0\.(?<build>\d+)\.0') {
- $result.Name = 'WDK'
- $result.BuildNumber = [int]$Matches.build
- }
- else {
- Write-Output "Environment variables {"
- Get-ChildItem env:* | Sort-Object Name
- Write-Output "Environment variables }"
- Write-Error "Could not determine build environment. Ensure EWDK, WDK, or NuGet packages are configured."
- exit 1
- }
-
- # WDK VS component version (EWDK does not ship this metadata)
- if ($result.Name -match '^EWDK') {
- $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."
- exit 1
- }
- $result.WdkVsComponentVersion = [regex]::Match($vsComponent.Name, '(\d+\.){3}\d+').Value
- }
-
- return $result
-}
+. (Join-Path $PSScriptRoot 'BuildEnvironment.ps1')
function Import-SampleExclusions {
<#
@@ -382,9 +292,9 @@ function Build-SingleSample {
# Step 1 - Prepare Build Environment
# =============================================================================
-$root = (Get-Location).Path
-
-Initialize-DevShell -ReturnToDirectory $root
+$root = (Get-Location).Path
+$buildEnv = Resolve-BuildEnvironment -RepoRoot $root -RunMode $RunMode
+$buildNumber = $buildEnv.BuildNumber
Assert-MsBuildAvailable
# =============================================================================
@@ -467,14 +377,7 @@ if ($sampleSet.Count -eq 0) {
}
# =============================================================================
-# Step 5 - Detect Build Environment
-# =============================================================================
-
-$buildEnv = Resolve-BuildEnvironment -RepoRoot $root
-$buildNumber = $buildEnv.BuildNumber
-
-# =============================================================================
-# Step 6 - Determine InfVerif Options
+# Step 5 - Determine InfVerif Options
# =============================================================================
#
# Samples must build cleanly, but certain InfVerif warnings are acceptable because
@@ -490,13 +393,13 @@ else {
}
# =============================================================================
-# Step 7 - Load Exclusions
+# Step 6 - Load Exclusions
# =============================================================================
$exclusions = Import-SampleExclusions -CsvPath (Join-Path $root 'exclusions.csv') -BuildNumber $buildNumber
# =============================================================================
-# Step 8 - Print Build Plan
+# Step 7 - Print Build Plan
# =============================================================================
$combinationsTotal = $sampleSet.Count * $Configurations.Count * $Platforms.Count
@@ -529,7 +432,7 @@ Write-Output ""
Write-Output "Building all combinations..."
# =============================================================================
-# Step 9 - Execute Parallel Builds
+# Step 8 - Execute Parallel Builds
# =============================================================================
# Shared mutable state protected by a Mutex. This is required because
@@ -677,7 +580,7 @@ $stopwatch.Stop()
Write-Host ""
# =============================================================================
-# Step 10 - Report Failures
+# Step 9 - Report Failures
# =============================================================================
Write-Output ""
@@ -716,7 +619,7 @@ if ($buildState.SporadicSet.Count -gt 0) {
}
# =============================================================================
-# Step 11 - Final Summary
+# Step 10 - Final Summary
# =============================================================================
$elapsed = $stopwatch.Elapsed
@@ -742,7 +645,7 @@ Write-Output " HTML report: $reportHtmlPath"
Write-Output "--------------------------------------------------------------------"
# =============================================================================
-# Step 12 - Generate Reports
+# Step 11 - Generate Reports
# =============================================================================
$sortedResults = $buildState.Results | Sort-Object { $_.Sample }
@@ -750,6 +653,6 @@ $sortedResults | ConvertTo-Csv | Out-File $reportCsvPath
$sortedResults | ConvertTo-Html -Title "WDK Sample Build Overview" | Out-File $reportHtmlPath
# Only open the HTML report interactively (not in CI/automation)
-if (-not $env:GITHUB_REPOSITORY -and -not $env:BUILD_BUILDID -and [Environment]::UserInteractive) {
+if (-not $env:BUILD_BUILDID -and [Environment]::UserInteractive) {
Invoke-Item $reportHtmlPath
}