@@ -253,3 +253,166 @@ jobs:
253253 with :
254254 name : packages_windows
255255 path : ${{ github.workspace }}\artifacts
256+
257+ build-arm64 :
258+
259+ runs-on : windows-11-arm
260+
261+ steps :
262+ - name : Checkout
263+ uses : actions/checkout@v6
264+ with :
265+ submodules : true
266+ fetch-depth : 1
267+
268+ - name : Install .NET
269+ uses : actions/setup-dotnet@v5
270+ with :
271+ dotnet-version : |
272+ 10.0.x
273+
274+ - name : Restore vcpkg packages cache
275+ id : vcpkg-cache
276+ uses : actions/cache/restore@v5
277+ with :
278+ path : ${{ github.workspace }}/vcpkg_installed
279+ key : vcpkg-${{ hashFiles('vcpkg.json', 'cmake/triplets/*.cmake') }}-arm64-windows-static
280+
281+ - name : Update vcpkg to match builtin-baseline
282+ if : steps.vcpkg-cache.outputs.cache-hit != 'true'
283+ run : |
284+ $baseline = (Get-Content vcpkg.json | ConvertFrom-Json).'builtin-baseline'
285+ git -C $env:VCPKG_INSTALLATION_ROOT fetch --depth=1 origin $baseline
286+ git -C $env:VCPKG_INSTALLATION_ROOT checkout $baseline
287+
288+ - name : Install vcpkg dependencies
289+ if : steps.vcpkg-cache.outputs.cache-hit != 'true'
290+ run : vcpkg install --triplet arm64-windows-static --overlay-triplets=${{ github.workspace }}/cmake/triplets --x-install-root=${{ github.workspace }}/vcpkg_installed
291+
292+ - name : Save vcpkg packages cache
293+ if : steps.vcpkg-cache.outputs.cache-hit != 'true'
294+ uses : actions/cache/save@v5
295+ with :
296+ path : ${{ github.workspace }}/vcpkg_installed
297+ key : vcpkg-${{ hashFiles('vcpkg.json', 'cmake/triplets/*.cmake') }}-arm64-windows-static
298+
299+ - name : Restore OpenCV cache
300+ id : opencv-cache
301+ uses : actions/cache/restore@v5
302+ with :
303+ path : ${{ github.workspace }}/opencv_artifacts
304+ key : opencv-${{ env.OPENCV_VERSION }}-windows-arm64-${{ hashFiles('cmake/opencv_build_options.cmake') }}-${{ hashFiles('vcpkg.json', 'cmake/triplets/*.cmake') }}
305+
306+ - name : Configure OpenCV
307+ if : steps.opencv-cache.outputs.cache-hit != 'true'
308+ shell : powershell
309+ run : |
310+ $ErrorActionPreference = 'Continue'
311+ cmake `
312+ -C cmake/opencv_build_options.cmake `
313+ -S opencv `
314+ -B opencv/build `
315+ -G "Visual Studio 17 2022" -A ARM64 `
316+ -D CMAKE_TOOLCHAIN_FILE="$env:VCPKG_INSTALLATION_ROOT/scripts/buildsystems/vcpkg.cmake" `
317+ -D VCPKG_TARGET_TRIPLET=arm64-windows-static `
318+ -D VCPKG_MANIFEST_INSTALL=OFF `
319+ -D "VCPKG_INSTALLED_DIR=$env:GITHUB_WORKSPACE/vcpkg_installed" `
320+ -D "VCPKG_OVERLAY_TRIPLETS=$env:GITHUB_WORKSPACE/cmake/triplets" `
321+ -D OPENCV_EXTRA_MODULES_PATH="$env:GITHUB_WORKSPACE/opencv_contrib/modules" `
322+ -D CMAKE_INSTALL_PREFIX="$env:GITHUB_WORKSPACE/opencv_artifacts" `
323+ -D WITH_FFMPEG=OFF `
324+ *>&1 | Tee-Object -FilePath "$env:TEMP\opencv-configure.log"
325+ if ($LASTEXITCODE -ne 0) { exit $LASTEXITCODE }
326+
327+ - name : Verify OpenCV cmake features
328+ if : steps.opencv-cache.outputs.cache-hit != 'true'
329+ shell : powershell
330+ run : |
331+ $log = Get-Content "$env:TEMP\opencv-configure.log" -Raw
332+ $features = @('Tesseract', 'JPEG', 'PNG', 'TIFF', 'WEBP')
333+ $fail = $false
334+ foreach ($f in $features) {
335+ $m = [regex]::Match($log, "(?m)^--\s+${f}:\s+(.+)$")
336+ if ($m.Success -and $m.Groups[1].Value.Trim() -notmatch '^NO\b') {
337+ Write-Host "OK: $f = $($m.Groups[1].Value.Trim())"
338+ } else {
339+ Write-Host "MISSING or DISABLED: $f"
340+ $log -split "`n" | Select-String -Pattern $f | Select-Object -Last 3 | ForEach-Object { Write-Host $_ }
341+ $fail = $true
342+ }
343+ }
344+ if ($fail) { exit 1 }
345+
346+ - name : Build OpenCV
347+ if : steps.opencv-cache.outputs.cache-hit != 'true'
348+ shell : powershell
349+ run : |
350+ cmake --build opencv/build --config Release -j 4
351+ cmake --install opencv/build --config Release
352+
353+ - name : Save OpenCV cache
354+ if : steps.opencv-cache.outputs.cache-hit != 'true' && github.event_name == 'push' && github.ref == 'refs/heads/main'
355+ uses : actions/cache/save@v5
356+ with :
357+ path : ${{ github.workspace }}/opencv_artifacts
358+ key : opencv-${{ env.OPENCV_VERSION }}-windows-arm64-${{ hashFiles('cmake/opencv_build_options.cmake') }}-${{ hashFiles('vcpkg.json', 'cmake/triplets/*.cmake') }}
359+
360+ - name : Build OpenCvSharpExtern (full)
361+ shell : powershell
362+ run : |
363+ $ErrorActionPreference = "Stop"
364+ cmake `
365+ -S src `
366+ -B src/build_arm64 `
367+ -G "Visual Studio 17 2022" -A ARM64 `
368+ -D CMAKE_PREFIX_PATH="$env:GITHUB_WORKSPACE/opencv_artifacts" `
369+ -D CMAKE_TOOLCHAIN_FILE="$env:VCPKG_INSTALLATION_ROOT/scripts/buildsystems/vcpkg.cmake" `
370+ -D VCPKG_TARGET_TRIPLET=arm64-windows-static `
371+ -D VCPKG_MANIFEST_INSTALL=OFF `
372+ -D "VCPKG_INSTALLED_DIR=$env:GITHUB_WORKSPACE/vcpkg_installed" `
373+ -D "VCPKG_OVERLAY_TRIPLETS=$env:GITHUB_WORKSPACE/cmake/triplets"
374+ cmake --build src/build_arm64 --config Release -j 4
375+
376+ - name : Build OpenCvSharpExtern (slim)
377+ shell : powershell
378+ run : |
379+ $ErrorActionPreference = "Stop"
380+ cmake `
381+ -S src `
382+ -B src/build_arm64_slim `
383+ -G "Visual Studio 17 2022" -A ARM64 `
384+ -D CMAKE_PREFIX_PATH="$env:GITHUB_WORKSPACE/opencv_artifacts" `
385+ -D CMAKE_TOOLCHAIN_FILE="$env:VCPKG_INSTALLATION_ROOT/scripts/buildsystems/vcpkg.cmake" `
386+ -D VCPKG_TARGET_TRIPLET=arm64-windows-static `
387+ -D VCPKG_MANIFEST_INSTALL=OFF `
388+ -D "VCPKG_INSTALLED_DIR=$env:GITHUB_WORKSPACE/vcpkg_installed" `
389+ -D "VCPKG_OVERLAY_TRIPLETS=$env:GITHUB_WORKSPACE/cmake/triplets" `
390+ -D NO_CONTRIB=ON `
391+ -D NO_VIDEOIO=ON `
392+ -D NO_HIGHGUI=ON `
393+ -D NO_DNN=ON `
394+ -D NO_INSTALL_TO_TEST=ON
395+ cmake --build src/build_arm64_slim --config Release -j 4
396+
397+ - name : Test
398+ shell : cmd
399+ run : dotnet test test\OpenCvSharp.Tests -c Release -f net10.0 --runtime win-arm64 --filter "FullyQualifiedName!=OpenCvSharp.Tests.Core.BuildConfigurationTest.FFMPEG_IsEnabled"
400+
401+ - name : Pack NuGet packages
402+ shell : pwsh
403+ run : |
404+ $ErrorActionPreference = "Stop"
405+ $PSNativeCommandUseErrorActionPreference = $true
406+
407+ $date = Get-Date -Format "yyyyMMdd"
408+ $version = "${env:OPENCV_VERSION}.${date}-beta"
409+ Write-Host "version = ${version}"
410+
411+ dotnet pack nuget/OpenCvSharp4.runtime.win-arm64.csproj -o artifacts -p:Version=$version
412+ dotnet pack nuget/OpenCvSharp4.runtime.win-arm64.slim.csproj -o artifacts -p:Version=$version
413+
414+ - name : Upload NuGet packages
415+ uses : actions/upload-artifact@v6
416+ with :
417+ name : packages_windows_arm64
418+ path : ${{ github.workspace }}\artifacts
0 commit comments