File ppsspp.spec of Package ppsspp

#
# spec file for package ppsspp
#
# Copyright (c) 2025 SUSE LLC
# Copyright (c) 2024 Andreas Stieger <Andreas.Stieger@gmx.de>
#
# All modifications and additions to the file contributed by third parties
# remain the property of their copyright owners, unless otherwise agreed
# upon. The license for this file, and modifications and additions to the
# file, is the same license as for the pristine package itself (unless the
# license for the pristine package is not an Open Source License, in which
# case the license is the MIT License). An "Open Source License" is a
# license that conforms to the Open Source Definition (Version 1.9)
# published by the Open Source Initiative.

# Please submit bugfixes or comments via https://bugs.opensuse.org/
#


%define _lto_cflags %{nil}
Name:           ppsspp
Version:        1.18.1
Release:        0
Summary:        PlayStation Portable Emulator
License:        Apache-2.0 AND BSD-1-Clause AND BSL-1.0 AND GPL-2.0-or-later AND LGPL-2.0-or-later AND LGPL-2.1-or-later AND BSD-2-Clause AND BSD-3-Clause AND (BSD-2-Clause OR GPL-2.0-or-later) AND (BSD-3-Clause OR GPL-2.0-only) AND CC0-1.0 AND GPL-2.0-or-later WITH Autoconf-exception-3.0 AND GPL-3.0-or-later WITH Bison-exception-2.2 AND Libpng AND ISC AND IJG AND Zlib AND MIT AND CC-BY-4.0 AND FTL
Group:          System/Emulators/Other
URL:            https://www.ppsspp.org
Source:         https://github.com/hrydgard/ppsspp/releases/download/v%{version}/%{name}-%{version}.tar.xz
%ifnarch %{arm} aarch64
Patch0:         ppsspp-1.14.4-system-png.patch
%endif
Patch1:         ppsspp-system-miniupnpc.patch
Patch2:         ppsspp-fix-new-sdl.patch
BuildRequires:  Mesa-devel
BuildRequires:  c++_compiler
BuildRequires:  cmake >= 3.16
BuildRequires:  fdupes
BuildRequires:  cmake(glslang)
BuildRequires:  pkgconfig
BuildRequires:  pkgconfig(wayland-client)
BuildRequires:  pkgconfig(wayland-server)
BuildRequires:  pkgconfig(wayland-egl)
BuildRequires:  pkgconfig(wayland-cursor)
BuildRequires:  pkgconfig(SDL2_ttf)
BuildRequires:  pkgconfig(fontconfig)
BuildRequires:  pkgconfig(gl)
%ifarch %{arm} aarch64
BuildRequires:  pkgconfig(glew)
BuildRequires:  pkgconfig(glu)
%endif
BuildRequires:  pkgconfig(libavcodec)
BuildRequires:  pkgconfig(libavdevice)
BuildRequires:  pkgconfig(libavfilter)
BuildRequires:  pkgconfig(libavformat)
BuildRequires:  pkgconfig(libavutil)
BuildRequires:  pkgconfig(libpng) >= 1.6
BuildRequires:  pkgconfig(libpostproc)
BuildRequires:  pkgconfig(libswresample)
BuildRequires:  pkgconfig(libswscale)
BuildRequires:  pkgconfig(libzip)
BuildRequires:  pkgconfig(libzstd)
BuildRequires:  pkgconfig(miniupnpc)
BuildRequires:  pkgconfig(sdl2)
BuildRequires:  pkgconfig(snappy)
BuildRequires:  pkgconfig(vulkan)
BuildRequires:  pkgconfig(zlib)
#Qt deps:
BuildRequires:  pkgconfig(Qt5Core)
BuildRequires:  pkgconfig(Qt5Gui)
BuildRequires:  pkgconfig(Qt5Multimedia)
BuildRequires:  pkgconfig(Qt5OpenGL)

# Does not build with FFmpeg 5.0 yet
BuildRequires:  libavcodec-devel < 5

#Desktop icon deps
BuildRequires:  update-desktop-files

Requires:       %{name}-common
Requires(post): hicolor-icon-theme
Requires(postun): hicolor-icon-theme

