summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.github/scripts/Build-ChangedProjects.ps134
-rw-r--r--.github/workflows/ci-pr.yml40
-rw-r--r--.github/workflows/ci.yml35
-rw-r--r--.gitignore6
-rw-r--r--Build-AllProjects.ps115
-rw-r--r--Build-Project.ps164
-rw-r--r--Build-ProjectSet.ps138
-rw-r--r--exclusions.csv15
8 files changed, 246 insertions, 1 deletions
diff --git a/.github/scripts/Build-ChangedProjects.ps1 b/.github/scripts/Build-ChangedProjects.ps1
new file mode 100644
index 00000000..e163e5f9
--- /dev/null
+++ b/.github/scripts/Build-ChangedProjects.ps1
@@ -0,0 +1,34 @@
+param (
+ [array]$ChangedFiles
+)
+
+$root = (Get-Location).Path
+
+# To include in CI gate
+$projectSet = @{}
+foreach ($file in $ChangedFiles)
+{
+ if (-not (Test-Path $file)) {
+ Write-Output "❔ Changed file $file cannot be found"
+ continue
+ }
+ $dir = (Get-Item $file).DirectoryName
+ while ((-not ($slnItems = (Get-ChildItem $dir '*.sln'))) -and ($dir -ne $root))
+ {
+ $dir = (Get-Item $dir).Parent.FullName
+ }
+ if ($dir -eq $root)
+ {
+ Write-Output "❔ Changed file $file does not match a project."
+ continue
+ }
+ $projectName = $dir.Replace($root, '').Trim('\').Replace('\', '.').ToLower()
+ Write-Output "🔎 Found project [$projectName] at $dir from changed file $file"
+ if (-not ($projectSet.ContainsKey($projectName)))
+ {
+ $projectSet[$projectName] = $dir
+ }
+}
+
+.\Build-ProjectSet -ProjectSet $projectSet
+
diff --git a/.github/workflows/ci-pr.yml b/.github/workflows/ci-pr.yml
new file mode 100644
index 00000000..12062b34
--- /dev/null
+++ b/.github/workflows/ci-pr.yml
@@ -0,0 +1,40 @@
+name: Build changes to driver samples
+on:
+ pull_request:
+ branches:
+ - main
+ - develop
+ paths-ignore:
+ - '**.md'
+ - 'LICENSE'
+jobs:
+ build:
+ strategy:
+ fail-fast: false
+ matrix:
+ configuration: [Debug, Release]
+ platform: [x64, arm64]
+ runs-on: windows-2019
+ env:
+ Solution_Path: general\echo\kmdf\kmdfecho.sln
+ steps:
+ - name: Check out repository code
+ uses: actions/checkout@v3
+ with:
+ submodules: 'recursive'
+
+ - name: Add MSBuild to PATH
+ uses: microsoft/[email protected]
+
+ - name: Get changed files
+ id: get-changed-files
+ uses: tj-actions/changed-files@v27
+
+ - name: Retrieve and build solutions from changed files
+ id: build-changed-projects
+ run: |
+ $changedFiles = "${{ steps.get-changed-files.outputs.all_changed_files }}".Split(' ')
+ .\.github\scripts\Build-ChangedProjects.ps1 -ChangedFiles $changedFiles
+ env:
+ Configuration: ${{ matrix.configuration }}
+ Platform: ${{ matrix.platform }}
diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
new file mode 100644
index 00000000..68b46552
--- /dev/null
+++ b/.github/workflows/ci.yml
@@ -0,0 +1,35 @@
+name: Build all driver samples
+on:
+ push:
+ branches:
+ - main
+ - develop
+ paths-ignore:
+ - '**.md'
+ - 'LICENSE'
+jobs:
+ build:
+ strategy:
+ fail-fast: false
+ matrix:
+ configuration: [Debug, Release]
+ platform: [x64, arm64]
+ runs-on: windows-2019
+ env:
+ Solution_Path: general\echo\kmdf\kmdfecho.sln
+ steps:
+ - name: Check out repository code
+ uses: actions/checkout@v3
+ with:
+ submodules: 'recursive'
+
+ - name: Add MSBuild to PATH
+ uses: microsoft/[email protected]
+
+ - name: Retrieve and build all available solutions
+ id: build-all-projects
+ run: |
+ .\Build-AllProjects.ps1
+ env:
+ Configuration: ${{ matrix.configuration }}
+ Platform: ${{ matrix.platform }}
diff --git a/.gitignore b/.gitignore
index f227925f..995bfc8e 100644
--- a/.gitignore
+++ b/.gitignore
@@ -20,9 +20,12 @@ bld/
[Bb]in/
[Oo]bj/
-# Visual Studo 2015 cache/options directory
+# Visual Studio 2015 cache/options directory
.vs/
+# Visual Studio Code directory
+.vscode/
+
# MSTest test Results
[Tt]est[Rr]esult*/
[Bb]uild[Ll]og.*
@@ -54,6 +57,7 @@ dlldata.c
*.tmp
*.tmp_proj
*.log
+*.tlog
*.vspscc
*.vssscc
.builds
diff --git a/Build-AllProjects.ps1 b/Build-AllProjects.ps1
new file mode 100644
index 00000000..4738907c
--- /dev/null
+++ b/Build-AllProjects.ps1
@@ -0,0 +1,15 @@
+$root = Get-Location
+$solutionFiles = Get-ChildItem -Path $root -Recurse -Filter *.sln | Select-Object -ExpandProperty FullName
+
+# To include in CI gate
+$projectSet = @{}
+foreach ($file in $solutionFiles)
+{
+ $dir = (Get-Item $file).DirectoryName
+ $dir_norm = $dir.Replace($root, '').Trim('\').Replace('\', '.').ToLower()
+ echo "🔎 Found project [$dir_norm] at $dir"
+ $projectSet[$dir_norm] = $dir
+}
+
+.\Build-ProjectSet -ProjectSet $projectSet
+
diff --git a/Build-Project.ps1 b/Build-Project.ps1
new file mode 100644
index 00000000..1f79b679
--- /dev/null
+++ b/Build-Project.ps1
@@ -0,0 +1,64 @@
+param(
+ $Directory,
+ [string]$ProjectName,
+ $LogFilesDirectory = "_logfiles",
+ [string]$Configuration = "Debug",
+ [string]$Platform = "x64"
+)
+
+# TODO Validate $Directory and $LogFilesDirectory
+New-Item -ItemType Directory -Force -Path $LogFilesDirectory | Out-Null
+
+if ([string]::IsNullOrWhitespace($ProjectName))
+{
+ $ProjectName = (Resolve-Path $Directory).Path.Replace((Get-Location), '').Replace('\', '.').Trim('.').ToLower()
+}
+
+$solutionFile = Get-ChildItem -Path $Directory -Filter *.sln | Select-Object -ExpandProperty FullName -First 1
+
+$configurationIsSupported = $false
+$inSolutionConfigurationPlatformsSection = $false
+foreach ($line in Get-Content -Path $solutionFile)
+{
+ if (-not $inSolutionConfigurationPlatformsSection -and $line -match "\s*GlobalSection\(SolutionConfigurationPlatforms\).*")
+ {
+ $inSolutionConfigurationPlatformsSection = $true;
+ continue;
+ }
+ elseif ($line -match "\s*EndGlobalSection.*")
+ {
+ $inSolutionConfigurationPlatformsSection = $false;
+ continue;
+ }
+
+ if ($inSolutionConfigurationPlatformsSection)
+ {
+ [regex]$regex = ".*=\s*(?<ConfigString>(?<Configuration>.*)\|(?<Platform>.*))\s*"
+ $match = $regex.Match($line)
+ if ([string]::IsNullOrWhiteSpace($match.Groups["ConfigString"].Value) -or [string]::IsNullOrWhiteSpace($match.Groups["Platform"].Value))
+ {
+ Write-Warning "Could not parse configuration entry $line from file $solutionFile."
+ continue;
+ }
+ if ($match.Groups["Configuration"].Value.Trim() -eq $Configuration -and $match.Groups["Platform"].Value.Trim() -eq $Platform)
+ {
+ $configurationIsSupported = $true;
+ }
+ }
+}
+
+if (-not $configurationIsSupported)
+{
+ Write-Output "[$ProjectName] ⏩ Skipped. Configuration $Configuration|$Platform not supported."
+ exit 0
+}
+
+$errorLogFilePath = "$LogFilesDirectory\$ProjectName.err"
+$warnLogFilePath = "$LogFilesDirectory\$ProjectName.wrn"
+Write-Output "[$ProjectName] ⚒️ Building project..."
+msbuild $solutionFile -clp:Verbosity=m -t:clean,build -property:Configuration=$Configuration -property:Platform=$Platform -p:TargetVersion=Windows10 -p:InfVerif_AdditionalOptions="/msft /sw1205 /sw1324 /sw1420 /sw1421" -p:SignToolWS=/fdws -p:DriverCFlagAddOn=/wd4996 -flp1:errorsonly`;logfile=$errorLogFilePath -flp2:WarningsOnly`;logfile=$warnLogFilePath -noLogo
+if ($LASTEXITCODE -ne 0)
+{
+ Write-Warning "❌ Build failed. Log available at $errorLogFilePath"
+ exit 1
+}
diff --git a/Build-ProjectSet.ps1 b/Build-ProjectSet.ps1
new file mode 100644
index 00000000..57c4ac32
--- /dev/null
+++ b/Build-ProjectSet.ps1
@@ -0,0 +1,38 @@
+param(
+ [hashtable]$ProjectSet,
+ [string]$Configuration = $env:Configuration,
+ [string]$Platform = $env:Platform
+)
+
+#TODO validate params
+
+$exclusionsSet = @{}
+$failSet = @()
+Import-Csv 'exclusions.csv' | ForEach-Object {
+ $exclusionsSet[$_.Path.Replace($root, '').Trim('\').Replace('\', '.').ToLower()] = $_.Reason
+}
+
+$ProjectSet.GetEnumerator() | ForEach-Object {
+ $projectName = $_.Key
+ if ($exclusionsSet.ContainsKey($projectName))
+ {
+ Write-Output "[$projectName] ⏩ Excluded and skipped. Reason: $($exclusionsSet[$projectName])"
+ return;
+ }
+ $directory = $_.Value
+ .\Build-Project -Directory $directory -ProjectName $ProjectName -Configuration $Configuration -Platform $Platform
+ if ($LASTEXITCODE -ne 0)
+ {
+ $failSet += $ProjectName
+ }
+}
+
+if ($failSet.Count -gt 0)
+{
+ Write-Output "Some projects were built with errors:"
+ foreach ($failedProject in $failSet)
+ {
+ Write-Output "$failedProject"
+ }
+ Write-Error "Some projects were built with errors."
+} \ No newline at end of file
diff --git a/exclusions.csv b/exclusions.csv
new file mode 100644
index 00000000..71b0edf3
--- /dev/null
+++ b/exclusions.csv
@@ -0,0 +1,15 @@
+Path,Reason
+general\dchu\osrfx2_dchu_base,Wrong Toolset - needs migration
+general\dchu\osrfx2_dchu_extension_loose,Needs fix for project not found
+general\dchu\osrfx2_dchu_extension_tight,Wrong Toolset - needs migration
+general\filehistory,Deprecated APIs
+general\simplemediasource,ARM64 LNK1181: cannot open input file 'SimpleMediaSource.lib'
+general\winhec 2017 lab\toaster driver,Needs input from end user
+general\winhec 2017 lab\toaster support app,Needs input from end user
+network\trans\stmedit,Invalid Win32 architecture
+network\trans\wfpsampler,Missing INF section; missing libs
+network\wlan\wdi,Invalid architecture
+print\oem printer customization plug-in samples\c++,Invalid architecture
+print\v4printdriversamples\printerextensionsample,Invalid architecture
+tree,Missing headers
+video\indirectdisplay,ARM64 Warning C4530: C++ exception handler used, but unwind semantics are not enabled \ No newline at end of file