File dolphin-emu.spec of Package dolphin-emu

#
# spec file for package dolphin-emu
#
# Copyright (c) 2021 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
# viable only on x86_64… when clang doesn't mess it up and produce segfaulting binaries… or is it ?
%ifarch %ix86 %arm
%global use_lto 0
%else
# Qt LTO bug prevents that for now
%global use_lto 1
%endif
%define use_qt6 0

%define _realname dolphin
%define package_name dolphin-emu

Name:           %{package_name}
Version:        master
Release:        0
Summary:        Dolphin, a GameCube and Wii Emulator
License:        GPL-2.0-or-later
Group:          System/Emulators/Other
URL:            https://dolphin-emu.org/

Source:         %{name}-%{version}.tar.xz
Patch:          dolphin-emu_VulkanMemoryAllocator-stdio-fix.patch

BuildRequires:  hicolor-icon-theme
BuildRequires:  update-desktop-files
BuildRequires:  git
BuildRequires:  cmake
BuildRequires:  ninja
BuildRequires:  fdupes
BuildRequires:  enet-devel

%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:  libjack-devel
BuildRequires:  glew-devel
BuildRequires:  libSDL2-devel
BuildRequires:  imgui-devel
BuildRequires:  lzlib-devel
BuildRequires:  glslang-devel
BuildRequires:  spirv-tools-devel
BuildRequires:  shaderc-devel
BuildRequires:  libSM-devel
BuildRequires:  libao-devel
BuildRequires:  libbz2-devel
BuildRequires:  libhidapi-devel
BuildRequires:  libminiupnpc-devel
BuildRequires:  lzo-devel
BuildRequires:  mbedtls-devel
BuildRequires:  pkgconf-pkg-config
BuildRequires:  portaudio-devel
BuildRequires:  sed
BuildRequires:  sfml2-devel
BuildRequires:  xxhash-devel
BuildRequires:  xz-devel

BuildRequires:  pkgconfig
BuildRequires:  pkgconfig(gtk+-2.0)
BuildRequires:  pkgconfig(egl)
BuildRequires:  pkgconfig(libavfilter)
BuildRequires:  pkgconfig(libswresample)
BuildRequires:  pkgconfig(libswscale)
BuildRequires:  pkgconfig(libzip)
BuildRequires:  pkgconfig(lzo2)
BuildRequires:  pkgconfig(hidapi-hidraw)
BuildRequires:  pkgconfig(xrandr)
BuildRequires:  pkgconfig(xxf86vm)
BuildRequires:  pkgconfig(minizip)
BuildRequires:  pkgconfig(openal) 
BuildRequires:  pkgconfig(pugixml)
BuildRequires:  pkgconfig(soundtouch)
BuildRequires:  pkgconfig(zlib)
BuildRequires:  pkgconfig(alsa)
BuildRequires:  pkgconfig(ao)
BuildRequires:  pkgconfig(jack)
BuildRequires:  pkgconfig(bluez)
BuildRequires:  pkgconfig(fmt) >= 6.0
BuildRequires:  pkgconfig(gl)
BuildRequires:  pkgconfig(libcurl)
BuildRequires:  pkgconfig(libevdev)
BuildRequires:  pkgconfig(libpng)
BuildRequires:  pkgconfig(libzstd)
BuildRequires:  pkgconfig(libpulse)
BuildRequires:  pkgconfig(libsystemd)
BuildRequires:  pkgconfig(libudev)
BuildRequires:  pkgconfig(libusb-1.0)
BuildRequires:  pkgconfig(libavcodec)
BuildRequires:  pkgconfig(libavdevice)
BuildRequires:  pkgconfig(libavformat)
BuildRequires:  pkgconfig(libavutil)
BuildRequires:  pkgconfig(xi)
BuildRequires:  pkgconfig(vulkan)

%if 0%{?use_qt6}
BuildRequires:  qt6-gui-private-devel
BuildRequires:  cmake(Qt6LinguistTools)
BuildRequires:  pkgconfig(Qt6Concurrent)
BuildRequires:  pkgconfig(Qt6Core)
BuildRequires:  pkgconfig(Qt6DBus)
BuildRequires:  pkgconfig(Qt6Gui)
BuildRequires:  pkgconfig(Qt6Multimedia)
BuildRequires:  pkgconfig(Qt6MultimediaWidgets)
BuildRequires:  pkgconfig(Qt6Network)
BuildRequires:  pkgconfig(Qt6OpenGL)
BuildRequires:  pkgconfig(Qt6Qml)
BuildRequires:  pkgconfig(Qt6Svg)
BuildRequires:  pkgconfig(Qt6WebEngineCore)
BuildRequires:  pkgconfig(Qt6WebEngineWidgets)
BuildRequires:  pkgconfig(Qt6Widgets)
%else
BuildRequires:  libQt5PlatformSupport-private-headers-devel
BuildRequires:  libQt5Gui-private-headers-devel >= 5.9
BuildRequires:  libqt5-qtbase-private-headers-devel
BuildRequires:  cmake(Qt5LinguistTools)
BuildRequires:  pkgconfig(Qt5Concurrent)
BuildRequires:  pkgconfig(Qt5Core)
BuildRequires:  pkgconfig(Qt5DBus)
BuildRequires:  pkgconfig(Qt5Gui)
BuildRequires:  pkgconfig(Qt5Multimedia)
BuildRequires:  pkgconfig(Qt5MultimediaWidgets)
BuildRequires:  pkgconfig(Qt5Network)
BuildRequires:  pkgconfig(Qt5OpenGL)
BuildRequires:  pkgconfig(Qt5Qml)
BuildRequires:  pkgconfig(Qt5Svg)
BuildRequires:  pkgconfig(Qt5WebEngineCore)
BuildRequires:  pkgconfig(Qt5WebEngineWidgets)
BuildRequires:  pkgconfig(Qt5Widgets)
%endif

