diff --git a/.github/jobs/android.yml b/.github/jobs/android.yml index cc40a124e..c2f9e8f7b 100644 --- a/.github/jobs/android.yml +++ b/.github/jobs/android.yml @@ -21,7 +21,7 @@ jobs: jdkArchitectureOption: 'x64' jdkSourceOption: 'PreInstalled' - - task: Gradle@2 + - task: Gradle@3 inputs: workingDirectory: 'Apps/Playground/Android' gradleWrapperFile: 'Apps/Playground/Android/gradlew' diff --git a/.github/jobs/ios.yml b/.github/jobs/ios.yml index 7c924ef4b..4508a9707 100644 --- a/.github/jobs/ios.yml +++ b/.github/jobs/ios.yml @@ -1,8 +1,7 @@ parameters: name: '' vmImage: '' - xcodeVersion: '' - deploymentTarget: '12' + deploymentTarget: '15' jobs: - job: ${{ parameters.name }} @@ -16,13 +15,11 @@ jobs: vmImage: ${{ parameters.vmImage }} - script: | - sudo xcode-select --switch /Applications/Xcode_${{ parameters.xcodeVersion }}.app/Contents/Developer - displayName: 'Select Xcode ${{ parameters.xcodeVersion }}' + sudo xcode-select --switch /Applications/Xcode_$(XCODE_VERSION).app/Contents/Developer + displayName: 'Select Xcode $(XCODE_VERSION)' - script: | - mkdir buildiOS - cd buildiOS - cmake .. -G Xcode -D IOS=ON -D DEPLOYMENT_TARGET=${{ parameters.deploymentTarget }} -D CMAKE_UNITY_BUILD=$(UNITY_BUILD) -D BABYLON_DEBUG_TRACE=ON + cmake -G Xcode -B buildiOS -D IOS=ON -D DEPLOYMENT_TARGET=${{ parameters.deploymentTarget }} -D CMAKE_UNITY_BUILD=$(UNITY_BUILD) -D BABYLON_DEBUG_TRACE=ON -D CMAKE_IOS_INSTALL_COMBINED=NO displayName: 'Generate iOS solution' - task: Xcode@5 @@ -31,6 +28,7 @@ jobs: scheme: 'Playground' sdk: 'iphoneos' useXcpretty: false - configuration: RelWithDebInfo + configuration: Release displayName: 'Build Playground iOS' + diff --git a/.github/jobs/linux.yml b/.github/jobs/linux.yml index 7976b0053..ce0ae2314 100644 --- a/.github/jobs/linux.yml +++ b/.github/jobs/linux.yml @@ -26,10 +26,8 @@ jobs: displayName: 'Install packages' - script: | - mkdir build - cd build - cmake .. -G Ninja -D JAVASCRIPTCORE_LIBRARY=/usr/lib/x86_64-linux-gnu/libjavascriptcoregtk-4.0.so -D NAPI_JAVASCRIPT_ENGINE=${{ parameters.JSEngine }} -D CMAKE_BUILD_TYPE=RelWithDebInfo -D BX_CONFIG_DEBUG=ON -D CMAKE_UNITY_BUILD=$(UNITY_BUILD) -D BABYLON_DEBUG_TRACE=ON - ninja + cmake -G Ninja -B build -D JAVASCRIPTCORE_LIBRARY=/usr/lib/x86_64-linux-gnu/libjavascriptcoregtk-4.0.so -D NAPI_JAVASCRIPT_ENGINE=${{ parameters.JSEngine }} -D CMAKE_BUILD_TYPE=RelWithDebInfo -D BX_CONFIG_DEBUG=ON -D CMAKE_UNITY_BUILD=$(UNITY_BUILD) -D OpenGL_GL_PREFERENCE=GLVND -D BABYLON_DEBUG_TRACE=ON + ninja -C build displayName: 'Build X11' # - script: | diff --git a/.github/jobs/macos.yml b/.github/jobs/macos.yml index 2cd4a30ad..6de9d3913 100644 --- a/.github/jobs/macos.yml +++ b/.github/jobs/macos.yml @@ -1,7 +1,6 @@ parameters: name: '' vmImage: '' - xcodeVersion: '' jobs: - job: ${{ parameters.name }} @@ -15,15 +14,17 @@ jobs: vmImage: ${{ parameters.vmImage }} - script: | - sudo xcode-select --switch /Applications/Xcode_${{ parameters.xcodeVersion }}.app/Contents/Developer - displayName: 'Select XCode ${{ parameters.xcodeVersion }}' + sudo xcode-select --switch /Applications/Xcode_$(XCODE_VERSION).app/Contents/Developer + displayName: 'Select XCode $(XCODE_VERSION)' - script: | - mkdir buildmacOS - cd buildmacOS - cmake .. -G Xcode -D CMAKE_UNITY_BUILD=$(UNITY_BUILD) -D BABYLON_DEBUG_TRACE=ON + cmake -G Xcode -B buildmacOS -D CMAKE_UNITY_BUILD=$(UNITY_BUILD) -D BABYLON_DEBUG_TRACE=ON displayName: 'Generate macOS solution' + - script: | + xcodebuild -list -project buildmacOS/BabylonNative.xcodeproj + displayName: 'List available project schemes' + - task: Xcode@5 inputs: xcWorkspacePath: 'buildmacOS/BabylonNative.xcodeproj' diff --git a/.github/jobs/test_install_ios.yml b/.github/jobs/test_install_ios.yml new file mode 100644 index 000000000..2b5ca5af6 --- /dev/null +++ b/.github/jobs/test_install_ios.yml @@ -0,0 +1,39 @@ +parameters: + name: '' + vmImage: '' + deploymentTarget: '15' + +jobs: + - job: ${{ parameters.name }} + condition: and(succeeded(), eq(variables['Build.SourceBranch'], 'refs/heads/master')) + timeoutInMinutes: 40 + pool: + vmImage: ${{ parameters.vmImage }} + + steps: + - template: cmake.yml + parameters: + vmImage: ${{ parameters.vmImage }} + + - script: | + sudo xcode-select --switch /Applications/Xcode_$(XCODE_VERSION).app/Contents/Developer + displayName: 'Select Xcode $(XCODE_VERSION)' + + - script: | + cmake -G Xcode -B buildiOS -D IOS=ON -D DEPLOYMENT_TARGET=${{ parameters.deploymentTarget }} -D CMAKE_UNITY_BUILD=$(UNITY_BUILD) -D BABYLON_DEBUG_TRACE=ON -D CMAKE_IOS_INSTALL_COMBINED=NO + displayName: 'Generate iOS solution' + + - task: Xcode@5 + inputs: + xcWorkspacePath: 'buildiOS/BabylonNative.xcodeproj' + scheme: 'Playground' + sdk: 'iphoneos' + useXcpretty: false + configuration: Release + displayName: 'Build Playground iOS' + + - script: | + cmake --install buildiOS --prefix="$(Build.SourcesDirectory)/Install" + lipo -info $(Build.SourcesDirectory)/Install/lib/libxr.a + displayName: 'Install' + diff --git a/.github/jobs/test_install_linux.yml b/.github/jobs/test_install_linux.yml new file mode 100644 index 000000000..903df6562 --- /dev/null +++ b/.github/jobs/test_install_linux.yml @@ -0,0 +1,36 @@ +parameters: + name: '' + vmImage: '' + CC: '' + CXX: '' + JSEngine: '' + +jobs: + - job: ${{ parameters.name }} + condition: and(succeeded(), eq(variables['Build.SourceBranch'], 'refs/heads/master')) + timeoutInMinutes: 30 + pool: + vmImage: ${{ parameters.vmImage }} + + variables: + CC: ${{ parameters.CC }} + CXX: ${{ parameters.CXX }} + + steps: + - template: cmake.yml + parameters: + vmImage: ${{ parameters.vmImage }} + + - script: | + sudo apt-get update + sudo apt-get install libjavascriptcoregtk-4.0-dev libgl1-mesa-dev libcurl4-openssl-dev + displayName: 'Install packages' + + - script: | + cmake -G Ninja -B build -D JAVASCRIPTCORE_LIBRARY=/usr/lib/x86_64-linux-gnu/libjavascriptcoregtk-4.0.so -D NAPI_JAVASCRIPT_ENGINE=${{ parameters.JSEngine }} -D CMAKE_BUILD_TYPE=RelWithDebInfo -D BX_CONFIG_DEBUG=ON -D CMAKE_UNITY_BUILD=$(UNITY_BUILD) -D OpenGL_GL_PREFERENCE=GLVND -D BABYLON_DEBUG_TRACE=ON + ninja -C build + displayName: 'Build X11' + + - script: | + cmake --install build --prefix="./install" + displayName: 'Install' \ No newline at end of file diff --git a/.github/jobs/test_install_macos.yml b/.github/jobs/test_install_macos.yml new file mode 100644 index 000000000..7ef6e5989 --- /dev/null +++ b/.github/jobs/test_install_macos.yml @@ -0,0 +1,36 @@ +parameters: + name: '' + vmImage: '' + +jobs: + - job: ${{ parameters.name }} + condition: and(succeeded(), eq(variables['Build.SourceBranch'], 'refs/heads/master')) + timeoutInMinutes: 30 + pool: + vmImage: ${{ parameters.vmImage }} + + steps: + - template: cmake.yml + parameters: + vmImage: ${{ parameters.vmImage }} + + - script: | + sudo xcode-select --switch /Applications/Xcode_$(XCODE_VERSION).app/Contents/Developer + displayName: 'Select XCode $(XCODE_VERSION)' + + - script: | + cmake -G Xcode -B buildmacOS -D CMAKE_UNITY_BUILD=$(UNITY_BUILD) -D BABYLON_DEBUG_TRACE=ON + displayName: 'Generate macOS solution' + + - script: | + xcodebuild -list -project buildmacOS/BabylonNative.xcodeproj + displayName: 'List available project schemes' + + - task: Xcode@5 + inputs: + xcWorkspacePath: 'buildmacOS/BabylonNative.xcodeproj' + scheme: 'install' + sdk: 'macosx' + useXcpretty: false + configuration: Release + displayName: 'Build Installation content macOS' \ No newline at end of file diff --git a/.github/jobs/test_install_win32.yml b/.github/jobs/test_install_win32.yml new file mode 100644 index 000000000..062d12cf3 --- /dev/null +++ b/.github/jobs/test_install_win32.yml @@ -0,0 +1,55 @@ +parameters: +- name: name + type: string +- name: vmImage + type: string +- name: platform + type: string +- name: napiType + type: string + default: direct + values: + - direct + - jsi + - V8 +- name: graphics_api + type: string + default: D3D11 + +jobs: + - job: ${{ parameters.name }} + condition: and(succeeded(), eq(variables['Build.SourceBranch'], 'refs/heads/master')) + timeoutInMinutes: 20 + pool: + vmImage: ${{ parameters.vmImage }} + variables: + ${{ if eq(parameters.napiType, 'jsi') }}: + napiSuffix: '_JSI' + jsEngineDefine: '-DNAPI_JAVASCRIPT_ENGINE=JSI' + ${{ elseif eq(parameters.napiType, 'V8') }}: + napiSuffix: '_V8' + jsEngineDefine: '-DNAPI_JAVASCRIPT_ENGINE=V8' + ${{ else }}: + napiSuffix: '' + jsEngineDefine: '' + solutionName: 'Win32_${{ parameters.platform }}${{variables.napiSuffix}}' + + steps: + - script: | + # BGFX_CONFIG_MAX_FRAME_BUFFERS is set so enough Framebuffers are available before V8 starts disposing unused ones + cmake -B build${{ variables.solutionName }} -A ${{ parameters.platform }} ${{ variables.jsEngineDefine }} -D BX_CONFIG_DEBUG=ON -D GRAPHICS_API=${{ parameters.graphics_api }} -D CMAKE_UNITY_BUILD=$(UNITY_BUILD) -D BGFX_CONFIG_MAX_FRAME_BUFFERS=256 -D BABYLON_DEBUG_TRACE=ON + displayName: 'Generate ${{ variables.solutionName }} solution' + + - task: MSBuild@1 + inputs: + solution: 'build${{ variables.solutionName }}/BabylonNative.sln' + maximumCpuCount: true + configuration: 'RelWithDebInfo' + displayName: 'Build ${{ variables.solutionName }}' + + - script: | + cmake --build build${{ variables.solutionName }} --target INSTALL --config RelWithDebInfo + cd Install/Test + cmake . -DBINARY_DIR=../../build${{ variables.solutionName }} ${{ variables.jsEngineDefine }} + cmake --build . --config RelWithDebInfo + displayName: 'Install' \ No newline at end of file diff --git a/.github/jobs/uwp.yml b/.github/jobs/uwp.yml index 8983281ed..e75bcd49b 100644 --- a/.github/jobs/uwp.yml +++ b/.github/jobs/uwp.yml @@ -28,9 +28,7 @@ jobs: steps: - script: | - mkdir build${{ variables.solutionName }} - cd build${{ variables.solutionName }} - cmake .. -D CMAKE_SYSTEM_NAME=WindowsStore -D CMAKE_SYSTEM_VERSION=10.0 ${{ variables.jsEngineDefine }} -A ${{ parameters.platform }} -D CMAKE_UNITY_BUILD=$(UNITY_BUILD) -D BABYLON_DEBUG_TRACE=ON + cmake -B build${{ variables.solutionName }} -D CMAKE_SYSTEM_NAME=WindowsStore -D CMAKE_SYSTEM_VERSION=10.0 ${{ variables.jsEngineDefine }} -A ${{ parameters.platform }} -D CMAKE_UNITY_BUILD=$(UNITY_BUILD) -D BABYLON_DEBUG_TRACE=ON displayName: 'Generate ${{ variables.solutionName }} solution' - task: VSBuild@1 diff --git a/.github/jobs/win32.yml b/.github/jobs/win32.yml index e19ec8f37..93edf6d09 100644 --- a/.github/jobs/win32.yml +++ b/.github/jobs/win32.yml @@ -35,10 +35,8 @@ jobs: steps: - script: | - mkdir build${{ variables.solutionName }} - cd build${{ variables.solutionName }} # BGFX_CONFIG_MAX_FRAME_BUFFERS is set so enough Framebuffers are available before V8 starts disposing unused ones - cmake -A ${{ parameters.platform }} ${{ variables.jsEngineDefine }} -D BX_CONFIG_DEBUG=ON -D GRAPHICS_API=${{ parameters.graphics_api }} -D CMAKE_UNITY_BUILD=$(UNITY_BUILD) -D BGFX_CONFIG_MAX_FRAME_BUFFERS=256 -D BABYLON_DEBUG_TRACE=ON .. + cmake -B build${{ variables.solutionName }} -A ${{ parameters.platform }} ${{ variables.jsEngineDefine }} -D BX_CONFIG_DEBUG=ON -D GRAPHICS_API=${{ parameters.graphics_api }} -D CMAKE_UNITY_BUILD=$(UNITY_BUILD) -D BGFX_CONFIG_MAX_FRAME_BUFFERS=256 -D BABYLON_DEBUG_TRACE=ON displayName: 'Generate ${{ variables.solutionName }} solution' - task: MSBuild@1 @@ -66,13 +64,6 @@ jobs: Playground app:///Scripts/validation_native.js displayName: 'Validation Tests' - - script: | - cmake --build build${{ variables.solutionName }} --target INSTALL --config RelWithDebInfo - cd Install/Test - cmake . -DBINARY_DIR=../../build${{ variables.solutionName }} ${{ variables.jsEngineDefine }} - cmake --build . --config RelWithDebInfo - displayName: 'Install' - - task: PublishBuildArtifacts@1 inputs: artifactName: '${{ variables.solutionName }} - ${{ parameters.graphics_api }} Rendered Pictures' diff --git a/.github/workflows/nightly.yml b/.github/workflows/nightly.yml index 072d74ff4..24391d661 100644 --- a/.github/workflows/nightly.yml +++ b/.github/workflows/nightly.yml @@ -17,9 +17,8 @@ jobs: - name: View Apps\node_modules content run: Get-ChildItem -Path .\Apps\node_modules -Recurse - name: Make Solution - run: mkdir buildWin32_x64 && - cd buildWin32_x64 && - cmake -A x64 -D BX_CONFIG_DEBUG=ON .. + run: | + cmake -A x64 -B buildWin32_x64 -D BX_CONFIG_DEBUG=ON - name: NPM download nightly run: npm run getNightly working-directory: ./Apps diff --git a/Apps/CMakeLists.txt b/Apps/CMakeLists.txt index d4013e0e7..c67b25057 100644 --- a/Apps/CMakeLists.txt +++ b/Apps/CMakeLists.txt @@ -2,7 +2,7 @@ if(NOT ANDROID) add_subdirectory(Playground) endif() -if((WIN32 AND NOT WINDOWS_STORE) OR (APPLE AND NOT IOS AND NOT VISIONOS) OR (UNIX AND NOT ANDROID)) +if((WIN32 AND NOT WINDOWS_STORE) OR (APPLE AND NOT IOS AND NOT VISIONOS) OR (UNIX AND NOT ANDROID AND NOT APPLE)) add_subdirectory(UnitTests) endif() diff --git a/Apps/Playground/CMakeLists.txt b/Apps/Playground/CMakeLists.txt index ecf564bf1..f21fab1f4 100644 --- a/Apps/Playground/CMakeLists.txt +++ b/Apps/Playground/CMakeLists.txt @@ -216,7 +216,6 @@ if(APPLE) FOLDER "Playground") endif() set_property(TARGET Playground PROPERTY UNITY_BUILD false) - set_property(TARGET Playground PROPERTY XCODE_GENERATE_SCHEME YES) set_property(TARGET Playground PROPERTY XCODE_ATTRIBUTE_CODE_SIGNING_ALLOWED YES) endif() @@ -251,5 +250,4 @@ source_group(TREE ${CMAKE_CURRENT_SOURCE_DIR} FILES ${SCRIPTS}) source_group(TREE ${CMAKE_CURRENT_SOURCE_DIR} FILES ${SOURCES}) set_property(DIRECTORY ${CMAKE_SOURCE_DIR} PROPERTY VS_STARTUP_PROJECT Playground) -set_property(TARGET Playground PROPERTY XCODE_GENERATE_SCHEME YES) set_property(TARGET Playground PROPERTY XCODE_ATTRIBUTE_CODE_SIGNING_ALLOWED YES) diff --git a/Apps/UnitTests/CMakeLists.txt b/Apps/UnitTests/CMakeLists.txt index 7aa3a5679..f57656482 100644 --- a/Apps/UnitTests/CMakeLists.txt +++ b/Apps/UnitTests/CMakeLists.txt @@ -61,4 +61,3 @@ endforeach() set_property(TARGET UnitTests PROPERTY FOLDER Apps) source_group(TREE ${CMAKE_CURRENT_SOURCE_DIR} FILES ${SOURCES} ${SCRIPTS}) source_group(TREE ${CMAKE_CURRENT_SOURCE_DIR}/../node_modules PREFIX node_modules FILES ${EXTERNAL_SCRIPTS}) -set_property(TARGET UnitTests PROPERTY XCODE_GENERATE_SCHEME YES) diff --git a/CMakeLists.txt b/CMakeLists.txt index b1c67e8f5..b641ffb68 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -165,6 +165,8 @@ if(APPLE) # Without this option on azure pipelines, there is a mismatch with math.h giving a lot of undefined functions on macOS. # Only enabled for Apple as there is no issue for Windows. set(CMAKE_NO_SYSTEM_FROM_IMPORTED TRUE) + # Create scheme for installation and other targets + set(CMAKE_XCODE_GENERATE_SCHEME TRUE) endif() if(BABYLON_DEBUG_TRACE) diff --git a/Dependencies/CMakeLists.txt b/Dependencies/CMakeLists.txt index 20ea6187f..38e4eeffd 100644 --- a/Dependencies/CMakeLists.txt +++ b/Dependencies/CMakeLists.txt @@ -106,7 +106,7 @@ set_property(TARGET SPIRV PROPERTY FOLDER Dependencies/glslang) # -------------------------------------------------- # googletest # -------------------------------------------------- -if(BABYLON_NATIVE_BUILD_APPS AND (WIN32 OR (APPLE AND NOT IOS AND NOT VISIONOS) OR (UNIX AND NOT ANDROID))) +if(BABYLON_NATIVE_BUILD_APPS AND (WIN32 OR (APPLE AND NOT IOS AND NOT VISIONOS) OR (UNIX AND NOT ANDROID AND NOT APPLE))) if(WIN32) # For Windows: Prevent overriding the parent project's compiler/linker settings # Default build type for my test projects are /MDd (MultiThreaded DLL) but GTests default to /MTd (MultiTreaded) diff --git a/Dependencies/xr/CMakeLists.txt b/Dependencies/xr/CMakeLists.txt index 593b5043d..0bfb861f5 100644 --- a/Dependencies/xr/CMakeLists.txt +++ b/Dependencies/xr/CMakeLists.txt @@ -24,10 +24,12 @@ endif() project(xr) -# Avoid picking up system installed jsoncpp in favor of source distributed with openxr_loader project -set(BUILD_WITH_SYSTEM_JSONCPP OFF BOOL "disable using system installed jsoncpp") -FetchContent_MakeAvailable_With_Message(OpenXR-SDK OpenXR-MixedReality) + if(WIN32) + # Avoid picking up system installed jsoncpp in favor of source distributed with openxr_loader project + set(BUILD_WITH_SYSTEM_JSONCPP OFF BOOL "disable using system installed jsoncpp") + FetchContent_MakeAvailable_With_Message(OpenXR-SDK OpenXR-MixedReality) + set_property(TARGET openxr_loader PROPERTY FOLDER Dependencies/xr/OpenXR) set_property(TARGET generate_openxr_header PROPERTY FOLDER Dependencies/xr/OpenXR/Generated) set_property(TARGET xr_global_generated_files PROPERTY FOLDER Dependencies/xr/OpenXR/Generated) diff --git a/Install/Install.cmake b/Install/Install.cmake index 378d663dd..814d12d1e 100644 --- a/Install/Install.cmake +++ b/Install/Install.cmake @@ -57,6 +57,10 @@ if(TARGET openxr_loader) install_targets(openxr_loader) endif() +if(TARGET xr) + install_targets(xr) +endif() + ## UrlLib install_targets(UrlLib) @@ -172,4 +176,4 @@ endif() if(TARGET XMLHttpRequest) install_targets(XMLHttpRequest) install_include_for_targets(XMLHttpRequest) -endif() \ No newline at end of file +endif() diff --git a/Install/Test/CMakeLists.txt b/Install/Test/CMakeLists.txt index 3f15d2d43..a8aa39f91 100644 --- a/Install/Test/CMakeLists.txt +++ b/Install/Test/CMakeLists.txt @@ -25,7 +25,9 @@ set_property(GLOBAL PROPERTY USE_FOLDERS ON) set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD_REQUIRED ON) -FetchContent_MakeAvailable_With_Message(googletest) +if(WIN32 OR (APPLE AND NOT IOS) OR (UNIX AND NOT ANDROID AND NOT APPLE)) + FetchContent_MakeAvailable_With_Message(googletest) +endif() # __cplusplus value is not in sync with language version used. MVSC needs this flag to update it accordingly # https://gitlab.kitware.com/cmake/cmake/-/issues/18837 diff --git a/azure-pipelines.yml b/azure-pipelines.yml index c66099773..c09b2661c 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -11,6 +11,8 @@ variables: value: 25.2.9519653 - name: UNITY_BUILD value: true +- name: XCODE_VERSION + value: 15.4 jobs: # Apple @@ -18,20 +20,17 @@ jobs: parameters: name: MacOS_Xcode153 vmImage: 'macOS-14' - xCodeVersion: 15.3 - template: .github/jobs/ios.yml parameters: name: iOS_Xcode153_iOS162 vmImage: 'macOS-14' - xCodeVersion: 15.3 deploymentTarget: 16.2 - template: .github/jobs/ios.yml parameters: name: iOS_Xcode153_iOS172 vmImage: 'macOS-14' - xCodeVersion: 15.3 deploymentTarget: 17.2 # WIN32 @@ -128,6 +127,27 @@ jobs: vmImage: 'macOS-latest' JSEngine: V8 +# Installation tests. + - template: .github/jobs/test_install_win32.yml + parameters: + name: Win32_Installation + vmImage: 'windows-latest' + platform: x64 + - template: .github/jobs/test_install_linux.yml + parameters: + name: Linux_Installation + vmImage: 'ubuntu-latest' + JSEngine: JavaScriptCore + - template: .github/jobs/test_install_macos.yml + parameters: + name: MacOS_Installation + vmImage: 'macOS-14' + - template: .github/jobs/test_install_ios.yml + parameters: + name: iOS_Installation + vmImage: 'macOS-14' + deploymentTarget: 17.2 + # These Android tests are unstable on the CI emulator. Disabled until a more reliable solution is found. # - template: .github/jobs/android_tests.yml # parameters: