File xemu.spec of Package xemu

%global use_clang 1
%global use_lld 1
%ifarch %ix86 %arm
%global use_lto 0
%else
%global use_lto 1
%endif

%define __builder ninja
Name:    xemu
Version: 0.7.127+0~git20240615.b4ce2b58d0
Release: 0
Summary: Xbox EMUlator
License: GPL-2.0-or-later
Group:   System/Emulators/Other
URL:     https://xemu.app/
Source0: %{name}-%{version}.tar.xz
Patch:   xemu_uring-by-default.patch
BuildRequires: cmake
BuildRequires: ninja
BuildRequires: fdupes
BuildRequires: meson
BuildRequires: hicolor-icon-theme
BuildRequires: update-desktop-files
%if 0%{?use_clang}
BuildRequires: clang-devel
BuildRequires: llvm-gold
#BuildRequires:     npth-devel
%if 0%{?use_lld}
BuildRequires: lld
%else
BuildRequires: binutils-gold
%endif
%else
BuildRequires: binutils-gold
BuildRequires: gcc-PIE
BuildRequires: gcc-c++
%endif
BuildRequires: libaio-devel
BuildRequires: lzfse-devel
BuildRequires: glibc-devel
BuildRequires: gettext-tools
BuildRequires: kernel-headers
BuildRequires: python3-PyYAML
BuildRequires: renderdoc-devel
BuildRequires: pkgconfig
BuildRequires: pkgconfig(libgcrypt)
#BuildRequires: pkgconfig(nettle)
#BuildRequires: pkgconfig(libbpf)
BuildRequires: pkgconfig(jemalloc)
#BuildRequires: pkgconfig(libtcmalloc)
BuildRequires: pkgconfig(capstone)
BuildRequires: pkgconfig(glu)
BuildRequires: pkgconfig(gio-2.0)
BuildRequires: pkgconfig(gnutls)
BuildRequires: pkgconfig(gtk+-3.0)
BuildRequires: pkgconfig(epoxy)
BuildRequires: pkgconfig(jack)
BuildRequires: pkgconfig(lzo2)
BuildRequires: pkgconfig(libattr)
BuildRequires: pkgconfig(libcap-ng)
BuildRequires: pkgconfig(libcurl)
BuildRequires: pkgconfig(libdrm)
BuildRequires: pkgconfig(libkeyutils)
BuildRequires: pkgconfig(libpcap)
BuildRequires: pkgconfig(libpulse)
BuildRequires: pkgconfig(libpmem)
BuildRequires: pkgconfig(libseccomp)
BuildRequires: pkgconfig(libtasn1)
BuildRequires: pkgconfig(libudev)
BuildRequires: pkgconfig(liburing)
BuildRequires: pkgconfig(libusb-1.0)
BuildRequires: pkgconfig(libusbredirhost)
BuildRequires: pkgconfig(libxml-2.0)
BuildRequires: pkgconfig(libzip)
BuildRequires: pkgconfig(libzstd)
BuildRequires: pkgconfig(ncurses)
BuildRequires: pkgconfig(openssl)
BuildRequires: pkgconfig(pam)
BuildRequires: pkgconfig(pixman-1)
BuildRequires: pkgconfig(samplerate)
BuildRequires: pkgconfig(sdl2)
BuildRequires: pkgconfig(SDL2_image)
BuildRequires: pkgconfig(slirp)
BuildRequires: pkgconfig(snappy)
BuildRequires: pkgconfig(xkbcommon)
BuildRequires: pkgconfig(virglrenderer)
#BuildRequires: pkgconfig(spice-client-gtk-3.0)
#BuildRequires: pkgconfig(spice-protocol)
#BuildRequires: pkgconfig(spice-server)
BuildRequires: qemu-x86
BuildRequires: qemu-microvm
# does it even need any of it?
#Requires:      qemu-x86
#Requires:      qemu-microvm
#Requires:      qemu-hw-display-virtio-vga
#Requires:      qemu-hw-display-virtio-gpu
#Requires:      qemu-hw-display-qxl

%description
Xbox Emulator based on QEMU

%prep
%autosetup -p1

%build
# this macro needs 'BuildRequires: memory-constraints'
#limit_build -m 2000
ulimit -Sn 4000
# see build.sh from sources
export UCFLAGS="${UCFLAGS} -w -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,--gc-sections -Wl,--sort-common -Wl,-O1"

%if 0%{?use_clang}
export CC=clang
export CXX=clang++
export CPP='clang -E' AR=llvm-ar AS=llvm-as NM=llvm-nm OBJCOPY=llvm-objcopy OBJDUMP=llvm-objdump OBJSIZE=llvm-size STRIP=llvm-strip RANLIB=llvm-ranlib
export UCFLAGS="${UCFLAGS} -v"
%ifarch x86_64
#export UCFLAGS="${UCFLAGS} -fglobal-isel"
%endif
export UCFLAGS="${UCFLAGS} -fbracket-depth=1024 -fconstexpr-depth=1024"
#export UCFLAGS="${UCFLAGS} -fexceptions -faligned-allocation -D_GNU_SOURCE"
export UCXXFLAGS="${UCFLAGS}"
#export UCXXFLAGS="${UCXXFLAGS} -fpermissive -fcxx-exceptions"
%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"
export LD=ld.gold
alias ld=gold
%endif
export HOST="$(${CC} -print-target-triple)"
%else
export CC=gcc
export CXX=g++
export UCFLAGS="${UCFLAGS} -ftree-parallelize-loops=8 -ftree-vectorize -fpredictive-commoning"
export UCXXFLAGS="${UCFLAGS}"
#export UCXXFLAGS="${UCXXFLAGS} -fpermissive"
export ULDFLAGS="${ULDFLAGS} -fuse-ld=gold -Wl,--icf=safe"
export LD=ld.gold
alias ld=gold
export HOST="%{_target_platform}"
%endif