ExclusiveArch:  x86_64 aarch64
Provides:       dolphin-qt = %{version}
Obsoletes:      dolphin-qt < %{version}

%description
Dolphin is an emulator for two Nintendo video game consoles, GameCube and the Wii.
It allows PC gamers to enjoy games for these two consoles in full HD with several
enhancements such as compatibility with all PC controllers, turbo speed,
networked multiplayer, and more.
Most games run perfectly or with minor bugs.

%lang_package

%prep
%autosetup -p1 -n %{name}-%{version}
BUILDDATE=$(LC_ALL=C date -u -r %{_sourcedir}/%{name}.changes '+%%b %%e %%Y')
BUILDTIME=$(LC_ALL=C date -u -r %{_sourcedir}/%{name}.changes '+%R')
rev=`echo %{version}|cut -f3 -d"."`

%build
# this macro needs 'BuildRequires: memory-constraints'
#limit_build -m 3072
ulimit -Sn 4000
UCFLAGS="-fPIC -march=x86-64 -mtune=generic -mssse3 -msse4 -msse4.1 -msse4.2 -mavx -maes -mpclmul -O3 -fno-strict-aliasing"
export ULDFLAGS="-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 -fbracket-depth=1024 -fconstexpr-depth=1024 -relocatable-pch -faligned-allocation"
#export UCFLAGS="${UCFLAGS} -D_GNU_SOURCE -fexceptions"
export UCXXFLAGS="${UCFLAGS} -fpermissive"
#export UCXXFLAGS="${UCFLAGS} -fcxx-exceptions"
export HOST="$(${CC} -print-target-triple)"
%if 0%{?use_lto}
%if 0%{?use_lld}
%global _lto_cflags -flto=thin -Wl,--lto-O3 -Wl,--thinlto-jobs=3
%global _lto_ldlags -flto=thin -Wl,--lto-O3 -Wl,--thinlto-jobs=3
%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 -fvect-cost-model=cheap -fsimd-cost-model=cheap -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=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}"

# LTO & _FORTIFY_SOURCE may break build: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=751812
cmake . \
	-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_SKIP_INSTALL_RPATH=ON \
	#-DUSE_PULSE=ON 
    #-DUSE_JACK=ON \
	-DCMAKE_INSTALL_PREFIX=%{_prefix} \
	-DCMAKE_VERBOSE_MAKEFILE=ON \
	-DCMAKE_LINKER=${LD} \
	-DDOLPHIN_WC_REVISION="$rev" \
	-DDOLPHIN_WC_DESCRIBE="%{version}" \
	-DDOLPHIN_WC_BRANCH="master" \
    -DDOLPHIN_WC_IS_STABLE=0 \
	#-DUSE_EGL=ON 
    -DENABLE_LTO=OFF
    -DDISABLE_WX=ON 
    -DENABLE_QT=ON
    -DDISTRIBUTOR=openSUSE \
    -DCMAKE_BUILD_TYPE=RelWithDebInfo \
    -DUSE_SHARED_ENET=ON \
    -DXXHASH_FOUND=TRUE \
make %{?_smp_mflags}

%install
%cmake_install
#install -m 755 Binaries/dolphin-emu-qt %{?buildroot}%{_bindir}

mkdir -p %{buildroot}%{_udevrulesdir}
install -m 0644 Data/51-usb-device.rules %{buildroot}%{_udevrulesdir}/51-dolphin-usb-device.rules

%fdupes -s %{buildroot}
%find_lang %{name}
# cleaning garbage
rm -rfv %{buildroot}%{_includedir}/mbedtls \
 %{buildroot}%{_libexecdir}/libmbed* \
 %{buildroot}%{_libdir}/libdiscord-* \
 %{buildroot}%{_includedir}/discord_*

# Still waiting for the day Game;Emulator; is supported
%suse_update_desktop_file -c %{name} Dolphin 'Gamecube / Wii / Triforce Emulator' %{name} %{name} 'System;Emulator;'

%post
%desktop_database_post
%icon_theme_cache_post

%postun
%desktop_database_postun
%icon_theme_cache_postun

%files lang -f %{name}.lang

%files
%doc Readme.md
%defattr(0644,root,root,0755)
%license COPYING
%attr(0755,root,root) %{_bindir}/%{name}
%attr(0755,root,root) %{_bindir}/%{name}-nogui
%attr(0755,root,root) %{_bindir}/dolphin-tool

%{_mandir}/man6/%{name}.*
%{_mandir}/man6/%{name}-nogui.*
%{_bindir}/%{_realname}*
%{_datadir}/%{name}
%{_datadir}/icons/hicolor/*/apps/%{name}.{png,svg}
%{_datadir}/applications/%{name}.desktop
%{_udevrulesdir}/51-dolphin-usb-device.rules

%changelog

openSUSE Build Service is sponsored by