name: continuous-integration on: [push, pull_request] jobs: Linux: runs-on: ubuntu-22.04 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 \ 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 \ libvulkan1 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 update sudo apt install --assume-yes vulkan-sdk - name: Checkout love-appimage-source uses: actions/checkout@v4 with: repository: love2d/love-appimage-source ref: 12.x - 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-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.zip love2d-${{ github.sha }}/testing/output/ - name: Artifact Test Output (opengl) uses: actions/upload-artifact@v4 with: name: test-output-linux-opengl-${{ steps.report1.outputs.conclusion }} path: test-output-linux-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-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.zip love2d-${{ github.sha }}/testing/output/ - name: Artifact Test Output (opengles) uses: actions/upload-artifact@v4 with: name: test-output-linux-opengles-${{ steps.report2.outputs.conclusion }} path: test-output-linux-opengles.zip # linux vulkan tests - name: Run Test Suite (vulkan) env: LOVE_GRAPHICS_DEBUG: 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 with: name: Love Testsuite Linux title: test-report-linux-vulkan path: love2d-${{ github.sha }}/testing/output/lovetest_all.md - name: Zip Test Output (vulkan) run: | 7z a -tzip test-output-linux-vulkan.zip love2d-${{ github.sha }}/testing/output/ - name: Artifact Test Output (vulkan) uses: actions/upload-artifact@v4 with: name: test-output-linux-vulkan path: test-output-linux-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-x86_64.AppImage path: love-${{ github.sha }}.AppImage - name: Artifact Debug Symbols uses: actions/upload-artifact@v4 with: name: love-x86_64-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' run: | echo "${{ steps.report1.outputs.failed }} opengl tests failed" echo "${{ steps.report2.outputs.failed }} opengles tests failed" exit 1 Windows: runs-on: windows-latest 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: 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 v143 -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/23.2.1/mesa3d-23.2.1-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 # 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