File vita3k.spec of Package vita3k

#
# spec file for package vita3k
#
# Copyright (c) 2024 SUSE LLC
#
# 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/
#


%global use_clang 1
# gcc build is broken: https://github.com/Vita3K/Vita3K/issues/1418#issuecomment-1837539345
%global use_lld 1
%global use_lto 1
%define __builder ninja
%define git_hash cb15157c

Name:           vita3k
Version:        20240406T190309.d49480f
Release:        0
Summary:        The PlayStation Vita emulator
License:        GPL-2.0-only
Group:          System/Emulators/Other
URL:            https://vita3k.org/
Source0:        %{name}-%{version}.tar.xz
Source1:        vita3k.sh
# insane crap from https://github.com/Vita3K/ffmpeg-core/releases
Source2:        ffmpeg-linux-x64.zip
#Patch100:       vita3k-issue664_workaround.patch
#Patch101:       vita3k-llvm.patch
#Patch110:       vita3k-PR2628.patch
#Patch111:       vita3k-PR2635.patch
#Patch112:       vita3k-PR2640.patch
BuildRequires:  chrpath
BuildRequires:  fdupes
BuildRequires:  git
BuildRequires:  hicolor-icon-theme
BuildRequires:  update-desktop-files
# the thing is hardcoded to use its own local dump
#BuildRequires:  discord-rpc-devel
BuildRequires:  libboost_filesystem-devel
BuildRequires:  ZArchive-devel
BuildRequires:  glslang-devel
BuildRequires:  libboost_program_options-devel
BuildRequires:  libboost_system-devel
BuildRequires:  libzarchive0_1
BuildRequires:  pkgconfig
BuildRequires:  pkgconfig(RapidJSON)
BuildRequires:  pkgconfig(alsa)
BuildRequires:  pkgconfig(fmt)
BuildRequires:  pkgconfig(glm)
BuildRequires:  pkgconfig(gtk+-3.0)
BuildRequires:  pkgconfig(jack)
BuildRequires:  pkgconfig(libavdevice)
BuildRequires:  pkgconfig(libavfilter)
BuildRequires:  pkgconfig(libavformat)
BuildRequires:  pkgconfig(libavutil)
BuildRequires:  pkgconfig(libcurl)
BuildRequires:  pkgconfig(libedit)
BuildRequires:  pkgconfig(liblz4)
BuildRequires:  pkgconfig(liblzma)
BuildRequires:  pkgconfig(libpng)
BuildRequires:  pkgconfig(libpostproc)
BuildRequires:  pkgconfig(libpulse)
BuildRequires:  pkgconfig(libswresample)
BuildRequires:  pkgconfig(libswscale)
BuildRequires:  pkgconfig(libxml-2.0)
BuildRequires:  pkgconfig(libzip)
BuildRequires:  pkgconfig(libzstd)
BuildRequires:  pkgconfig(openssl)
BuildRequires:  pkgconfig(pugixml)
BuildRequires:  pkgconfig(sdl2)
BuildRequires:  pkgconfig(speexdsp)
BuildRequires:  pkgconfig(tinfo5)
BuildRequires:  pkgconfig(yaml-cpp)
BuildRequires:  pkgconfig(zlib)
%if 0%{?use_clang}
BuildRequires:  clang-devel
#BuildRequires:     npth-devel
%if 0%{?use_lld}
BuildRequires:  lld
%else
BuildRequires:  binutils-gold
BuildRequires:  llvm-gold
%endif
%else
BuildRequires:  binutils-gold
BuildRequires:  gcc-c++
%endif
BuildRequires:  cmake
BuildRequires:  llvm-devel
BuildRequires:  ninja
ExclusiveArch:  x86_64

%description
Vita3K is an experimental PlayStation Vita emulator for Windows, Linux, macOS and Android.
The emulator currently runs most homebrew programs. It is also able to load some commercial games.

CAREFUL, IT FORCES DEPENDENCY ON THEIR OWN PRECOMPILED FFMPEG BINARIES AND DEVS BAN YOU FOR ANY DISCUSSION OF POTENTIAL GPL VIOLATION AND GENERAL ANTI-PACKAGER BEHAVIOUR!!!
See https://github.com/Vita3K/Vita3K/issues/3257