# never built for PowerPC
ExcludeArch:    ppc ppc64 ppc64le s390x

%description
PPSSPP is a PSP emulator written in C++, and translates PSP CPU instructions directly into optimized x86, x64 and ARM machine code, using JIT recompilers (dynarecs).

%package headless
Summary:        PPSSPP headless
Group:          System/Emulators/Other
Requires:       %{name}-common

%description headless
PPSSPP headless build

%package qt
Summary:        PPSSPP Qt backend
Group:          System/Emulators/Other
Requires:       %{name}-common

%description qt
PPSSPP build using the Qt framework

%package common
Summary:        PPSSPP assets
Group:          System/Emulators/Other
BuildArch:      noarch

%description common
Required assets for PPSSPP GUI and assorted configuration files

%prep
%autosetup -p1

# Remove bundled libraries
rm -rf \
  Windows \
  UWP \
  ext/native/ext/libzip \
  ext/native/tools/prebuilt/win64 \
  ext/zlib \
  ext/libzip \
  ext/zstd \
  ext/miniupnp \
  macOS \
  libretro \
  ios \
  %{nil}

echo "// This is a generated file.

const char *PPSSPP_GIT_VERSION = \"%{version}\";

// If you don't want this file to update/recompile, change to 1.
#define PPSSPP_GIT_VERSION_NO_UPDATE 1
" > git-version.cpp

%build

mkdir -p build-headless build-qt build

%define __builddir build-headless
%cmake \
        -DLIBRETRO="OFF" \
        -DUSE_SYSTEM_FFMPEG="ON" \
        -DUSE_SYSTEM_SNAPPY="ON" \
        -DUSE_SYSTEM_LIBZIP="ON" \
        -DUSE_SYSTEM_LIBSDL2="ON" \
        -DUSE_SYSTEM_LIBPNG="ON" \
        -DUSE_SYSTEM_ZSTD="ON" \
        -DUSE_SYSTEM_MINIUPNPC="ON" \
        -DUSE_WAYLAND_WSI="ON" \
        -DUSE_VULKAN_DISPLAY_KHR="ON" \
        -DCMAKE_SKIP_RPATH="YES" \
        -Wno-dev \
        -DUSING_QT_UI="OFF" \
        -DHEADLESS="ON" \
%ifarch %{arm} aarch64
        -DUSING_GLES2=ON -DUSING_EGL=ON \
%endif
        %{nil}
%cmake_build

cd ..

%define __builddir build-qt
%cmake \
        -DLIBRETRO="OFF" \
        -DUSE_SYSTEM_FFMPEG="ON" \
        -DUSE_SYSTEM_SNAPPY="ON" \
        -DUSE_SYSTEM_LIBZIP="ON" \
        -DUSE_SYSTEM_LIBSDL2="ON" \
        -DUSE_SYSTEM_LIBPNG="ON" \
        -DUSE_SYSTEM_ZSTD="ON" \
        -DUSE_SYSTEM_MINIUPNPC="ON" \
        -DUSE_WAYLAND_WSI="ON" \
        -DUSE_VULKAN_DISPLAY_KHR="ON" \
        -DCMAKE_SKIP_RPATH="YES" \
        -Wno-dev \
        -DUSING_QT_UI="ON" \
        -DHEADLESS="OFF" \
%ifarch %{arm} aarch64
        -DUSING_GLES2=ON -DUSING_EGL=ON \
%endif
        %{nil}
%cmake_build

cd ..

%define __builddir build
%cmake \
        -DLIBRETRO="OFF" \
        -DUSE_SYSTEM_FFMPEG="ON" \
        -DUSE_SYSTEM_SNAPPY="ON" \
        -DUSE_SYSTEM_LIBZIP="ON" \
        -DUSE_SYSTEM_LIBSDL2="ON" \
        -DUSE_SYSTEM_LIBPNG="ON" \
        -DUSE_SYSTEM_ZSTD="ON" \
        -DUSE_SYSTEM_MINIUPNPC="ON" \
        -DUSE_WAYLAND_WSI="ON" \
        -DUSE_VULKAN_DISPLAY_KHR="ON" \
        -DCMAKE_SKIP_RPATH="YES" \
        -Wno-dev \
        -DUSING_QT_UI="OFF" \
        -DHEADLESS="OFF" \
