%global gitbranch nvidia-l4t # Full 40-char SHA; the GitLab CI keeps this in sync with upstream HEAD # (uploadpack.allowAnySHA1InWant honors full hashes only). %global gitcommit 28a28c26bf5e4010dc2ac00dec780556b6cca796 %global gitcommit_short %(echo %{gitcommit} | cut -c1-7) # Already-stripped binary; skip auto -debuginfo. %global debug_package %{nil} Name: rpcs3 Version: 0^g%{gitcommit_short} Release: 1%{?dist} Summary: PS3 emulator (mrcmunir aarch64/L4T fork of RPCS3) License: GPL-2.0-only URL: https://github.com/mrcmunir/%{name} # Sources fetched in %%prep via `git clone`; COPR project l4s has # enable_net=true so this works inside mock as well. ExclusiveArch: aarch64 BuildRequires: cmake >= 3.28 BuildRequires: ninja-build BuildRequires: clang >= 19 BuildRequires: clang-devel BuildRequires: llvm-devel BuildRequires: llvm-static BuildRequires: lld BuildRequires: gcc-c++ BuildRequires: git BuildRequires: python3 BuildRequires: perl BuildRequires: nasm BuildRequires: make BuildRequires: pkgconfig # Audio BuildRequires: alsa-lib-devel BuildRequires: pulseaudio-libs-devel BuildRequires: openal-soft-devel # Graphics / window system BuildRequires: mesa-libGL-devel BuildRequires: mesa-libGLU-devel BuildRequires: vulkan-loader-devel BuildRequires: vulkan-headers BuildRequires: glew-devel BuildRequires: glm-devel BuildRequires: libX11-devel BuildRequires: libXext-devel BuildRequires: libxcb-devel BuildRequires: wayland-devel BuildRequires: wayland-protocols-devel BuildRequires: libxkbcommon-devel # Qt (qtbase, declarative, svg, multimedia) BuildRequires: qt6-qtbase-devel BuildRequires: qt6-qtbase-private-devel BuildRequires: qt6-qtmultimedia-devel BuildRequires: qt6-qtsvg-devel BuildRequires: qt6-qtdeclarative-devel BuildRequires: qt6-qttools-devel # Input / misc BuildRequires: SDL3-devel BuildRequires: libevdev-devel BuildRequires: libudev-devel BuildRequires: systemd-devel # Networking / crypto / multimedia BuildRequires: libcurl-devel BuildRequires: libunwind-devel # System OpenCV (USE_SYSTEM_OPENCV=ON in CI) BuildRequires: opencv-devel # Misc BuildRequires: zlib-devel BuildRequires: zlib-static %description RPCS3 is an open-source Sony PlayStation 3 emulator and debugger. This package builds the mrcmunir nvidia-l4t branch — an aarch64/Linux-for-Tegra fork targeting Nintendo Switch hardware running L4T. %prep rm -rf %{name}-%{version} git clone --depth=1 --branch %{gitbranch} %{url} %{name}-%{version} cd %{name}-%{version} git fetch --depth=1 origin %{gitcommit} git checkout %{gitcommit} # Submodules we never compile here (mirrors .ci/build-linux-aarch64.sh's # skip list): bundled LLVM (we link against the system llvm), bundled # OpenCV (USE_SYSTEM_OPENCV=ON), bundled SDL (USE_SYSTEM_SDL=ON), bundled # curl (USE_SYSTEM_CURL=ON), bundled zlib (system zlib). git config submodule.3rdparty/llvm/llvm.update none git config submodule.3rdparty/opencv/opencv.update none git config submodule.3rdparty/libsdl-org/SDL.update none git config submodule.3rdparty/curl/curl.update none git config submodule.3rdparty/zlib/zlib.update none # Per-submodule retry loop. `git submodule foreach` is a no-op on a fresh # clone, so read paths directly from .gitmodules and walk them serially. # Parallel updates hit GitHub's rate limiter and can leave empty submodule # directories on partial failures (cmake then errors with "no SOURCES"). git submodule init git submodule sync submodules=$(git config --file .gitmodules --get-regexp 'submodule\..*\.path' | awk '{print $2}') for sm in $submodules; do if [ "$(git config --get "submodule.${sm}.update" 2>/dev/null || true)" = "none" ]; then echo "skip ${sm} (update=none)" continue fi ok= for attempt in 1 2 3 4 5 6 7 8; do rm -rf -- "${sm}" ".git/modules/${sm}" git submodule init -- "${sm}" >/dev/null if git submodule update --depth=1 -- "${sm}"; then ok=1 break fi echo "${sm}: attempt ${attempt} failed, retrying in $((attempt * 5))s..." >&2 sleep $((attempt * 5)) done if [ -z "$ok" ]; then echo "submodule ${sm}: exhausted retries" >&2 exit 1 fi done # Top-up any nested submodules that the top-level loop didn't reach. for attempt in 1 2 3 4 5; do if git submodule update --init --recursive --depth=1 \ $(awk '/path/ && !/llvm/ && !/opencv/ && !/libsdl-org/ && !/curl/ && !/zlib/ { print $3 }' .gitmodules); then break fi echo "nested submodule fetch attempt ${attempt} failed, retrying in $((attempt * 5))s..." >&2 sleep $((attempt * 5)) done %build cd %{name}-%{version} export CC=clang export CXX=clang++ # Drop distro hardening flags — they conflict with several of the vendored # 3rdparty builds (asmjit, FAudio, etc.). export CFLAGS= export CXXFLAGS= export LDFLAGS= cmake -S . -B build -G Ninja \ -DCMAKE_INSTALL_PREFIX=/usr \ -DCMAKE_BUILD_TYPE=Release \ -DCMAKE_C_COMPILER=clang \ -DCMAKE_CXX_COMPILER=clang++ \ -DCMAKE_EXE_LINKER_FLAGS="-fuse-ld=lld" \ -DCMAKE_MODULE_LINKER_FLAGS="-fuse-ld=lld" \ -DCMAKE_SHARED_LINKER_FLAGS="-fuse-ld=lld" \ -DUSE_NATIVE_INSTRUCTIONS=OFF \ -DUSE_PRECOMPILED_HEADERS=OFF \ -DUSE_SDL=ON \ -DUSE_SYSTEM_SDL=ON \ -DUSE_SYSTEM_CURL=ON \ -DUSE_SYSTEM_FFMPEG=OFF \ -DUSE_SYSTEM_OPENCV=ON \ -DUSE_DISCORD_RPC=ON \ -DBUILD_LLVM=OFF \ -DSTATIC_LINK_LLVM=ON \ -DWITH_LLVM=ON \ -DOpenGL_GL_PREFERENCE=LEGACY cmake --build build -j%{?_smp_build_ncpus}%{!?_smp_build_ncpus:1} %install cd %{name}-%{version} DESTDIR=%{buildroot} cmake --install build %files %license %{name}-%{version}/LICENSE %doc %{name}-%{version}/README.md %{_bindir}/rpcs3 %{_datadir}/applications/rpcs3.desktop %{_datadir}/icons/hicolor/48x48/apps/rpcs3.png %{_datadir}/icons/hicolor/scalable/apps/rpcs3.svg %{_datadir}/metainfo/rpcs3.metainfo.xml %{_datadir}/rpcs3/ %changelog %autochangelog