%if !0%{?use_lto}
%global _lto_cflags %{nil}
%global _lto_ldlags %{nil}
%else
%if 0%{?use_clang}
%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 -fuse-linker-plugin %{_lto_cflags} -ffat-lto-objects -flto-odr-type-merging
%global _lto_ldlags -fuse-linker-plugin -flto=%{?jobs:%{jobs}}
%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}"

# malloc=system+malloc-trim/tcmalloc/jemalloc
# enable-gcrypt/nettle
# gtk doesn't seem to be used, so these may be useless: --enable-gtk --enable-gio --enable-gettext
# --enable-virglrenderer may allow using '-vga virtio'
# fails with `undefined symbol` likely due to lack of proper linking definitions but it should enable '-vga qxl`'
#    --enable-spice \
# this should allow using '-drive aio=io_uring' as alternative to legacy aio=threads (simple default) / native (posix variant enabled by enable-linux-aio)
# may cause segfault with `../block/aio_task.c:64: void aio_task_pool_wait_one(AioTaskPool *): Assertion `qemu_coroutine_self() == pool->main_co' failed.`
# is assertion triggered only with clang ?
#    --enable-linux-io-uring \
# fails with `../util/fdmon-io_uring.c:182:36: error: incompatible pointer to integer conversion passing 'AioHandler *'`
#    --enable-linux-aio \
# fails with `undefined symbol` and `../ebpf/ebpf_rss.c:52:5: error: call to undeclared function 'bpf_program__set_socket_filter'`
#    --enable-bpf \
# could --enable-seccomp security feature cause emulation failures ?
./configure \
    --prefix="%{_prefix}" \
    --extra-cflags="-DXBOX=1 -Wno-error=redundant-decls -Wno-error=int-conversion -Wno-error=implicit-function-declaration ${CFLAGS}" \
    --extra-ldflags="${LDFLAGS}" \
    --target-list=i386-softmmu \
%if 0%{?use_lto}
    --enable-lto \
%endif
    --audio-drv-list=pa,jack \
    --enable-pa \
    --enable-jack \
    --enable-sdl \
    --enable-sdl-image \
    --enable-multiprocess \
    --enable-virglrenderer \
    --enable-opengl \
    --enable-libudev \
    --enable-libusb \
    --enable-usb-redir \
    --enable-bzip2 \
    --enable-lzfse \
    --enable-lzo \
    --enable-snappy \
    --enable-zstd \
    --enable-cap-ng \
    --enable-xkbcommon \
    --enable-renderdoc \
    --enable-libpmem \
    --enable-jemalloc \
    --enable-pie \
    --enable-fortify-source \
    --enable-stack-protector \
%if 0%{?use_clang}
    --enable-safe-stack \
%endif
    --enable-membarrier \
    --enable-curses \
    --enable-curl \
    --enable-iconv \
    --enable-attr \
    --enable-linux-aio \
    --enable-linux-io-uring \
    --enable-auth-pam \
    --enable-kvm \
    --enable-keyring \
    --enable-gcrypt \
    --enable-gnutls \
    --disable-strip \
    --disable-werror
%make_build
# try meson-based build later ? might be not supported by xemu's forked codebase
#meson
#meson_build

%install
#meson_install
# based on https://build.opensuse.org/package/show/home%3AAzkali%3AApps/xemu
install -m 755 -D build/qemu-system-i386 %{buildroot}%{_bindir}/xemu
install -m 644 -D ui/icons/xemu.svg %{buildroot}%{_datadir}/icons/hicolor/scalable/apps/xemu.svg
install -m 644 -D ui/icons/xemu_128x128.png %{buildroot}%{_datadir}/icons/hicolor/128x128/apps/xemu.png #128
install -m 644 -D ui/icons/xemu_16x16.png %{buildroot}%{_datadir}/icons/hicolor/16x16/apps/xemu.png     #16
install -m 644 -D ui/icons/xemu_24x24.png %{buildroot}%{_datadir}/icons/hicolor/24x24/apps/xemu.png     #24
install -m 644 -D ui/icons/xemu_256x256.png %{buildroot}%{_datadir}/icons/hicolor/256x256/apps/xemu.png #256
install -m 644 -D ui/icons/xemu_32x32.png %{buildroot}%{_datadir}/icons/hicolor/32x32/apps/xemu.png     #32
install -m 644 -D ui/icons/xemu_48x48.png %{buildroot}%{_datadir}/icons/hicolor/48x48/apps/xemu.png     #48
install -m 644 -D ui/icons/xemu_512x512.png %{buildroot}%{_datadir}/icons/hicolor/512x512/apps/xemu.png #512
install -m 644 -D ui/icons/xemu_64x64.png %{buildroot}%{_datadir}/icons/hicolor/64x64/apps/xemu.png     #64
install -m 644 -D ui/xemu.desktop %{buildroot}%{_datadir}/applications/xemu.desktop
%fdupes -s %{buildroot}
%suse_update_desktop_file %{name}

%post
%desktop_database_post
%icon_theme_cache_post

%postun
%desktop_database_postun
%icon_theme_cache_postun

%files
%defattr(-,root,root)
%license COPYING
%caps(cap_net_raw=ep) %{_bindir}/%{name}
%{_datadir}/applications/*.desktop
%{_datadir}/icons/hicolor/*/apps/*.*

%changelog
openSUSE Build Service is sponsored by