%prep
%setup -q
mkdir -pv build/external/
cp -v %{SOURCE2} build/external/ffmpeg.zip
# remove retarded extraneous check and hardcodings, as customary for Windows-centric repos
sed -i -e '/FATAL_ERROR/s:FATAL_ERROR:WARNING:g' external/CMakeLists.txt
sed -i '/Boost_USE_STATIC_LIBS/d' CMakeLists.txt vita3k/CMakeLists.txt
sed -i '/llvm_config(dynarmic/s:${USE_SHARED}:USE_SHARED:' external/dynarmic/src/dynarmic/CMakeLists.txt

%build
# this macro needs 'BuildRequires: memory-constraints'
#limit_build -m 3072
ulimit -Sn 4000
UCFLAGS="%{optflags} -fPIC -O3"
%ifarch x86_64
export UCFLAGS="${UCFLAGS} -march=x86-64 -mtune=generic -mssse3 -msse4 -msse4.1 -msse4.2 -mavx -maes -mpclmul"
%endif
export ULDFLAGS="-fPIC -Wl,-O1 -Wl,--icf=safe"
export ULDFLAGS="${ULDFLAGS} -Wl,--gc-sections"
%if 0%{?use_lld}
export ULDFLAGS="${ULDFLAGS} -fuse-ld=lld"
%ifarch %ix86 %arm
export ULDFLAGS="${ULDFLAGS} -Wl,-z,notext"
%endif
export LD="lld"
alias ld=ld.lld
%else
export ULDFLAGS="${ULDFLAGS} -fuse-ld=gold -Wl,--sort-common -Wl,-O1"
export LD=ld.gold
alias ld=gold
%endif
%if 0%{?use_clang}
export CC=clang
export CXX=clang++
export UCFLAGS="${UCFLAGS} -v -fbracket-depth=1024 -fconstexpr-depth=1024"
#export UCFLAGS="${UCFLAGS} -fexceptions"
#export UCXXFLAGS="${UCFLAGS} -fcxx-exceptions"
export UCXXFLAGS="${UCFLAGS}"
export HOST="$(${CC} -print-target-triple)"
%if 0%{?use_lto}
%if 0%{?use_lld}
%global _lto_cflags -flto=thin
%global _lto_ldlags -flto=thin -Wl,--plugin-opt=O3 %{?jobs:-Wl,--threads=%{jobs}}
%else
%global _lto_cflags -flto=thin
%global _lto_ldlags -flto=thin
%endif
%else
%global _lto_cflags %nil
%global _lto_ldlags %nil
%endif
%else
export CC=gcc
export CXX=g++
export UCFLAGS="${UCFLAGS} -ftree-parallelize-loops=8 -ftree-vectorize -fpredictive-commoning"
#export UCXXFLAGS="${UCFLAGS} -fpermissive"
export UCXXFLAGS="${UCFLAGS}"
export HOST="%{_target_platform}"
%if 0%{?use_lto}
%global _lto_cflags -fuse-linker-plugin %_lto_cflags -ffat-lto-objects -flto-odr-type-merging
%global _lto_ldlags -fuse-linker-plugin -flto=2
%else
%global _lto_cflags %nil
%global _lto_ldlags %nil
%endif
%endif
export TARGET="${HOST}"
export UCFLAGS="${UCFLAGS} %_lto_cflags"
export UCXXFLAGS="${UCXXFLAGS} %_lto_cflags"
export ULDFLAGS="${ULDFLAGS} %_lto_cflags %_lto_ldlags"
# override OBS defaults ?
export CFLAGS="${UCFLAGS}"
export CXXFLAGS="${UCXXFLAGS}"
export LDFLAGS="${ULDFLAGS}"

