Download
610 lines 24.8 KiBYAMLModified 2026-06-13 raw
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610
name: continuous-integration
on: [push, pull_request]

jobs:
  Linux:
    runs-on: ${{ matrix.runner }}
    strategy:
      matrix:
        runner: [ubuntu-22.04, ubuntu-24.04-arm]
    permissions:
      checks: write
      pull-requests: write
    env:
      ALSOFT_CONF: love2d-${{ github.sha }}/testing/resources/alsoft.conf
      VK_LAYER_SETTINGS_PATH: love2d-${{ github.sha }}/testing/resources/vk_layer_settings.txt
      DISPLAY: :99
    steps:
    - name: Update APT
      run: sudo apt-get update
    - name: Install Dependencies
      run: |
        sudo apt-get install --assume-yes build-essential git make cmake autoconf automake \
                                          libtool pkg-config libasound2-dev libpulse-dev libaudio-dev \
                                          libjack-dev libx11-dev libxext-dev libxrandr-dev libxcursor-dev \
                                          libxfixes-dev libxi-dev libxinerama-dev libxxf86vm-dev libxss-dev \
                                          libxtst-dev \
                                          libgl1-mesa-dev libdbus-1-dev libudev-dev libgles2-mesa-dev \
                                          libegl1-mesa-dev libibus-1.0-dev fcitx-libs-dev libsamplerate0-dev \
                                          libsndio-dev libwayland-dev libxkbcommon-dev libdrm-dev libgbm-dev \
                                          libcurl4-openssl-dev libfuse2 wmctrl openbox mesa-vulkan-drivers \
                                          libpipewire-0.3-dev libwayland-dev libdecor-0-dev liburing-dev \
                                          libvulkan1
    - name: Install Vulkan SDK
      if: ${{ runner.arch == 'X64' }}
      run: |
        set -e
        wget -qO- https://packages.lunarg.com/lunarg-signing-key-pub.asc | sudo tee /etc/apt/trusted.gpg.d/lunarg.asc
        sudo wget -qO /etc/apt/sources.list.d/lunarg-vulkan-1.3.283-jammy.list https://packages.lunarg.com/vulkan/1.3.283/lunarg-vulkan-1.3.283-jammy.list
        sudo apt-get update
        sudo apt-get install --assume-yes vulkan-sdk
    - name: Checkout love-appimage-source
      uses: actions/checkout@v4
      with:
        repository: love2d/love-appimage-source
        ref: main
    - name: Checkout LÖVE
      uses: actions/checkout@v4
      with:
        path: love2d-${{ github.sha }}
    - name: Get Dependencies for AppImage
      shell: python
      env:
        LOVE_BRANCH: ${{ github.sha }}
      run: |
        import os
        for i in range(250):
            if os.system(f"make getdeps LOVE_BRANCH={os.environ['LOVE_BRANCH']}") == 0:
                raise SystemExit(0)
        raise Exception("make getdeps failed")
    - name: Build AppImage
      run: make LOVE_BRANCH=${{ github.sha }}
    - name: Print LuaJIT branch
      run: git -C LuaJIT-v2.1 branch -v
    # start xvfb for test running
    - name: Start xvfb and openbox
      run: |
        echo "Starting XVFB on $DISPLAY"
        Xvfb $DISPLAY -screen 0, 360x240x24 &
        echo "XVFBPID=$!" >> $GITHUB_ENV
        # wait for xvfb to startup (3s is the same amount xvfb-run waits by default)
        sleep 3
        openbox &
        echo "OPENBOXPID=$!" >> $GITHUB_ENV
    # linux opengl tests
    - name: Run Test Suite (opengl)
      run: |
        chmod a+x love-${{ github.sha }}.AppImage
        ./love-${{ github.sha }}.AppImage love2d-${{ github.sha }}/testing/main.lua --all --isRunner --renderers opengl
    - name: Love Test Report (opengl)
      id: report1
      uses: ellraiser/love-test-report@main
      with:
        name: Love Testsuite Linux
        title: test-report-linux-${{ runner.arch }}-opengl
        path: love2d-${{ github.sha }}/testing/output/lovetest_all.md
        token: ${{ secrets.GITHUB_TOKEN }}
    - name: Zip Test Output (opengl)
      run: |
        7z a -tzip test-output-linux-opengl-${{ runner.arch }}.zip love2d-${{ github.sha }}/testing/output/
    - name: Artifact Test Output (opengl)
      uses: actions/upload-artifact@v4
      with:
        name: test-output-linux-${{ runner.arch }}-opengl-${{ steps.report1.outputs.conclusion }}
        path: test-output-linux-${{ runner.arch }}-opengl.zip
    # linux opengles tests
    - name: Run Test Suite (opengles)
      env:
        LOVE_GRAPHICS_DEBUG: 1
      run: |
        export LOVE_GRAPHICS_USE_OPENGLES=1
        ./love-${{ github.sha }}.AppImage love2d-${{ github.sha }}/testing/main.lua --all --isRunner --renderers opengl
    - name: Love Test Report (opengles)
      uses: ellraiser/love-test-report@main
      id: report2
      with:
        name: Love Testsuite Linux
        title: test-report-linux-${{ runner.arch }}-opengles
        path: love2d-${{ github.sha }}/testing/output/lovetest_all.md
        token: ${{ secrets.GITHUB_TOKEN }}
    - name: Zip Test Output (opengles)
      run: |
        7z a -tzip test-output-linux-opengles-${{ runner.arch }}.zip love2d-${{ github.sha }}/testing/output/
    - name: Artifact Test Output (opengles)
      uses: actions/upload-artifact@v4
      with:
        name: test-output-linux-${{ runner.arch }}-opengles-${{ steps.report2.outputs.conclusion }}
        path: test-output-linux-${{ runner.arch }}-opengles.zip
    # linux vulkan tests
    - name: Run Test Suite (vulkan)
      env:
        LOVE_GRAPHICS_DEBUG: ${{ runner.arch == 'ARM64' && '0' || '1' }} 
        LOVE_GRAPHICS_VULKAN_ALLOW_SOFTWARE: 1
      run: |
        ./love-${{ github.sha }}.AppImage love2d-${{ github.sha }}/testing/main.lua --all --isRunner --renderers vulkan
    - name: Love Test Report (vulkan)
      uses: ellraiser/love-test-report@main
      id: report3
      with:
        name: Love Testsuite Linux
        title: test-report-linux-${{ runner.arch }}-vulkan
        path: love2d-${{ github.sha }}/testing/output/lovetest_all.md
    - name: Zip Test Output (vulkan)
      run: |
        7z a -tzip test-output-linux-vulkan-${{ runner.arch }}.zip love2d-${{ github.sha }}/testing/output/
    - name: Artifact Test Output (vulkan)
      uses: actions/upload-artifact@v4
      with:
        name: test-output-linux-${{ runner.arch }}-vulkan-${{ steps.report3.outputs.conclusion }}
        path: test-output-linux-${{ runner.arch }}-vulkan.zip
    - name: Stop xvfb and openbox
      # should always stop xvfb and openbox even if other steps failed
      if: always()
      run: |
        kill $XVFBPID
        kill $OPENBOXPID
    - name: Artifact
      uses: actions/upload-artifact@v4
      with:
        name: love-linux-${{ runner.arch }}.AppImage
        path: love-${{ github.sha }}.AppImage
    - name: Artifact Debug Symbols
      uses: actions/upload-artifact@v4
      with:
        name: love-${{ runner.arch }}-AppImage-debug
        path: love-${{ github.sha }}.AppImage-debug.tar.gz
    - name: Check Tests Passing
      if: steps.report1.outputs.conclusion == 'failure' || steps.report2.outputs.conclusion == 'failure' || steps.report3.outputs.conclusion == 'failure'
      run: |
        echo "${{ steps.report1.outputs.failed }} opengl tests failed"
        echo "${{ steps.report2.outputs.failed }} opengles tests failed"
        echo "${{ steps.report3.outputs.failed }} vulkan tests failed"
        exit 1

  Windows:
    runs-on: windows-2025
    permissions:
      checks: write
      pull-requests: write
    env: 
      ALSOFT_CONF: megasource/libs/love/testing/resources/alsoft.conf
      VK_ICD_FILENAMES: ${{ github.workspace }}\mesa\x64\lvp_icd.x86_64.json
      VULKAN_SDK: C:/VulkanSDK/1.3.231.1
    strategy:
      matrix:
        platform: [x64, ARM64]
    defaults:
      run:
        shell: cmd
    continue-on-error: ${{ matrix.platform == 'ARM64' }}
    steps:
    - name: Define Variables
      id: vars
      run: |
        rem JIT Modules
        if "${{ matrix.platform }}" == "x64" (
          (echo jitmodules=1)>> "%GITHUB_OUTPUT%"
        ) else (
          (echo jitmodules=0)>> "%GITHUB_OUTPUT%"
        )
        
        rem Architecture-Specific Switch
        goto ${{ matrix.platform }}
        exit /b 1
        
        :Win32
        (echo arch=x86)>> "%GITHUB_OUTPUT%"
        (echo angle=0)>> "%GITHUB_OUTPUT%"
        echo nofiles=warn>> "%GITHUB_OUTPUT%"
        exit /b 0
        
        :x64
        (echo arch=x64)>> "%GITHUB_OUTPUT%"
        (echo angle=0)>> "%GITHUB_OUTPUT%"
        echo nofiles=warn>> "%GITHUB_OUTPUT%"
        exit /b 0
        
        :ARM64
        (echo arch=arm64)>> "%GITHUB_OUTPUT%"
        (echo angle=1)>> "%GITHUB_OUTPUT%"
        echo nofiles=ignore>> "%GITHUB_OUTPUT%"
        echo moredef=-DLOVE_EXTRA_DLLS=%CD%\angle\libEGL.dll;%CD%\angle\libGLESv2.dll>> "%GITHUB_OUTPUT%"
        exit /b 0
    - name: Install NSIS
      run: winget install nsis --disable-interactivity --accept-source-agreements --accept-package-agreements
    - name: Download pdbstr
      run: curl -Lfo pdbstr.nupkg https://www.nuget.org/api/v2/package/Microsoft.Debugging.Tools.PdbStr/20230731.1609.0
    - name: Download srctool
      run: curl -Lfo srctool.nupkg https://www.nuget.org/api/v2/package/Microsoft.Debugging.Tools.SrcTool/20230731.1609.0
    - name: Extract Tools and Add to PATH
      run: |
        mkdir debugtools
        cd debugtools
        if errorlevel 1 exit /b 1
        7z e ..\srctool.nupkg content/amd64/srctool.exe
        if errorlevel 1 exit /b 1
        7z e ..\pdbstr.nupkg content/amd64/pdbstr.exe
        if errorlevel 1 exit /b 1
        echo %CD%>>%GITHUB_PATH%
    - name: Setup Python 3.10
      uses: actions/setup-python@v5
      with:
        python-version: "3.10"
    - name: Download source_index.py
      run: curl -Lfo source_index.py https://gist.github.com/MikuAuahDark/d9c099f5714e09a765496471c2827a55/raw/df34956052035f3473c5f01861dfb53930d06843/source_index.py
    - name: Clone Megasource
      uses: actions/checkout@v4
      with:
        path: megasource
        repository: love2d/megasource
        ref: main
    - id: megasource
      name: Get Megasource Commit SHA
      shell: python
      run: |
        import os
        import subprocess
        
        result = subprocess.run("git -C megasource rev-parse HEAD".split(), check=True, capture_output=True, encoding="UTF-8")
        commit = result.stdout.split()[0]
        with open(os.environ["GITHUB_OUTPUT"], "w", encoding="UTF-8") as f: f.write(f"commit={commit}")
    - name: Checkout
      uses: actions/checkout@v4
      with:
        path: megasource/libs/love
    - name: Download ANGLE
      uses: robinraju/release-downloader@v1.9
      if: steps.vars.outputs.angle == '1'
      with:
        repository: MikuAuahDark/angle-winbuild
        tag: cr_5249
        fileName: angle-win-${{ steps.vars.outputs.arch }}.zip
        tarBall: false
        zipBall: false
        out-file-path: angle
    - name: Extract ANGLE
      if: steps.vars.outputs.angle == '1'
      working-directory: angle
      run: 7z x angle-win-${{ steps.vars.outputs.arch }}.zip
    - name: Remove Strawbery Perl From Path
      # https://github.com/actions/runner-images/issues/6627
      # In particular, this is not pretty, but even CMAKE_IGNORE_PREFIX_PATH
      # cannot help in this case.
      run: |
        move /y C:\Strawberry C:\Strawberry_not_in_PATH
        exit /b 0
    - name: Configure
      env:
        CFLAGS: /Zi
        CXXFLAGS: /Zi
        LDFLAGS: /DEBUG:FULL /OPT:REF /OPT:ICF
      run: cmake -Bbuild -Smegasource -T v145 -A ${{ matrix.platform }} --install-prefix %CD%\install -DCMAKE_PDB_OUTPUT_DIRECTORY=%CD%\pdb ${{ steps.vars.outputs.moredef }}
    - name: Install
      run: cmake --build build --target PACKAGE --config Release -j2
    - name: Copy LuaJIT lua51.pdb
      run: |
        copy /Y build\libs\LuaJIT\src\lua51.pdb pdb\Release\lua51.pdb
        exit /b 0
    - name: Add srcsrv to PATH
      run: |
        echo C:\Program Files (x86)\Windows Kits\10\Debuggers\x64\srcsrv>>%GITHUB_PATH%
    - name: Embed Source Index into PDBs
      run: |
        python source_index.py ^
        --source %CD%\megasource\libs\love https://raw.githubusercontent.com/${{ github.repository }}/${{ github.sha }} ^
        --source %CD%\megasource https://raw.githubusercontent.com/love2d/megasource/${{ steps.megasource.outputs.commit }} ^
        --source %CD%\build\libs\LuaJIT https://raw.githubusercontent.com/love2d/megasource/${{ steps.megasource.outputs.commit }}/libs/LuaJIT ^
        pdb\Release\*.pdb
    - name: Artifact
      uses: actions/upload-artifact@v4
      with:
        name: love-windows-${{ steps.vars.outputs.arch }}
        path: |
          build/*.zip
          build/*.exe
        if-no-files-found: ${{ steps.vars.outputs.nofiles }}
    - name: Artifact JIT Modules
      if: steps.vars.outputs.jitmodules == '1'
      uses: actions/upload-artifact@v4
      with:
        name: love-windows-jitmodules
        path: build/libs/LuaJIT/src/jit/*.lua
    - name: Artifact PDB
      uses: actions/upload-artifact@v4
      with:
        name: love-windows-${{ steps.vars.outputs.arch }}-dbg
        path: pdb/Release/*.pdb
    # install mesa for graphic tests
    - name: Install Mesa 
      if: steps.vars.outputs.arch != 'ARM64'
      run: |
        curl -L --output mesa.7z --url https://github.com/pal1000/mesa-dist-win/releases/download/24.2.4/mesa3d-24.2.4-release-msvc.7z
        7z x mesa.7z -o*
        powershell.exe mesa\systemwidedeploy.cmd 1
    # build love to use for the tests
    - name: Build Test Exe
      if: steps.vars.outputs.arch != 'ARM64'
      run: cmake --build build --config Release --target install
    # windows opengl tests
    - name: Run Tests (opengl)
      if: steps.vars.outputs.arch != 'ARM64'
      env:
        LOVE_GRAPHICS_DEBUG: 1
      run: |
        echo 'check dir'
        ls
        powershell.exe ./install/lovec.exe ./megasource/libs/love/testing/main.lua --all --isRunner --renderers opengl
    - name: Love Test Report (opengl)
      id: report1
      if: steps.vars.outputs.arch != 'ARM64'
      uses: ellraiser/love-test-report@main
      with:
        name: Love Testsuite Windows ${{ steps.vars.outputs.arch }} (opengl)
        title: test-report-windows-${{ steps.vars.outputs.arch }}-opengl
        path: megasource/libs/love/testing/output/lovetest_all.md
        token: ${{ secrets.GITHUB_TOKEN }}
    - name: Zip Test Output (opengl)
      if: steps.vars.outputs.arch != 'ARM64'
      run: |
        7z a -tzip test-output-windows-${{ steps.vars.outputs.arch }}-opengl.zip megasource/libs/love/testing/output/
    - name: Artifact Test Output (opengl)
      if: steps.vars.outputs.arch != 'ARM64'
      uses: actions/upload-artifact@v4
      with:
        name: test-output-windows-${{ steps.vars.outputs.arch }}-opengl-${{ steps.report1.outputs.conclusion }}
        path: test-output-windows-${{ steps.vars.outputs.arch }}-opengl.zip
    # windows opengles tests
    - name: Run Tests (opengles)
      if: steps.vars.outputs.arch != 'ARM64'
      env:
        LOVE_GRAPHICS_DEBUG: 1
        LOVE_GRAPHICS_USE_OPENGLES: 1
      run: |
        powershell.exe ./install/lovec.exe ./megasource/libs/love/testing/main.lua --all --isRunner --renderers opengl
    - name: Love Test Report (opengles)
      id: report2
      if: steps.vars.outputs.arch != 'ARM64'
      uses: ellraiser/love-test-report@main
      with:
        name: Love Testsuite Windows ${{ steps.vars.outputs.arch }} (opengles)
        title: test-report-windows-${{ steps.vars.outputs.arch }}-opengles
        path: megasource/libs/love/testing/output/lovetest_all.md
        token: ${{ secrets.GITHUB_TOKEN }}
    - name: Zip Test Output (opengles)
      if: steps.vars.outputs.arch != 'ARM64'
      run: |
        7z a -tzip test-output-windows-${{ steps.vars.outputs.arch }}-opengles.zip megasource/libs/love/testing/output/
    - name: Artifact Test Output (opengles)
      if: steps.vars.outputs.arch != 'ARM64'
      uses: actions/upload-artifact@v4
      with:
        name: test-output-windows-${{ steps.vars.outputs.arch }}-opengles-${{ steps.report2.outputs.conclusion }}
        path: test-output-windows-${{ steps.vars.outputs.arch }}-opengles.zip
    - name: Check Tests Passing
      if: steps.report1.outputs.conclusion == 'failure' || steps.report2.outputs.conclusion == 'failure'
      run: |
        echo "${{ steps.report1.outputs.failed }} opengl tests failed"
        echo "${{ steps.report2.outputs.failed }} opengles tests failed"
        exit 1
#    # install vulkan
#    - name: Install Vulkan
#      if: steps.vars.outputs.arch != 'ARM64'
#      run: |
#        curl -L --show-error --output VulkanSDK.exe https://sdk.lunarg.com/sdk/download/1.3.231.1/windows/VulkanSDK-1.3.231.1-Installer.exe
#        ./VulkanSDK.exe --root C:/VulkanSDK/1.3.231.1 --accept-licenses --default-answer --confirm-command install com.lunarg.vulkan.core com.lunarg.vulkan.vma 
#        curl -L --show-error --output vulkan-runtime.zip https://sdk.lunarg.com/sdk/download/1.3.231.1/windows/vulkan-runtime-components.zip
#        7z e vulkan-runtime.zip -o"C:/VulkanSDK/1.3.231.1/runtime/x64" */x64
#        copy "C:/VulkanSDK/1.3.231.1/runtime/x64/vulkan-1.dll" "mesa/x64"
#        copy "C:/VulkanSDK/1.3.231.1/runtime/x64/vulkan-1.dll" "C:/Windows/System32"
#        copy "C:/VulkanSDK/1.3.231.1/runtime/x64/vulkan-1.dll" "love-12.0-win64/love-12.0-win64"
#        reg add HKEY_LOCAL_MACHINE\SOFTWARE\Khronos\Vulkan\Drivers /v "${{ github.workspace }}\mesa\x64\lvp_icd.x86_64.json" /t REG_DWORD /d 0
#        powershell.exe C:/VulkanSDK/1.3.231.1/runtime/x64/vulkaninfo.exe --summary
#    # windows vulkan tests
#    - name: Run Tests (vulkan)
#      if: steps.vars.outputs.arch != 'ARM64'
#      env:
#        LOVE_GRAPHICS_DEBUG: 1
#        LOVE_GRAPHICS_VULKAN_ALLOW_SOFTWARE: 1
#      run: |
#        powershell.exe ./install/lovec.exe ./megasource/libs/love/testing/main.lua --all --isRunner --renderers vulkan
#    - name: Love Test Report (vulkan)
#      if: steps.vars.outputs.arch != 'ARM64'
#      uses: ellraiser/love-test-report@main
#      with:
#        name: Love Testsuite Windows ${{ steps.vars.outputs.arch }} (vulkan)
#        title: test-report-windows-${{ steps.vars.outputs.arch }}-vulkan
#        path: megasource/libs/love/testing/output/lovetest_all.md
#    - name: Zip Test Output (vulkan)
#      if: steps.vars.outputs.arch != 'ARM64'
#      run: |
#        7z a -tzip test-output-windows-${{ steps.vars.outputs.arch }}-vulkan.zip megasource/libs/love/testing/output/
#    - name: Artifact Test Output (vulkan)
#      if: steps.vars.outputs.arch != 'ARM64'
#      uses: actions/upload-artifact@v4
#      with:
#        name: test-output-windows-${{ steps.vars.outputs.arch }}-vulkan
#        path: test-output-windows-${{ steps.vars.outputs.arch }}-vulkan.zip

  macOS:
    runs-on: macos-latest
    permissions:
      checks: write
      pull-requests: write
    env:
      ALSOFT_CONF: testing/resources/alsoft.conf
    steps:
    - name: Checkout
      uses: actions/checkout@v4
    - name: Clone Dependencies
      uses: actions/checkout@v4
      with:
        path: apple-dependencies
        repository: love2d/love-apple-dependencies
        ref: main
    - name: Move Dependencies
      run: |
        mv apple-dependencies/macOS/Frameworks platform/xcode/macosx
        mv apple-dependencies/shared platform/xcode
    - name: Build
      run:
        xcodebuild clean archive -project platform/xcode/love.xcodeproj -scheme love-macosx -configuration Release -destination generic/platform=macOS -archivePath love-macos.xcarchive
    - name: Export Archive
      run:
        xcodebuild -exportArchive -archivePath love-macos.xcarchive -exportPath love-macos -exportOptionsPlist platform/xcode/macosx/macos-copy-app.plist
    - name: Zip Archive
      run:
        ditto -c -k --sequesterRsrc --keepParent love-macos/love.app love-macos.zip 
    - name: Artifact
      uses: actions/upload-artifact@v4
      with:
        name: love-macos
        path: love-macos.zip
    # macos opengl tests
    - name: Run Test Suite (OpenGL)
      env:
        LOVE_GRAPHICS_DEBUG: 1
      run: |
        ls
        love-macos/love.app/Contents/MacOS/love ./testing/main.lua --all --isRunner --renderers opengl
    - name: Love Test Report (OpenGL)
      id: report1
      uses: ellraiser/love-test-report@main
      with:
        name: Love Testsuite MacOS
        title: test-report-macos-opengl
        path: testing/output/lovetest_all.md
        token: ${{ secrets.GITHUB_TOKEN }}
    - name: Zip Test Output (OpenGL)
      run: |
        7z a -tzip test-output-macos-opengl.zip ./testing/output/
    - name: Artifact Test Output (OpenGL)
      uses: actions/upload-artifact@v4
      with:
        name: test-output-macos-opengl-${{ steps.report1.outputs.conclusion }}
        path: test-output-macos-opengl.zip
    - name: Check Tests Passing (OpenGL)
      if: steps.report1.outputs.conclusion == 'failure'
      run: |
        echo "${{ steps.report1.outputs.failed }} opengl tests failed"
        exit 1
    # macos metal tests
    - name: Run Test Suite (Metal)
      env:
        LOVE_GRAPHICS_DEBUG: 1
      run: |
        ls
        love-macos/love.app/Contents/MacOS/love ./testing/main.lua --all --isRunner --renderers metal
    - name: Love Test Report (Metal)
      id: report2
      uses: ellraiser/love-test-report@main
      with:
        name: Love Testsuite MacOS (Metal)
        title: test-report-macos-metal
        path: testing/output/lovetest_all.md
        token: ${{ secrets.GITHUB_TOKEN }}
    - name: Zip Test Output (Metal)
      run: |
        7z a -tzip test-output-macos-metal.zip ./testing/output/
    - name: Artifact Test Output (Metal)
      uses: actions/upload-artifact@v4
      with:
        name: test-output-macos-metal-${{ steps.report2.outputs.conclusion }}
        path: test-output-macos-metal.zip
    - name: Check Tests Passing (Metal)
      if: steps.report2.outputs.conclusion == 'failure'
      run: |
        echo "${{ steps.report2.outputs.failed }} metal tests failed"
        exit 1

  iOS-Simulator:
    runs-on: macos-14
    steps:
    - name: Checkout
      uses: actions/checkout@v4
    - name: Clone Dependencies
      uses: actions/checkout@v4
      with:
        path: apple-dependencies
        repository: love2d/love-apple-dependencies
        ref: main
    - name: Move Dependencies
      run: |
        mv apple-dependencies/iOS/libraries platform/xcode/ios
        mv apple-dependencies/shared platform/xcode
    - name: Build
      run:
        xcodebuild -project platform/xcode/love.xcodeproj -scheme love-ios -configuration Release -destination 'platform=iOS Simulator,name=iPhone 15'

  Android:
    runs-on: ubuntu-latest
    strategy:
      matrix:
        build_type: [Debug, Release]
    env:
      GRADLE_OPTS: "-Dorg.gradle.jvmargs='-Xmx4G'"
    steps:
    - name: Prepare Environment
      run: sudo apt-get update && curl -Lfo kitware-archive.sh https://apt.kitware.com/kitware-archive.sh && sudo bash ./kitware-archive.sh
    - name: Install Dependencies
      run: sudo apt-get install ninja-build cmake
    - name: Checkout love-android
      uses: actions/checkout@v4
      with:
        repository: love2d/love-android
        submodules: false
    - name: Setup Java 17
      uses: actions/setup-java@v4
      with:
        distribution: adopt-hotspot
        java-version: 17
        cache: gradle
    - name: Clone Megasource
      uses: actions/checkout@v4
      with:
        path: app/src/main/cpp/megasource
        repository: love2d/megasource
        ref: main
    - name: Checkout
      uses: actions/checkout@v4
      with:
        path: app/src/main/cpp/love
    - name: Build Normal Flavor
      run: bash ./gradlew assembleNormalRecord${{ matrix.build_type }}
    - name: Build Release-specific Binaries
      if: ${{ matrix.build_type == 'Release' }}
      run: bash ./gradlew bundleNormalNoRecordRelease bundleEmbedRecordRelease bundleEmbedNoRecordRelease
    - name: Artifact (Normal debug APK)
      if: ${{ matrix.build_type == 'Debug' }}
      uses: actions/upload-artifact@v4
      with:
        name: love-android-debug.apk
        path: app/build/outputs/apk/normalRecord/debug/app-normal-record-debug.apk
    - name: Artifact (Normal unsigned APK)
      if: ${{ matrix.build_type == 'Release' }}
      uses: actions/upload-artifact@v4
      with:
        name: love-android.apk
        path: app/build/outputs/apk/normalRecord/release/app-normal-record-release-unsigned.apk
    - name: Artifact (Normal AAB w/o recording)
      if: ${{ matrix.build_type == 'Release' }}
      uses: actions/upload-artifact@v4
      with:
        name: love-android-ps.aab
        path: app/build/outputs/bundle/normalNoRecordRelease/app-normal-noRecord-release.aab
    - name: Artifact (Embed AAB)
      if: ${{ matrix.build_type == 'Release' }}
      uses: actions/upload-artifact@v4
      with:
        name: love-android-embed-record.aab
        path: app/build/outputs/bundle/embedRecordRelease/app-embed-record-release.aab
    - name: Artifact (Embed AAB w/o recording)
      if: ${{ matrix.build_type == 'Release' }}
      uses: actions/upload-artifact@v4
      with:
        name: love-android-embed.aab
        path: app/build/outputs/bundle/embedNoRecordRelease/app-embed-noRecord-release.aab
    - name: Artifact (Debug symbols)
      uses: actions/upload-artifact@v4
      with:
        name: love-android-unstripped-debugsyms-${{ matrix.build_type }}
        path: app/build/intermediates/cxx