Files
windows-user-space-emulator/.github/workflows/build.yml
momo5502 446978ad5a Always use release windows artifacts
This will always use the windows release test sample artifacts.
It doesn't really make sense to test the debug artifacts.
They're just slower and do the same.

This will still run debug artifacts on windows.
The change only applies to non-windows platforms
2025-04-09 18:32:41 +02:00

423 lines
14 KiB
YAML

name: Build
on:
schedule:
- cron: '0 0 * * *'
push:
branches:
- "**"
pull_request:
branches:
- "**"
types: [opened, synchronize, reopened]
workflow_dispatch:
inputs:
verbose:
description: "Enable verbose logging during tests"
type: choice
required: false
default: "false"
options:
- "true"
- "false"
#concurrency:
# group: ${{ github.ref }}
# cancel-in-progress: true
jobs:
clang-tidy:
name: Run Clang Tidy
runs-on: ubuntu-24.04
env:
LLVM_VERSION: 20
steps:
- name: Checkout Source
uses: actions/checkout@v4
with:
submodules: recursive
- name: Install Ninja
uses: seanmiddleditch/gha-setup-ninja@v6
- name: Install Clang
run: |
wget https://apt.llvm.org/llvm.sh
chmod +x llvm.sh
sudo ./llvm.sh ${{ env.LLVM_VERSION }}
sudo apt install -y clang-tidy-${{ env.LLVM_VERSION }}
sudo apt install -y clang-${{ env.LLVM_VERSION }} lld-${{ env.LLVM_VERSION }}
sudo update-alternatives --install /usr/bin/cc cc /usr/bin/clang-${{ env.LLVM_VERSION }} 100
sudo update-alternatives --install /usr/bin/c++ c++ /usr/bin/clang++-${{ env.LLVM_VERSION }} 100
sudo update-alternatives --set cc /usr/bin/clang-${{ env.LLVM_VERSION }}
sudo update-alternatives --set c++ /usr/bin/clang++-${{ env.LLVM_VERSION }}
- name: CMake Build
run: cmake --preset=release -DMOMO_ENABLE_CLANG_TIDY=On && cmake --build --preset=release
verify-formatting:
name: Verify Formatting
runs-on: ubuntu-24.04
steps:
- name: Checkout Source
uses: actions/checkout@v4
- name: Verify Formatting
uses: jidicula/clang-format-action@v4.15.0
with:
clang-format-version: '20'
check-path: 'src'
build-apiset-dumper:
name: Build API Set Dumper
runs-on: windows-latest
steps:
- name: Checkout Source
uses: actions/checkout@v4
with:
submodules: recursive
- name: Install Ninja
uses: seanmiddleditch/gha-setup-ninja@v6
- name: Enable Developer Command Prompt
uses: ilammy/msvc-dev-cmd@v1.13.0
- name: CMake Build
run: cmake --preset=release && cmake --build --preset=release -t dump-apiset
- name: Upload Artifacts
uses: pyTooling/upload-artifact@v4
with:
name: Temp API Set Dumper
working-directory: build/release/artifacts/
path: "*"
create-emulation-root:
name: Create Emulation Root
runs-on: ${{ matrix.runner }}
needs: [build-apiset-dumper]
strategy:
fail-fast: false
matrix:
platform:
- Windows 2025
- Windows 2022
- Windows 2019
include:
- platform: Windows 2025
runner: windows-2025
- platform: Windows 2022
runner: windows-2022
- platform: Windows 2019
runner: windows-2019
steps:
- name: Checkout Source
uses: actions/checkout@v4
- name: Download DirectX Runtime
run: curl --connect-timeout 20 --max-time 200 --retry 5 --retry-delay 2 --retry-max-time 200 -L -o directx_Jun2010_redist.exe https://download.microsoft.com/download/8/4/A/84A35BF1-DAFE-4AE8-82AF-AD2AE20B6B14/directx_Jun2010_redist.exe
- name: Extract DirectX Runtime
run: "cmd /c \"start /wait directx_Jun2010_redist.exe /Q /T:${{github.workspace}}/dxrt\""
- name: Install DirectX Runtime
run: "cmd /c \"start /wait .\\dxrt\\dxsetup.exe /silent\""
- name: Download API Set Dumper
uses: pyTooling/download-artifact@v4
with:
name: Temp API Set Dumper
path: build/release/artifacts
- name: Create Emulation Root
run: src/tools/create-root.bat
- name: Dump API Set
run: cd root && ../build/release/artifacts/dump-apiset.exe
- name: Upload Artifacts
uses: pyTooling/upload-artifact@v4
with:
name: ${{ matrix.platform }} Emulation Root
path: "*"
working-directory: root
retention-days: 1
build:
name: Build
runs-on: ${{ matrix.runner }}
strategy:
fail-fast: false
matrix:
platform:
- Windows x86_64
- Linux x86_64 GCC
- Linux x86_64 GCC Sanitizer
- Linux x86_64 Clang
- macOS arm64
- macOS x86_64
- iOS arm64
- Android x86_64
- Android arm64-v8a
configuration:
- Debug
- Release
include:
- configuration: Debug
preset: debug
- configuration: Release
preset: release
- platform: Windows x86_64
runner: windows-latest
- platform: Linux x86_64 GCC Sanitizer
runner: ubuntu-24.04
cmake-options: "-DMOMO_ENABLE_SANITIZER=On"
- platform: Linux x86_64 GCC
runner: ubuntu-24.04
- platform: Linux x86_64 Clang
runner: ubuntu-24.04
clang-version: 20
- platform: iOS arm64
runner: macos-latest
rust-target: aarch64-apple-ios
cmake-options: "-DCMAKE_TOOLCHAIN_FILE=$GITHUB_WORKSPACE/cmake/toolchain/ios.cmake"
- platform: macOS arm64
runner: macos-latest
- platform: macOS x86_64
runner: macos-13
- platform: Android x86_64
runner: ubuntu-24.04
abi: x86_64
rust-target: x86_64-linux-android
cmake-options: "-DCMAKE_TOOLCHAIN_FILE=$GITHUB_WORKSPACE/cmake/toolchain/android-ndk.cmake"
- platform: Android arm64-v8a
runner: ubuntu-24.04
abi: arm64-v8a
rust-target: aarch64-linux-android
cmake-options: "-DCMAKE_TOOLCHAIN_FILE=$GITHUB_WORKSPACE/cmake/toolchain/android-ndk.cmake"
steps:
- name: Checkout Source
uses: actions/checkout@v4
with:
submodules: recursive
- name: Install Ninja
uses: seanmiddleditch/gha-setup-ninja@v6
- name: Install Rust Target
if: "${{ matrix.rust-target }}"
run: rustup target add ${{ matrix.rust-target }}
- name: Install Clang
if: "${{ matrix.platform == 'Linux x86_64 Clang' }}"
run: |
wget https://apt.llvm.org/llvm.sh
chmod +x llvm.sh
sudo ./llvm.sh ${{ matrix.clang-version }}
sudo apt install -y clang-${{ matrix.clang-version }} lld-${{ matrix.clang-version }}
sudo update-alternatives --install /usr/bin/cc cc /usr/bin/clang-${{ matrix.clang-version }} 100
sudo update-alternatives --install /usr/bin/c++ c++ /usr/bin/clang++-${{ matrix.clang-version }} 100
sudo update-alternatives --set cc /usr/bin/clang-${{ matrix.clang-version }}
sudo update-alternatives --set c++ /usr/bin/clang++-${{ matrix.clang-version }}
- name: Enable Developer Command Prompt
uses: ilammy/msvc-dev-cmd@v1.13.0
if: ${{ startsWith(matrix.platform, 'Windows') }}
- uses: nttld/setup-ndk@v1
id: setup-ndk
if: ${{ startsWith(matrix.platform, 'Android') }}
with:
ndk-version: r26d
add-to-path: false
- name: Setup Environment Variables
if: ${{ startsWith(matrix.platform, 'Android') }}
run: |
echo "ANDROID_NDK_ROOT=${{ steps.setup-ndk.outputs.ndk-path }}" >> $GITHUB_ENV
echo "ANDROID_ABI=${{ matrix.abi }}" >> $GITHUB_ENV
- name: CMake Build
run: cmake --preset=${{matrix.preset}} ${{matrix.cmake-options}} && cmake --build --preset=${{matrix.preset}}
- name: Upload Artifacts
uses: pyTooling/upload-artifact@v4
with:
name: ${{ matrix.platform }} ${{matrix.configuration}} Artifacts
working-directory: build/${{matrix.preset}}/artifacts/
path: "*"
- name: Upload Test Configuration
uses: actions/upload-artifact@v4.6.2
with:
name: Temp ${{ matrix.platform }} ${{matrix.configuration}} Test Config
path: "build/${{matrix.preset}}/**/CTestTestfile.cmake"
test:
name: Test
runs-on: ${{ matrix.runner }}
needs: [create-emulation-root, build]
strategy:
fail-fast: false
matrix:
platform:
- Windows x86_64
- Linux x86_64 GCC
- Linux x86_64 GCC Sanitizer
- Linux x86_64 Clang
- macOS arm64
- macOS x86_64
emulator:
- Unicorn
- Icicle
emulation-root:
- Windows 2025
- Windows 2022
- Windows 2019
configuration:
- Debug
- Release
include:
- configuration: Debug
preset: debug
- configuration: Release
preset: release
- platform: Windows x86_64
runner: windows-latest
- platform: Linux x86_64 GCC
runner: ubuntu-24.04
- platform: Linux x86_64 GCC Sanitizer
runner: ubuntu-24.04
- platform: Linux x86_64 Clang
runner: ubuntu-24.04
- platform: macOS arm64
runner: macos-latest
- platform: macOS x86_64
runner: macos-13
steps:
- name: Checkout Source
uses: actions/checkout@v4
with:
submodules: recursive
- name: Setup Environment Variables
run: |
echo "RUST_BACKTRACE=1" >> $GITHUB_ENV
echo "ASAN_OPTIONS=detect_odr_violation=0" >> $GITHUB_ENV
echo "EMULATOR_ICICLE=${{ matrix.emulator == 'Icicle' }}" >> $GITHUB_ENV
- name: Download Test Configuration
uses: actions/download-artifact@v4.2.1
with:
name: Temp ${{ matrix.platform }} ${{matrix.configuration}} Test Config
path: build/${{matrix.preset}}
- name: Download Artifacts
uses: pyTooling/download-artifact@v4
with:
name: ${{ matrix.platform }} ${{matrix.configuration}} Artifacts
path: build/${{matrix.preset}}/artifacts
- name: Download Windows Artifacts
uses: pyTooling/download-artifact@v4
if: "${{ matrix.platform != 'Windows x86_64' }}"
with:
name: Windows x86_64 Release Artifacts
path: build/${{matrix.preset}}/artifacts
- name: Download Emulation Root
uses: pyTooling/download-artifact@v4
with:
name: ${{ matrix.emulation-root }} Emulation Root
path: build/${{matrix.preset}}/artifacts/root
- name: Copy Test Sample
run: cp build/${{matrix.preset}}/artifacts/test-sample.exe build/${{matrix.preset}}/artifacts/root/filesys/c/
- name: CMake Test
run: cd build/${{matrix.preset}} && ctest --verbose -j
env:
EMULATOR_ROOT: ${{github.workspace}}/build/${{matrix.preset}}/artifacts/root
EMULATOR_VERBOSE: ${{ github.event.inputs.verbose }}
ANALYSIS_SAMPLE: ${{github.workspace}}/build/${{matrix.preset}}/artifacts/dump-apiset.exe
smoke-test-android:
name: Smoke Test Android
runs-on: ${{ matrix.runner }}
needs: [create-emulation-root, build]
strategy:
fail-fast: false
matrix:
architecture:
- x86_64
#- arm64-v8a
emulator:
- Unicorn
- Icicle
emulation-root:
- Windows 2025
- Windows 2022
- Windows 2019
configuration:
- Debug
- Release
include:
- configuration: Debug
preset: debug
- configuration: Release
preset: release
- architecture: x86_64
runner: ubuntu-24.04
#- architecture: arm64-v8a
# runner: macos-latest
steps:
- name: Enable KVM
if: ${{ startsWith(matrix.runner, 'ubuntu') }}
run: |
echo 'KERNEL=="kvm", GROUP="kvm", MODE="0666", OPTIONS+="static_node=kvm"' | sudo tee /etc/udev/rules.d/99-kvm4all.rules
sudo udevadm control --reload-rules
sudo udevadm trigger --name-match=kvm
- name: Download Artifacts
uses: pyTooling/download-artifact@v4
with:
name: Android ${{matrix.architecture}} ${{matrix.configuration}} Artifacts
path: build/${{matrix.preset}}/artifacts
- name: Download Windows Artifacts
uses: pyTooling/download-artifact@v4
with:
name: Windows x86_64 Release Artifacts
path: build/${{matrix.preset}}/artifacts
- name: Download Emulation Root
uses: pyTooling/download-artifact@v4
with:
name: ${{ matrix.emulation-root }} Emulation Root
path: build/${{matrix.preset}}/artifacts/root
- name: Copy Test Sample
run: cp build/${{matrix.preset}}/artifacts/test-sample.exe build/${{matrix.preset}}/artifacts/root/filesys/c/
- name: Run Test
uses: reactivecircus/android-emulator-runner@v2.34.0
with:
api-level: 29
arch: ${{matrix.architecture}}
script: "adb push build/${{matrix.preset}}/artifacts/* /data/local/tmp && adb shell \"cd /data/local/tmp && export LD_LIBRARY_PATH=. && chmod +x ./analyzer && EMULATOR_ICICLE=${{ matrix.emulator == 'Icicle' }} ./analyzer -e ./root c:/test-sample.exe\""
summary:
name: Pipeline Summary
runs-on: ubuntu-24.04
needs: [clang-tidy, build-apiset-dumper, smoke-test-android, create-emulation-root, build, test, verify-formatting]
if: always()
steps:
- uses: geekyeggo/delete-artifact@v5
with:
name: 'Temp *'
- name: Pipeline failed
if: ${{ contains(needs.*.result, 'failure') || contains(needs.*.result, 'cancelled') }}
run: exit 1