%ifarch %{arm} aarch64
        -DUSING_GLES2=ON -DUSING_EGL=ON \
%endif
        %{nil}
%cmake_build

%install
mkdir -p %{buildroot}%{_bindir}
mkdir -p %{buildroot}%{_libexecdir}/%{name}
mkdir -p %{buildroot}%{_sysconfdir}/%{name}

#setup wrapper(s)

##----------------####----------------####----------------####----------------##

touch %{buildroot}%{_sysconfdir}/%{name}/%{name}-headless.env

cat > %{buildroot}%{_bindir}/%{name}-headless << 'EOF'
#!/bin/sh

#Mark all sourced variables for export
set -a

#Do not edit this file!
#Use %{_sysconfdir}/%{name}/%{name}-headless.env to set environment variables
. %{_sysconfdir}/%{name}/%{name}-headless.env

exec %{_libexecdir}/%{name}/%{name}-headless "$@"

EOF

##----------------####----------------####----------------####----------------##

touch %{buildroot}%{_sysconfdir}/%{name}/%{name}-qt.env

cat > %{buildroot}%{_bindir}/%{name}-qt << 'EOF'
#!/bin/sh

#Mark all sourced variables for export
set -a

#Do not edit this file!
#Use %{_sysconfdir}/%{name}/%{name}-qt.env to set environment variables
. %{_sysconfdir}/%{name}/%{name}-qt.env

exec %{_libexecdir}/%{name}/%{name}-qt "$@"

EOF

##----------------####----------------####----------------####----------------##

touch %{buildroot}%{_sysconfdir}/%{name}/%{name}.env

cat > %{buildroot}%{_bindir}/%{name} << 'EOF'
#!/bin/sh

#Mark all sourced variables for export
set -a

#Do not edit this file!
#Use %{_sysconfdir}/%{name}/%{name}.env to set environment variables
. %{_sysconfdir}/%{name}/%{name}.env

exec %{_libexecdir}/%{name}/%{name} "$@"

EOF

##----------------####----------------####----------------####----------------##

#install files
install -m 755 -D build-headless/PPSSPPHeadless %{buildroot}%{_libexecdir}/%{name}/%{name}-headless

install -m 755 -D build-qt/PPSSPPQt %{buildroot}%{_libexecdir}/%{name}/%{name}-qt

install -m 755 -D build/PPSSPPSDL %{buildroot}%{_libexecdir}/%{name}/%{name}

mv assets %{buildroot}%{_libexecdir}/%{name}/
mkdir -p %{buildroot}%{_datadir}/pixmaps
install -m 444 -D icons/icon.svg %{buildroot}%{_datadir}/pixmaps/%{name}.svg

%suse_update_desktop_file -c %{name} PPSSPP 'PSP Emulator' %{name} %{name} System Emulator
%suse_update_desktop_file -c %{name}-qt PPSSPPQt 'PSP Emulator' %{name}-qt %{name} System Emulator

%fdupes %{buildroot}

%post
%desktop_database_post
%icon_theme_cache_post

%postun
%desktop_database_postun
%icon_theme_cache_postun

%files headless
%license LICENSE.TXT
%attr(755,root,root) %{_bindir}/%{name}-headless
%attr(755,root,root) %{_libexecdir}/%{name}/%{name}-headless

%files qt
%license LICENSE.TXT
%attr(755, root, root) %{_bindir}/%{name}-qt
%attr(755, root, root) %{_libexecdir}/%{name}/%{name}-qt
%{_datadir}/applications/%{name}-qt.desktop

%files common
%doc README.md
%license LICENSE.TXT
%{_libexecdir}/%{name}/assets
%{_datadir}/pixmaps/%{name}.svg

%config(noreplace) %{_sysconfdir}/%{name}

%files
%license LICENSE.TXT
%dir %{_libexecdir}/%{name}
%attr(755, root, root) %{_bindir}/%{name}
%attr(755, root, root) %{_libexecdir}/%{name}/%{name}
%{_datadir}/applications/%{name}.desktop

%changelog
openSUSE Build Service is sponsored by