diff --git a/.github/actions/run-tests/action.yaml b/.github/actions/run-tests/action.yaml index f265e4c68..99eeb710c 100644 --- a/.github/actions/run-tests/action.yaml +++ b/.github/actions/run-tests/action.yaml @@ -38,4 +38,4 @@ runs: if: ${{ runner.os == 'Windows' }} shell: pwsh run: | - ${{ inputs.workingDirectory }}/build_x64/tests/${{ inputs.config }}/advanced-scene-switcher-tests.exe + ${{ inputs.workingDirectory }}/build_${{ inputs.target }}/tests/${{ inputs.config }}/advanced-scene-switcher-tests.exe diff --git a/.github/scripts/Build-Deps-Windows.ps1 b/.github/scripts/Build-Deps-Windows.ps1 index 416d93635..f8364f9eb 100644 --- a/.github/scripts/Build-Deps-Windows.ps1 +++ b/.github/scripts/Build-Deps-Windows.ps1 @@ -2,7 +2,7 @@ param( [ValidateSet('Debug', 'RelWithDebInfo', 'Release', 'MinSizeRel')] [string] $Configuration = 'RelWithDebInfo', - [ValidateSet('x86', 'x64')] + [ValidateSet('x86', 'x64', 'arm64')] [string] $Target, [ValidateSet('Visual Studio 17 2022', 'Visual Studio 16 2019')] [string] $CMakeGenerator, @@ -69,7 +69,7 @@ function Build { $CmakeArgs += ('--debug-output') } - $Preset = "windows-$(if ( $Env:CI -ne $null ) { 'ci-' })${Target}" + $Preset = "windows-$(if ( $null -ne $Env:CI ) { 'ci-' })${Target}" $CmakeArgs += @( '--preset', $Preset @@ -209,13 +209,14 @@ function Build { $msbuildExe = vswhere -latest -requires Microsoft.Component.MSBuild -find MSBuild\**\Bin\MSBuild.exe | select-object -first 1 if ($msbuildExe) { + $LibusbPlatform = if ($Target -eq 'arm64') { 'arm64' } else { 'x64' } $env:CL="/wd5287" - Invoke-External $msbuildExe "${LibusbPath}/msvc/libusb.sln" /property:Configuration=Release /property:Platform=x64 + Invoke-External $msbuildExe "${LibusbPath}/msvc/libusb.sln" /property:Configuration=Release /property:Platform=$LibusbPlatform Remove-Item Env:CL - $libusbBuildResultDirectory = "${LibusbPath}/build/v143/x64/Release" + $libusbBuildResultDirectory = "${LibusbPath}/build/v143/${LibusbPlatform}/Release" if (-not (Test-Path -Path $libusbBuildResultDirectory)) { - $libusbBuildResultDirectory = "${LibusbPath}/x64/Release/dll" + $libusbBuildResultDirectory = "${LibusbPath}/${LibusbPlatform}/Release/dll" } Copy-Item -Path "${libusbBuildResultDirectory}/*" -Destination ${ADVSSDepPath} -Recurse -Force } else { @@ -245,9 +246,10 @@ function Build { if ($opensslDir) { Write-Host "Detected OpenSSL at: $opensslDir" + $OpenSSLArch = if ($Target -eq 'arm64') { 'arm64' } else { 'x64' } $MqttCmakeArgs += "-DOPENSSL_ROOT_DIR=$opensslDir" - $MqttCmakeArgs += "-DOPENSSL_CRYPTO_LIBRARY=$opensslDir\lib\VC\x64\MD\libcrypto.lib" - $MqttCmakeArgs += "-DOPENSSL_SSL_LIBRARY=$opensslDir\lib\VC\x64\MD\libssl.lib" + $MqttCmakeArgs += "-DOPENSSL_CRYPTO_LIBRARY=$opensslDir\lib\VC\$OpenSSLArch\MD\libcrypto.lib" + $MqttCmakeArgs += "-DOPENSSL_SSL_LIBRARY=$opensslDir\lib\VC\$OpenSSLArch\MD\libssl.lib" } else { Write-Warning "OpenSSL not found - maybe cmake will find it ..." } diff --git a/.github/scripts/Build-Windows.ps1 b/.github/scripts/Build-Windows.ps1 index 2958507cc..6f373e37f 100644 --- a/.github/scripts/Build-Windows.ps1 +++ b/.github/scripts/Build-Windows.ps1 @@ -1,6 +1,6 @@ [CmdletBinding()] param( - [ValidateSet('x64')] + [ValidateSet('x64', 'arm64')] [string] $Target = 'x64', [ValidateSet('Debug', 'RelWithDebInfo', 'Release', 'MinSizeRel')] [string] $Configuration = 'RelWithDebInfo', @@ -93,7 +93,7 @@ function Build { $CmakeArgs += ('--debug-output') } - $Preset = "windows-$(if ( $Env:CI -ne $null ) { 'ci-' })${Target}" + $Preset = "windows-$(if ( $null -ne $Env:CI ) { 'ci-' })${Target}" $CmakeArgs += @( '--preset', $Preset diff --git a/.github/scripts/Package-Windows.ps1 b/.github/scripts/Package-Windows.ps1 index d82c8d657..d745ca6e8 100644 --- a/.github/scripts/Package-Windows.ps1 +++ b/.github/scripts/Package-Windows.ps1 @@ -1,6 +1,6 @@ [CmdletBinding()] param( - [ValidateSet('x64')] + [ValidateSet('x64', 'arm64')] [string] $Target = 'x64', [ValidateSet('Debug', 'RelWithDebInfo', 'Release', 'MinSizeRel')] [string] $Configuration = 'RelWithDebInfo', @@ -69,7 +69,8 @@ function Package { Remove-Item @RemoveArgs $ReleasePath = "${ProjectRoot}/release/${Configuration}" - $NewBinPath = "${ReleasePath}/${ProductName}/bin/64bit" + $BinDirName = if ($Target -eq 'arm64') { 'arm64' } else { '64bit' } + $NewBinPath = "${ReleasePath}/${ProductName}/bin/${BinDirName}" $NewDataPath = "${ReleasePath}/${ProductName}/data" $CIWindowsDir = "${ProjectRoot}/build-aux/CI/windows" @@ -80,7 +81,7 @@ function Package { New-Item -ItemType Directory -Force -Path $RecStaging | Out-Null Copy-Item -Path "${CIWindowsDir}/README.txt" -Destination "${RecStaging}/README.txt" if ( Test-Path -Path $NewBinPath ) { - $RecBinPath = "${RecStaging}/${ProductName}/bin/64bit" + $RecBinPath = "${RecStaging}/${ProductName}/bin/${BinDirName}" New-Item -ItemType Directory -Force -Path $RecBinPath | Out-Null Copy-Item -Path "${NewBinPath}/*" -Destination $RecBinPath -Recurse -Force } @@ -102,7 +103,7 @@ function Package { New-Item -ItemType Directory -Force -Path $PortableStaging | Out-Null Copy-Item -Path "${CIWindowsDir}/README-portable.txt" -Destination "${PortableStaging}/README.txt" if ( Test-Path -Path $NewBinPath ) { - $PortableBinPath = "${PortableStaging}/obs-plugins/64bit" + $PortableBinPath = "${PortableStaging}/obs-plugins/${BinDirName}" New-Item -ItemType Directory -Force -Path $PortableBinPath | Out-Null Copy-Item -Path "${NewBinPath}/*" -Destination $PortableBinPath -Recurse -Force } @@ -136,10 +137,10 @@ function Package { Copy-Item -Path "${Configuration}/*" -Destination $PkgRec -Recurse -Force # Legacy layout (for OBS installation directory) - if ( Test-Path "${Configuration}/${ProductName}/bin/64bit" ) { - $PkgLegBin = "Package/portable/obs-plugins/64bit" + if ( Test-Path "${Configuration}/${ProductName}/bin/${BinDirName}" ) { + $PkgLegBin = "Package/portable/obs-plugins/${BinDirName}" New-Item -ItemType Directory -Force -Path $PkgLegBin | Out-Null - Copy-Item -Path "${Configuration}/${ProductName}/bin/64bit/*" -Destination $PkgLegBin -Recurse -Force + Copy-Item -Path "${Configuration}/${ProductName}/bin/${BinDirName}/*" -Destination $PkgLegBin -Recurse -Force } if ( Test-Path "${Configuration}/${ProductName}/data" ) { $PkgLegData = "Package/portable/data/obs-plugins/${ProductName}" diff --git a/.github/workflows/build-project.yaml b/.github/workflows/build-project.yaml index 9c4ae1c88..307060f09 100644 --- a/.github/workflows/build-project.yaml +++ b/.github/workflows/build-project.yaml @@ -311,3 +311,63 @@ jobs: with: name: ${{ steps.setup.outputs.pluginName }}-${{ steps.setup.outputs.pluginVersion }}-windows-x64-${{ needs.check-event.outputs.commitHash }} path: ${{ github.workspace }}/release/${{ steps.setup.outputs.pluginName }}-*-windows-x64*.* + + windows-arm64-build: + name: Build for Windows ARM64 🪟 + runs-on: windows-11-arm + needs: check-event + defaults: + run: + shell: pwsh + steps: + - uses: actions/checkout@v6 + with: + submodules: recursive + fetch-depth: 0 + + - name: Set Up Environment 🔧 + id: setup + run: | + # Set Up Environment 🔧 + if ( $Env:RUNNER_DEBUG -ne $null ) { + Set-PSDebug -Trace 1 + } + + $BuildSpec = Get-Content -Path buildspec.json -Raw | ConvertFrom-Json + $ProductName = $BuildSpec.name + $GitOutput = git describe --tags + + "pluginName=${ProductName}" >> $env:GITHUB_OUTPUT + "pluginVersion=${GitOutput}" >> $env:GITHUB_OUTPUT + + - name: Build Dependencies 🏗️ + uses: ./.github/actions/build-dependencies + with: + workingDirectory: ${{ github.workspace }}/plugin + target: arm64 + config: ${{ needs.check-event.outputs.config }} + + - name: Build Plugin 🧱 + uses: ./.github/actions/build-plugin + with: + target: arm64 + config: ${{ needs.check-event.outputs.config }} + + - name: Run tests + uses: ./.github/actions/run-tests + with: + target: arm64 + config: ${{ needs.check-event.outputs.config }} + + - name: Package Plugin 📀 + uses: ./.github/actions/package-plugin + with: + target: arm64 + config: ${{ needs.check-event.outputs.config }} + package: ${{ fromJSON(needs.check-event.outputs.package) }} + + - name: Upload Artifacts 📡 + uses: actions/upload-artifact@v7 + with: + name: ${{ steps.setup.outputs.pluginName }}-${{ steps.setup.outputs.pluginVersion }}-windows-arm64-${{ needs.check-event.outputs.commitHash }} + path: ${{ github.workspace }}/release/${{ steps.setup.outputs.pluginName }}-*-windows-arm64*.* diff --git a/CMakePresets.json b/CMakePresets.json index 547449a93..4e823a369 100644 --- a/CMakePresets.json +++ b/CMakePresets.json @@ -74,6 +74,35 @@ "ADVSS_ENABLE_TESTS": true } }, + { + "name": "windows-arm64", + "displayName": "Windows ARM64", + "description": "Build for Windows ARM64", + "inherits": ["template"], + "binaryDir": "${sourceDir}/build_arm64", + "condition": { + "type": "equals", + "lhs": "${hostSystemName}", + "rhs": "Windows" + }, + "generator": "Visual Studio 17 2022", + "architecture": "ARM64", + "warnings": {"dev": true, "deprecated": true}, + "cacheVariables": { + "QT_VERSION": "6", + "CMAKE_SYSTEM_VERSION": "10.0.18363.657" + } + }, + { + "name": "windows-ci-arm64", + "inherits": ["windows-arm64"], + "displayName": "Windows ARM64 CI build", + "description": "Build for Windows ARM64 on CI", + "cacheVariables": { + "CMAKE_COMPILE_WARNING_AS_ERROR": true, + "ADVSS_ENABLE_TESTS": true + } + }, { "name": "linux-x86_64", "displayName": "Linux x86_64", @@ -162,6 +191,20 @@ "description": "Windows CI build for x64 (RelWithDebInfo configuration)", "configuration": "RelWithDebInfo" }, + { + "name": "windows-arm64", + "configurePreset": "windows-arm64", + "displayName": "Windows ARM64", + "description": "Windows build for ARM64", + "configuration": "RelWithDebInfo" + }, + { + "name": "windows-ci-arm64", + "configurePreset": "windows-ci-arm64", + "displayName": "Windows ARM64 CI", + "description": "Windows CI build for ARM64 (RelWithDebInfo configuration)", + "configuration": "RelWithDebInfo" + }, { "name": "linux-x86_64", "configurePreset": "linux-x86_64", diff --git a/buildspec.json b/buildspec.json index eacb8ebf2..b72e482ea 100644 --- a/buildspec.json +++ b/buildspec.json @@ -6,7 +6,8 @@ "label": "OBS sources", "hashes": { "macos": "39751f067bacc13d44b116c5138491b5f1391f91516d3d590d874edd21292291", - "windows-x64": "2c8427c10b55ac6d68008df2e9a3e82f4647aaad18f105e30d4713c2de678ccf" + "windows-x64": "2c8427c10b55ac6d68008df2e9a3e82f4647aaad18f105e30d4713c2de678ccf", + "windows-ARM64": "2c8427c10b55ac6d68008df2e9a3e82f4647aaad18f105e30d4713c2de678ccf" } }, "prebuilt": { @@ -15,7 +16,8 @@ "label": "Pre-Built obs-deps", "hashes": { "macos": "495687e63383d1a287684b6e2e9bfe246bb8f156fe265926afb1a325af1edd2a", - "windows-x64": "c8c642c1070dc31ce9a0f1e4cef5bb992f4bff4882255788b5da12129e85caa7" + "windows-x64": "c8c642c1070dc31ce9a0f1e4cef5bb992f4bff4882255788b5da12129e85caa7", + "windows-ARM64": "f581cc61e8f734a8b12d485fc8662a408ca59d222814e4b37bce115bd442fb04" } }, "qt6": { @@ -24,10 +26,12 @@ "label": "Pre-Built Qt6", "hashes": { "macos": "d3f5f04b6ea486e032530bdf0187cbda9a54e0a49621a4c8ba984c5023998867", - "windows-x64": "0e76bf0555dd5382838850b748d3dcfab44a1e1058441309ab54e1a65b156d0a" + "windows-x64": "0e76bf0555dd5382838850b748d3dcfab44a1e1058441309ab54e1a65b156d0a", + "windows-ARM64": "7aab240504931f32ea8e8d208a912a0d6ddbd78c16858f2e559c7c9b29ab9326" }, "debugSymbols": { - "windows-x64": "11b7be92cf66a273299b8f3515c07a5cfb61614b59a4e67f7fc5ecba5e2bdf21" + "windows-x64": "11b7be92cf66a273299b8f3515c07a5cfb61614b59a4e67f7fc5ecba5e2bdf21", + "windows-ARM64": "884ae08291b5c87d83a7b0004ea8db356530c1f4ff9bdc814b5d599a8d28a152" } } }, diff --git a/plugins/openvr/CMakeLists.txt b/plugins/openvr/CMakeLists.txt index bd64014d1..17dd50033 100644 --- a/plugins/openvr/CMakeLists.txt +++ b/plugins/openvr/CMakeLists.txt @@ -28,7 +28,9 @@ endif() if(EXISTS "${OpenVR_DIR}/CMakeLists.txt") set(SIZEOF_VOIDP ${CMAKE_SIZEOF_VOID_P}) - if((NOT APPLE) AND (CMAKE_SIZEOF_VOID_P EQUAL 8)) + if(WIN32 AND CMAKE_SYSTEM_PROCESSOR MATCHES "ARM64|arm64|aarch64") + set(PROCESSOR_ARCH "arm64") + elseif((NOT APPLE) AND (CMAKE_SIZEOF_VOID_P EQUAL 8)) set(PROCESSOR_ARCH "64") else() set(PROCESSOR_ARCH "32")