File cemu.spec of Package cemu
#
# spec file for package cemu
#
# 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
%global use_lld 1
%global use_lto 1
%define gtk3_ui 1
%define use_qt6 0
%define __builder ninja
Name: cemu
Version: 2.5+9~git20250108.f61539a2
Release: 0
Summary: Nintendo 3DS emulator
License: MPL-2.0
Group: System/Emulators/Other
URL: https://cemu.info/
Source: %{name}-%{version}.tar.xz
Patch2: cemu_cstdarg.patch
# https://github.com/fmtlib/fmt/commit/fbf3b943cc9a515d76956d8e766455201f11fd7d
#Patch3: cemu_fmt11.patch
Patch3: cemu_fmt11-part2.patch
BuildRequires: cmake
BuildRequires: extra-cmake-modules
%if "%{__builder}" == "ninja"
BuildRequires: ninja
%endif
%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: chrpath
BuildRequires: fdupes
BuildRequires: update-desktop-files
BuildRequires: curl
BuildRequires: nasm
BuildRequires: zip
BuildRequires: unzip
BuildRequires: hicolor-icon-theme
BuildRequires: libboost_filesystem-devel
BuildRequires: libboost_program_options-devel
BuildRequires: libboost_nowide-devel
BuildRequires: pkgconfig
BuildRequires: pkgconfig(bluez)
BuildRequires: pkgconfig(alsa)
BuildRequires: pkgconfig(jack)
BuildRequires: pkgconfig(fmt)
BuildRequires: pkgconfig(glm)
BuildRequires: pkgconfig(openssl)
BuildRequires: pkgconfig(hidapi-hidraw)
BuildRequires: pkgconfig(libavdevice)
BuildRequires: pkgconfig(libavfilter)
BuildRequires: pkgconfig(libavformat)
BuildRequires: pkgconfig(libavutil)
BuildRequires: pkgconfig(libcurl)
BuildRequires: pkgconfig(liblz4)
BuildRequires: pkgconfig(liblzma)
BuildRequires: pkgconfig(libpng)
BuildRequires: pkgconfig(libpostproc)
BuildRequires: pkgconfig(libpulse)
BuildRequires: pkgconfig(libswresample)
BuildRequires: pkgconfig(libswscale)
BuildRequires: pkgconfig(libzip)
BuildRequires: pkgconfig(libzstd)
BuildRequires: pkgconfig(zlib)
BuildRequires: pkgconfig(pugixml)
BuildRequires: pkgconfig(RapidJSON)
BuildRequires: pkgconfig(sdl2)
BuildRequires: pkgconfig(speexdsp)
BuildRequires: pkgconfig(vulkan)
BuildRequires: pkgconfig(wayland-client)
BuildRequires: pkgconfig(wayland-protocols)
BuildRequires: pkgconfig(wayland-scanner)
%if 0%{?suse_version} < 1550
BuildRequires: zarchive-devel
%else
BuildRequires: pkgconfig(zarchive)
%endif
BuildRequires: spirv-tools-devel
BuildRequires: glslang-devel
BuildRequires: glslang-nonstd-devel
BuildRequires: libzip-tools
BuildRequires: libzstd-devel-static
%if 0%{?gtk3_ui}
BuildRequires: wxGTK3-devel
BuildRequires: wxWidgets-any-devel
BuildRequires: pkgconfig(gtk+-3.0)
%else
BuildRequires: wxQt-devel
BuildRequires: wxWidgets-any-devel
%if 0%{?use_qt6}
BuildRequires: qt6-gui-private-devel
BuildRequires: cmake(Qt5LinguistTools)
BuildRequires: pkgconfig(Qt6Concurrent)
BuildRequires: pkgconfig(Qt6Core)
BuildRequires: pkgconfig(Qt6DBus)
BuildRequires: pkgconfig(Qt6Network)
BuildRequires: pkgconfig(Qt6Multimedia)
BuildRequires: pkgconfig(Qt6MultimediaWidgets)
BuildRequires: pkgconfig(Qt6OpenGL)
BuildRequires: pkgconfig(Qt6Qml)
BuildRequires: pkgconfig(Qt6Widgets)
BuildRequires: pkgconfig(Qt6Svg)
%else
BuildRequires: cmake(Qt5LinguistTools)
BuildRequires: pkgconfig(Qt5Concurrent)
BuildRequires: pkgconfig(Qt5Core)
BuildRequires: pkgconfig(Qt5DBus)
BuildRequires: pkgconfig(Qt5Network)
BuildRequires: pkgconfig(Qt5Multimedia)
BuildRequires: pkgconfig(Qt5MultimediaWidgets)
BuildRequires: pkgconfig(Qt5OpenGL)
BuildRequires: pkgconfig(Qt5Qml)
BuildRequires: pkgconfig(Qt5Widgets)
BuildRequires: pkgconfig(Qt5Svg)
%endif
%endif
ExclusiveArch: x86_64
%description
This is Cemu, a Wii U emulator that is able to run most Wii U games and homebrew in a playable state.
It's written in C/C++ and is being actively developed with new features and fixes to increase compatibility, convenience and usability.
%{lang_package}
%prep
%autosetup -p1
# https://aur.archlinux.org/cgit/aur.git/tree/PKGBUILD?h=cemu
#sed -i '/FMT_HEADER_ONLY/d' src/Common/precompiled.h
%build
# this macro needs 'BuildRequires: memory-constraints'
#limit_build -m 3072
ulimit -Sn 4000
UCFLAGS="%{optflags} -pthread -fopenmp -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="-pthread -fopenmp -lgomp -fPIC -Wl,--gc-sections -Wl,-O1 -Wl,--icf=safe"
%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"
#export UCFLAGS="${UCFLAGS} -fbracket-depth=1024 -fconstexpr-depth=1024"
%ifarch x86_64
#export UCFLAGS="${UCFLAGS} -fglobal-isel"
%endif
#export UCFLAGS="${UCFLAGS} -fexceptions -D_GNU_SOURCE"
export UCXXFLAGS="${UCFLAGS} -fpermissive"
#export UCXXFLAGS="${UCXXFLAGS} -fcxx-exceptions"
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=4 -ftree-vectorize -fpredictive-commoning"
export UCXXFLAGS="${UCFLAGS} -fpermissive"
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
%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}"
# -DENABLE_VCPKG=OFF \
export VCPKG_FORCE_SYSTEM_BINARIES=1
%cmake \
%if "%{__builder}" == "ninja"
-DCMAKE_MAKE_PROGRAM="ninja" \
%endif
-DBUILD_SHARED_LIBS=OFF \
-DBUILD_STATIC_LIBS=ON \
-DCMAKE_SKIP_RPATH=OFF \
-DCMAKE_INSTALL_RPATH="" \
-DCMAKE_BUILD_WITH_INSTALL_RPATH=OFF \
-DCMAKE_SKIP_INSTALL_RPATH=ON \
-DCMAKE_BUILD_TYPE=Release \
-DCMAKE_INSTALL_PREFIX="%{_prefix}" \
-DCMAKE_C_STANDARD=17 \
-DCMAKE_C_EXTENSIONS=YES \
-DCMAKE_C_STANDARD_REQUIRED=YES \
-DCMAKE_CXX_STANDARD=17 \
-DCMAKE_CXX_EXTENSIONS=YES \
-DCMAKE_CXX_STANDARD_REQUIRED=YES \
-DCMAKE_C_COMPILER="${CC}" \
-DCMAKE_CXX_COMPILER="${CXX}" \
-DCMAKE_LINKER="${LD}" \
-DCMAKE_C_FLAGS="${CFLAGS}" \
-DCMAKE_CXX_FLAGS="${CXXFLAGS}" \
-DCMAKE_EXE_LINKER_FLAGS="${LDFLAGS}" \
%if !0%{?use_lto}
-DCMAKE_INTERPROCEDURAL_OPTIMIZATION=OFF \
-DCMAKE_INTERPROCEDURAL_OPTIMIZATION_RELEASE=OFF \
-DCMAKE_INTERPROCEDURAL_OPTIMIZATION_RELWITHDEBINFO=OFF \
%endif
-DENABLE_VCPKG=OFF \
-DVCPKG_VERBOSE=ON \
-DVCPKG_USE_SYSTEM_BINARIES=ON \
-DVCPKG_PREFER_SYSTEM_LIBS=ON \
-DPORTABLE=OFF \
-DENABLE_DISCORD_RPC=OFF \
-DENABLE_CUBEB=ON \
%{?nil} || cat vcpkg-bootstrap.log
%cmake_build
%install
# it has no installation… as customary
#cmake_install
mkdir -p %{buildroot}%{_bindir}
chmod -v +x bin/Cemu_release
mv -v bin/Cemu_release %{buildroot}%{_bindir}/cemu
mkdir -p %{buildroot}/%{_datadir}/pixmaps
mv -v src/resource/logo_icon.png %{buildroot}/%{_datadir}/pixmaps/%{name}.png
mkdir -p %{buildroot}/%{_datadir}/cemu/resources
mv -v bin/resources/shared* %{buildroot}/%{_datadir}/cemu/resources/
mv -v bin/resources %{buildroot}/%{_datadir}/locale
for lang in $(ls %{buildroot}%{_datadir}/locale); do
mkdir -p %{buildroot}%{_datadir}/locale/${lang}/LC_MESSAGES
mv -v %{buildroot}%{_datadir}/locale/${lang}/*.mo %{buildroot}%{_datadir}/locale/${lang}/LC_MESSAGES/
done
mv -v bin/* %{buildroot}/%{_datadir}/cemu/
%suse_update_desktop_file -c %{name} Cemu 'Wii U Emulator' cemu %{name} System Emulator
chmod -x README.md
chrpath --delete %{buildroot}%{_bindir}/*
%fdupes -s %{buildroot}
%find_lang %{name}
%check
#ctest
%files lang -f %{name}.lang
# WHY is this one missed by find_lang?!
%{_datadir}/locale/ar/LC_MESSAGES/%{name}.mo
%files
%doc README.md
%license LICENSE.txt
%{_bindir}/*
%{_datadir}/cemu
%{_datadir}/applications/%{name}.desktop
#{_mandir}/man?/*
#{_datadir}/mime/packages/*.xml
%{_datadir}/pixmaps/%{name}.*
#{_datadir}/icons/hicolor/scalable/apps/%{name}.svg
%changelog