%cmake -G Ninja \
    -DBUILD_SHARED_LIBS=OFF \
    -DBUILD_STATIC_LIBS=ON \
    -DUSE_PCH=OFF -DENABLE_PCH=OFF \
    -DENABLE_PRECOMPILED_HEADERS=OFF \
    -DSKIP_PRECOMPILE_HEADERS=ON \
    -DUSE_PRECOMPILED_HEADERS=OFF \
    -DCMAKE_SKIP_RPATH=OFF \
    -DCMAKE_INSTALL_RPATH="" \
    -DCMAKE_BUILD_WITH_INSTALL_RPATH=OFF \
    -DCMAKE_SKIP_INSTALL_RPATH=ON \
    -DCMAKE_BUILD_TYPE=RelWithDebInfo \
    -DCMAKE_INSTALL_PREFIX="%{_prefix}" \
    -DCMAKE_C_COMPILER="${CC}" \
    -DCMAKE_CXX_COMPILER="${CXX}" \
    -DCMAKE_LINKER="${LD}" \
    -DCMAKE_C_FLAGS="${CFLAGS}" \
    -DCMAKE_CXX_FLAGS="${CXXFLAGS}" \
    -DDYNARMIC_CXX_FLAGS="${CXXFLAGS}" \
    -DMCL_CXX_FLAGS="${CXXFLAGS}" \
    -DCMAKE_EXE_LINKER_FLAGS="${CFLAGS} ${LDFLAGS}" \
    -DCMAKE_MODULE_LINKER_FLAGS="${CFLAGS} ${LDFLAGS}" \
    -DCMAKE_SHARED_LINKER_FLAGS="${CFLAGS} ${LDFLAGS}" \
    -DCMAKE_STATIC_LINKER_FLAGS="" \
    -DCMAKE_POSITION_INDEPENDENT_CODE=ON \
    -DTHREADS_PREFER_PTHREAD_FLAG=ON \
%if !0%{?use_lto}
    -DCMAKE_INTERPROCEDURAL_OPTIMIZATION=OFF \
%endif
    -DZYAN_WHOLE_PROGRAM_OPTIMIZATION=ON \
    -DXXH_X86DISPATCH_ALLOW_AVX=ON \
    -DDYNARMIC_USE_PRECOMPILED_HEADERS=OFF \
    -DDYNARMIC_ENABLE_NO_EXECUTE_SUPPORT=OFF \
    -DDYNARMIC_IGNORE_ASSERTS=ON \
    -DDYNARMIC_USE_LLVM=ON \
    -DGIT_HASH="%{git_hash}" \
    -DGIT_REPO="Vita3K" \
    -DGIT_BRANCH="master" \
    -DUSE_VITA3K_UPDATE=OFF \
    -DUSE_DISCORD_RICH_PRESENCE=OFF \
    -DVITA3K_FORCE_SYSTEM_BOOST=ON \
    -DBoost_USE_STATIC_LIBS=OFF \
    %{?nil}
%cmake_build

%install
# it just dumps pile of static crap and no binary… again, as customary
#cmake_install
# search for useful files
find build -type f
install -m 755 -D %{SOURCE1} %{buildroot}%{_bindir}/vita3k.sh
install -m 755 -D build/bin/Vita3K %{buildroot}%{_bindir}/Vita3K
mkdir -p %{buildroot}/%{_datadir}/pixmaps
mv -v build/bin/data/image/icon.png %{buildroot}/%{_datadir}/pixmaps/%{name}.png
mkdir -p %{buildroot}/%{_datadir}/%{name}/
mv -v build/bin/{data,lang,shaders-builtin} %{buildroot}/%{_datadir}/%{name}/
%suse_update_desktop_file -c %{name} Vita3K 'PSV Emulator' vita3k.sh %{name} System Emulator
chmod -x README.md
chrpath --delete %{buildroot}%{_bindir}/Vita3K
%fdupes -s %{buildroot}

%check
#ctest

%post
%desktop_database_post
%icon_theme_cache_post

%postun
%desktop_database_postun
%icon_theme_cache_postun

%files
%doc README.md
%license COPYING.txt
%{_bindir}/*
%{_datadir}/%{name}
%{_datadir}/applications/%{name}.desktop
#{_mandir}/man?/*
#{_datadir}/mime/packages/*.xml
%{_datadir}/pixmaps/%{name}.*
#{_datadir}/icons/hicolor/scalable/apps/%{name}.svg

%changelog
openSUSE Build Service is sponsored by