name: Build on: push: branches: - master # For testing. - actions tags: - "v*.*" paths-ignore: - '*.{txt,md}' - 'Tools/**' - '.{editorconfig,gitattributes,gitignore}' - 'appveyor.yml' pull_request: branches: - master paths-ignore: - '*.{txt,md}' - 'Tools/**' - '.{editorconfig,gitattributes,gitignore}' - 'appveyor.yml' env: BUILD_CONFIGURATION: Release jobs: build-windows: strategy: fail-fast: false matrix: platform: [x64, ARM64] runs-on: windows-latest steps: - uses: actions/checkout@v4 with: submodules: recursive - name: Add MSBuild to PATH uses: microsoft/setup-msbuild@v2 - name: Build Windows working-directory: ${{ env.GITHUB_WORKSPACE }} run: msbuild /m /p:TrackFileAccess=false /p:Configuration=${{ env.BUILD_CONFIGURATION }} /p:Platform=${{ matrix.platform }} Windows/PPSSPP.sln - name: Package build working-directory: ${{ env.GITHUB_WORKSPACE }} run: | mkdir ppsspp cp PPSSPP*.exe ppsspp/ cp *.pdb ppsspp/ cp Windows/*.bat ppsspp/ cp -r assets ppsspp/assets - name: Package headless (non-Win32) if: matrix.platform != 'Win32' run: cp Windows/${{ matrix.platform }}/Release/*.exe ppsspp/ - name: Package headless (Win32) if: matrix.platform == 'Win32' run: cp Windows/Release/*.exe ppsspp/ - name: Upload build uses: actions/upload-artifact@v4 with: name: Windows ${{ matrix.platform }} build path: ppsspp/ build-uwp: runs-on: windows-2019 steps: - uses: actions/checkout@v4 with: submodules: recursive - name: Add MSBuild to PATH uses: microsoft/setup-msbuild@v2 - name: Build UWP working-directory: ${{ env.GITHUB_WORKSPACE }} run: msbuild /m /p:TrackFileAccess=false /p:Configuration=${{ env.BUILD_CONFIGURATION }} /p:Platform=x64 /p:AppxPackageSigningEnabled=false UWP/PPSSPP_UWP.sln test-windows: runs-on: windows-latest needs: build-windows timeout-minutes: 30 steps: - uses: actions/checkout@v4 with: submodules: false - name: Fetch tests working-directory: ${{ env.GITHUB_WORKSPACE }} # Doing this to avoid ffmpeg and other large submodules. run: git submodule update --init pspautotests assets/lang - name: Download build uses: actions/download-artifact@v4 with: name: Windows x64 build path: ppsspp/ - name: Execute unit tests working-directory: ${{ env.GITHUB_WORKSPACE }} run: ppsspp\\UnitTest.exe ALL - name: Execute headless tests working-directory: ${{ env.GITHUB_WORKSPACE }} run: python test.py -g --graphics=software build: strategy: fail-fast: false matrix: include: - os: ubuntu-latest extra: test cc: clang cxx: clang++ args: ./b.sh --headless --unittest id: clang-normal - os: ubuntu-latest cc: gcc cxx: g++ args: ./b.sh --headless --unittest id: gcc-normal - os: ubuntu-latest extra: android cc: clang cxx: clang++ args: cd android && ./ab.sh -j2 APP_ABI=arm64-v8a UNITTEST=1 HEADLESS=1 id: android-arm64 - os: ubuntu-latest extra: android cc: clang cxx: clang++ args: cd android && ./ab.sh -j2 APP_ABI=armeabi-v7a UNITTEST=1 HEADLESS=1 id: android-arm32 - os: ubuntu-latest extra: android cc: clang cxx: clang++ args: cd android && ./ab.sh -j2 APP_ABI=x86_64 UNITTEST=1 HEADLESS=1 id: android-x86_64 - os: ubuntu-latest extra: android cc: clang cxx: clang++ args: cd android && ./ab.sh -j2 APP_ABI=arm64-v8a OPENXR=1 id: android-vr - os: ubuntu-latest extra: android cc: clang cxx: clang++ args: ./b.sh --libretro_android ppsspp_libretro id: android-libretro - os: ubuntu-latest extra: qt cc: gcc cxx: g++ args: ./b.sh --qt id: qt - os: ubuntu-latest extra: libretro cc: gcc cxx: g++ args: make -C libretro -f Makefile -j2 id: gcc-libretro - os: ubuntu-latest extra: libretro cc: clang cxx: clang++ args: make -C libretro -f Makefile -j2 id: clang-libretro - os: macos-latest extra: test cc: clang cxx: clang++ args: ./b.sh --headless --unittest --fat --no-png --no-sdl2 id: macos - os: macos-latest extra: ios cc: clang cxx: clang++ args: ./b.sh --ios id: ios runs-on: ${{ matrix.os }} steps: - uses: actions/checkout@v4 with: submodules: recursive - name: Fetch tags for macOS releases if: runner.os == 'macOS' # This is required for git describe --always to work for git-version.cpp. run: | git fetch --deepen=15000 --no-recurse-submodules --tags || exit 0 - name: Install Qt uses: jurplel/install-qt-action@v4 if: matrix.extra == 'qt' with: cache: true - uses: nttld/setup-ndk@v1 if: matrix.extra == 'android' id: setup-ndk with: ndk-version: r21e - name: Install Linux dependencies if: runner.os == 'Linux' && matrix.extra != 'android' run: | sudo add-apt-repository -y "deb http://archive.ubuntu.com/ubuntu `lsb_release -sc` main universe restricted multiverse" sudo apt-get update -y -qq sudo apt-get install libsdl2-dev libgl1-mesa-dev libglu1-mesa-dev libsdl2-ttf-dev libfontconfig1-dev - name: Create macOS git-version.cpp for tagged release if: startsWith(github.ref, 'refs/tags/') && runner.os == 'macOS' && matrix.extra == 'test' run: | echo "const char *PPSSPP_GIT_VERSION = \"${GITHUB_REF##*/}\";" > git-version.cpp echo "#define PPSSPP_GIT_VERSION_NO_UPDATE 1" >> git-version.cpp - name: Setup ccache uses: hendrikmuhs/ccache-action@v1.2 # Disable ccache on macos for now, it's become buggy for some reason. if: matrix.id != 'macos' with: key: ${{ matrix.id }} - name: Execute build env: CC: ${{ matrix.cc }} CXX: ${{ matrix.cxx }} NDK: ${{ steps.setup-ndk.outputs.ndk-path }} NDK_CCACHE: ccache USE_CCACHE: 1 run: | export PATH="/usr/lib/ccache:/usr/local/opt/ccache/libexec:$PATH" export CCACHE_SLOPPINESS=clang_index_store,ivfsoverlay,include_file_ctime,include_file_mtime,modules,system_headers,time_macros if [ "${{ matrix.extra }}" == "android" ]; then export CCACHE_FILECLONE=true export CCACHE_DEPEND=true export CCACHE_COMPILERCHECK=content elif [ "$RUNNER_OS" == "macOS" ]; then export CCACHE_SLOPPINESS=pch_defines,$CCACHE_SLOPPINESS export CCACHE_FILECLONE=true export CCACHE_DEPEND=true export CCACHE_COMPILERCHECK=content fi ${{ matrix.args }} - name: Package build if: matrix.extra == 'test' run: | mkdir ppsspp if [ -e build*/$BUILD_CONFIGURATION/PPSSPPSDL ]; then cp build*/$BUILD_CONFIGURATION/PPSSPPSDL ppsspp/ elif [ -e build*/PPSSPPSDL.app ]; then cp -a build*/PPSSPPSDL.app ppsspp/ # GitHub Actions zipping kills symlinks and permissions. cd ppsspp zip -qry PPSSPPSDL.zip PPSSPPSDL.app rm -rf PPSSPPSDL.app cd - elif [ -e build*/PPSSPPSDL ]; then cp build*/PPSSPPSDL ppsspp/ cp -r assets ppsspp/assets fi if [ -e build*/$BUILD_CONFIGURATION/PPSSPPHeadless ]; then cp build*/$BUILD_CONFIGURATION/PPSSPPHeadless ppsspp/ elif [ -e build*/PPSSPPHeadless ]; then cp build*/PPSSPPHeadless ppsspp/ fi if [ -e build*/$BUILD_CONFIGURATION/PPSSPPUnitTest ]; then cp build*/$BUILD_CONFIGURATION/PPSSPPUnitTest ppsspp/ elif [ -e build*/PPSSPPUnitTest ]; then cp build*/PPSSPPUnitTest ppsspp/ fi - name: Upload build uses: actions/upload-artifact@v4 if: matrix.extra == 'test' with: name: ${{ matrix.os }} build path: ppsspp/ - name: Create macOS release if: startsWith(github.ref, 'refs/tags/') && runner.os == 'macOS' && matrix.extra == 'test' run: | cd ppsspp || exit 1 mv PPSSPPSDL.zip PPSSPPSDL-macOS-${GITHUB_REF##*/}.zip || exit 1 - name: Upload macOS release uses: softprops/action-gh-release@v2 if: startsWith(github.ref, 'refs/tags/') && runner.os == 'macOS' && matrix.extra == 'test' with: files: ppsspp/*.zip body: > PPSSPP is a cross-platform PSP emulator. Visit PPSSPP [official website](https://ppsspp.org) for a [full changelog](https://ppsspp.org/index.html#news) as well as the [downloads section](https://ppsspp.org/downloads.html) for other platforms. test: strategy: fail-fast: false matrix: os: [ubuntu-latest, macos-latest] runs-on: ${{ matrix.os }} needs: build timeout-minutes: 30 steps: - uses: actions/checkout@v4 with: submodules: false - name: Fetch tests working-directory: ${{ env.GITHUB_WORKSPACE }} # Doing this to avoid ffmpeg and other large submodules. run: git submodule update --init pspautotests assets/lang - name: Install Linux dependencies if: runner.os == 'Linux' run: | sudo add-apt-repository -y "deb http://archive.ubuntu.com/ubuntu `lsb_release -sc` main universe restricted multiverse" sudo apt-get update -y -qq sudo apt-get install libsdl2-dev libgl1-mesa-dev libglu1-mesa-dev libsdl2-ttf-dev libfontconfig1-dev - name: Install macOS dependencies if: runner.os == 'macOS' run: | git submodule update --init SDL/macOS - name: Download build uses: actions/download-artifact@v4 with: name: ${{ matrix.os }} build path: ppsspp/ # Not sure where it's ending up, but test.py can't find it... - name: Fix headless permissions working-directory: ${{ env.GITHUB_WORKSPACE }} run: | cp `find . -name PPSSPPHeadless` . chmod +x PPSSPPHeadless cp `find . -name PPSSPPUnitTest` . chmod +x PPSSPPUnitTest - name: Execute unit tests working-directory: ${{ env.GITHUB_WORKSPACE }} run: ./PPSSPPUnitTest ALL - name: Execute headless tests working-directory: ${{ env.GITHUB_WORKSPACE }} run: python test.py -g --graphics=software build_test_headless_alpine: runs-on: ubuntu-latest container: image: alpine:latest options: --shm-size=8g steps: - name: Install Linux dependencies (Alpine) run: | apk add build-base wget git bash cmake python3 glu-dev sdl2-dev - uses: actions/checkout@v4 with: submodules: recursive - name: Fix git detected dubious ownership in repository run: | chown -R $(id -u):$(id -g) $PWD - name: Setup ccache uses: hendrikmuhs/ccache-action@v1.2 - name: Compile ffmpeg run: | cd ffmpeg && ./linux_x86-64.sh - name: Build for testing run: | ./b.sh --headless --unittest - name: Execute unit tests run: | ./build/PPSSPPUnitTest ALL - name: Execute headless tests run: | python test.py -g --graphics=software