# Copyright 2026 Gentoo Authors
# Distributed under the terms of the GNU General Public License v2

EAPI=8

PYTHON_COMPAT=( python3_{10..15} )
PYTHON_REQ_USE="ncurses,readline"

RUST_MIN_VER=1.96
DSP_PV=0.1.3
CRATES="
	aho-corasick@1.1.4
	allocator-api2@0.2.21
	anstream@1.0.0
	anstyle-parse@1.0.0
	anstyle-query@1.1.5
	anstyle-wincon@3.0.11
	anstyle@1.0.14
	anyhow@1.0.102
	ar_archive_writer@0.5.1
	arbitrary@1.4.2
	bitflags@1.3.2
	bitflags@2.11.1
	bumpalo@3.20.2
	cbindgen@0.29.3
	cc@1.2.63
	cfg-if@1.0.4
	chumsky@0.13.0
	clap@4.6.1
	clap_builder@4.6.0
	clap_derive@4.6.1
	clap_lex@1.1.0
	colorchoice@1.0.5
	cranelift-assembler-x64-meta@0.132.0
	cranelift-assembler-x64@0.132.0
	cranelift-bforest@0.132.0
	cranelift-bitset@0.132.0
	cranelift-codegen-meta@0.132.0
	cranelift-codegen-shared@0.132.0
	cranelift-codegen@0.132.0
	cranelift-control@0.132.0
	cranelift-entity@0.132.0
	cranelift-frontend@0.132.0
	cranelift-isle@0.132.0
	cranelift-jit@0.132.0
	cranelift-module@0.132.0
	cranelift-native@0.132.0
	cranelift-srcgen@0.132.0
	crossbeam-deque@0.8.6
	crossbeam-epoch@0.9.18
	crossbeam-utils@0.8.21
	either@1.15.0
	equivalent@1.0.2
	errno@0.3.14
	fastrand@2.4.1
	find-msvc-tools@0.1.9
	fnv@1.0.7
	foldhash@0.1.5
	foldhash@0.2.0
	getrandom@0.4.2
	gimli@0.33.0
	hashbrown@0.15.5
	hashbrown@0.16.1
	hashbrown@0.17.0
	heck@0.5.0
	id-arena@2.3.0
	indexmap@2.14.0
	is_terminal_polyfill@1.70.2
	itoa@1.0.18
	leb128fmt@0.1.0
	libc@0.2.185
	libm@0.2.16
	linux-raw-sys@0.12.1
	log@0.4.29
	logos-codegen@0.16.1
	logos-derive@0.16.1
	logos@0.16.1
	mach2@0.4.3
	memchr@2.8.0
	memmap2@0.2.3
	object@0.37.3
	once_cell@1.21.4
	once_cell_polyfill@1.70.2
	owo-colors@4.3.0
	prettyplease@0.2.37
	proc-macro2@1.0.106
	psm@0.1.31
	quote@1.0.45
	r-efi@6.0.0
	rayon-core@1.13.0
	rayon@1.12.0
	regalloc2@0.15.1
	regex-automata@0.4.14
	regex-syntax@0.8.10
	region@3.0.2
	rustc-hash@2.1.2
	rustix@1.1.4
	semver@1.0.28
	serde@1.0.228
	serde_core@1.0.228
	serde_derive@1.0.228
	serde_json@1.0.149
	serde_spanned@1.1.1
	shlex@2.0.1
	smallvec@1.15.1
	stable_deref_trait@1.2.1
	stacker@0.1.24
	strsim@0.11.1
	syn@2.0.117
	target-lexicon@0.13.5
	tempfile@3.27.0
	toml@0.9.12+spec-1.1.0
	toml_datetime@0.7.5+spec-1.1.0
	toml_parser@1.1.2+spec-1.1.0
	toml_writer@1.1.1+spec-1.1.0
	unicode-ident@1.0.24
	unicode-segmentation@1.13.2
	unicode-xid@0.2.6
	utf8parse@0.2.2
	wasip2@1.0.3+wasi-0.2.9
	wasip3@0.4.0+wasi-0.3.0-rc-2026-01-06
	wasm-encoder@0.244.0
	wasm-metadata@0.244.0
	wasmparser@0.244.0
	wasmtime-internal-core@45.0.0
	wasmtime-internal-jit-icache-coherence@45.0.0
	windows-link@0.2.1
	windows-sys@0.52.0
	windows-sys@0.61.2
	windows-targets@0.52.6
	windows_aarch64_gnullvm@0.52.6
	windows_aarch64_msvc@0.52.6
	windows_i686_gnu@0.52.6
	windows_i686_gnullvm@0.52.6
	windows_i686_msvc@0.52.6
	windows_x86_64_gnu@0.52.6
	windows_x86_64_gnullvm@0.52.6
	windows_x86_64_msvc@0.52.6
	winnow@0.7.15
	winnow@1.0.2
	wit-bindgen-core@0.51.0
	wit-bindgen-rust-macro@0.51.0
	wit-bindgen-rust@0.51.0
	wit-bindgen@0.51.0
	wit-bindgen@0.57.1
	wit-component@0.244.0
	wit-parser@0.244.0
	zmij@1.0.21
"

inherit cargo fcaps flag-o-matic pax-utils python-r1 toolchain-funcs xdg-utils

DESCRIPTION="Original Xbox emulator"
HOMEPAGE="https://xemu.app/ https://github.com/xemu-project/xemu"
BERKELEY_SOFTFLOAT_SHA="b64af41c3276f97f0e181920400ee056b9c88037"
BERKELEY_TESTFLOAT_SHA="e7af9751d9f9fd3b47911f51a5cfd08af256a9ab"
GENCONFIG_SHA="42f85f9a2457e61d7e32542c07723565a284fcd6"
GLSLANG_SHA="16.2.0"
IMGUI_SHA="b911105fca3ca1b025706dd168e5798070f143a1"
IMPLOT_SHA="8553562dbb2025fd520f4bed57b094767b96c670"
KEYCODEMAPDB_SHA="f5772a62ec52591ff6870b7e8ef32482371f22c6"
NV2A_VSH_CPU_SHA="561fe80da57a881f89000256b459440c0178a7ce"
SPIRV_REFLECT_SHA="vulkan-sdk-1.4.335.0"
TOMLPLUSPLUS_SHA="30172438cee64926dc41fdd9c11fb3ba5b2ba9de"
VMA_SHA="3.3.0"
VOLK_SHA="1.4.304"
SRC_URI="https://github.com/xemu-project/xemu/archive/v${PV}.tar.gz -> ${P}.tar.gz
	https://gitlab.com/qemu-project/keycodemapdb/-/archive/${KEYCODEMAPDB_SHA}/keycodemapdb-${KEYCODEMAPDB_SHA}.tar.bz2 -> ${PN}-keycodemapdb-${KEYCODEMAPDB_SHA:0:7}.tar.bz2
	https://github.com/abaire/nv2a_vsh_cpu/archive/${NV2A_VSH_CPU_SHA}.tar.gz -> ${PN}-nv2a_vsh_cpu-${NV2A_VSH_CPU_SHA:0:7}.tar.gz
	https://github.com/xemu-project/imgui/archive/${IMGUI_SHA}.tar.gz -> ${PN}-imgui-${IMGUI_SHA:0:7}.tar.gz
	https://github.com/epezent/implot/archive/${IMPLOT_SHA}.tar.gz -> ${PN}-implot-${IMPLOT_SHA:0:7}.tar.gz
	https://github.com/marzer/tomlplusplus/archive/${TOMLPLUSPLUS_SHA}.tar.gz -> ${PN}-tomlplusplus-${TOMLPLUSPLUS_SHA:0:7}.tar.gz
	https://github.com/mborgerson/genconfig/archive/${GENCONFIG_SHA}.tar.gz -> ${PN}-genconfig-${GENCONFIG_SHA:0:7}.tar.gz
	https://github.com/KhronosGroup/glslang/archive/refs/tags/${GLSLANG_SHA}.tar.gz -> ${PN}-glslang-${GLSLANG_SHA}.tar.gz
	https://github.com/zeux/volk/archive/refs/tags/${VOLK_SHA}.tar.gz -> ${PN}-volk-${VOLK_SHA}.tar.gz
	https://github.com/KhronosGroup/SPIRV-Reflect/archive/refs/tags/${SPIRV_REFLECT_SHA}.tar.gz -> ${PN}-spirv-reflect-${SPIRV_REFLECT_SHA}.tar.gz
	https://github.com/GPUOpen-LibrariesAndSDKs/VulkanMemoryAllocator/archive/refs/tags/v${VMA_SHA}.tar.gz -> ${PN}-vulkanmemoryallocator-${VMA_SHA}.tar.gz
	https://gitlab.com/qemu-project/berkeley-softfloat-3/-/archive/${BERKELEY_SOFTFLOAT_SHA}/berkeley-softfloat-3-${BERKELEY_SOFTFLOAT_SHA}.tar.bz2 -> ${PN}-berkeley-softfloat-3-${BERKELEY_SOFTFLOAT_SHA}.tar.bz2
	https://gitlab.com/qemu-project/berkeley-testfloat-3/-/archive/${BERKELEY_TESTFLOAT_SHA}/berkeley-testfloat-3-${BERKELEY_TESTFLOAT_SHA}.tar.bz2 -> ${PN}-berkeley-testfloat-3-${BERKELEY_TESTFLOAT_SHA}.tar.bz2"

SRC_URI+="
	https://github.com/mborgerson/dsp56300/archive/refs/tags/v${DSP_PV}.tar.gz -> dsp56300-${DSP_PV}.tar.gz
	${CARGO_CRATE_URIS}"

LICENSE="GPL-2 MIT"
SLOT="0"
KEYWORDS="~amd64 ~x86"
IUSE="xattr aio alsa debug io-uring jack malloc-trim membarrier pulseaudio test"
REQUIRED_USE="${PYTHON_REQUIRED_USE}"
RESTRICT="!test? ( test )"

DEPEND="dev-libs/glib
	dev-libs/openssl
	dev-cpp/tomlplusplus
	dev-libs/xxhash
	media-libs/libepoxy
	media-libs/libglvnd[X]
	media-libs/libsamplerate
	media-libs/libsdl2
	net-misc/curl
	net-libs/libpcap
	net-libs/libslirp
	sys-apps/dtc
	virtual/zlib
	x11-libs/gtk+:3
	x11-libs/pixman
	aio? ( dev-libs/libaio )
	alsa? ( media-libs/alsa-lib )
	pulseaudio? ( media-libs/libpulse )
	jack? ( virtual/jack )
	io-uring? ( sys-libs/liburing:= )
	xattr? ( sys-apps/attr )"
RDEPEND="${DEPEND} ${PYTHON_DEPS}"
# shellcheck disable=SC2016
BDEPEND="dev-lang/perl
	dev-build/meson
	dev-build/ninja
	sys-apps/texinfo
	virtual/pkgconfig
	$(python_gen_impl_dep)
	$(python_gen_any_dep 'dev-python/pyyaml[${PYTHON_USEDEP}]')
	test? (
		dev-libs/glib[utils]
		sys-devel/bc
	)"

PATCHES=(
	"${FILESDIR}/${PN}-0001-make-target-list-xemu-work-w.patch"
	"${FILESDIR}/${PN}-0002-make-running-tests-configura.patch"
	"${FILESDIR}/${PN}-0003-ui-qemu-xemu-do-not-install-.patch"
	"${FILESDIR}/${PN}-0004-meson-let-version-get-stale.patch"
	"${FILESDIR}/${PN}-0005-not-for-upstream-remove-trac.patch"
	"${FILESDIR}/${PN}-0006-not-for-upstream-remove-keym.patch"
	"${FILESDIR}/${PN}-0007-not-for-upstream-misc-update.patch"
	"${FILESDIR}/${PN}-0008-add-target_long_bits.patch"
	"${FILESDIR}/${PN}-0009-uncomment-acpi-build.c.patch"
	"${FILESDIR}/${PN}-0010-fix-number-of-registered-aud.patch"
	"${FILESDIR}/${PN}-0011-fix-boot.patch"
	"${FILESDIR}/${PN}-0012-not-for-upstream-do-not-inst.patch"
)
DOCS=( README.md )

# shellcheck disable=SC2054
FILECAPS=( cap_net_raw,cap_net_admin=eip "usr/bin/${PN}" )

src_prepare() {
	mv "${WORKDIR}/genconfig-${GENCONFIG_SHA}" subprojects/genconfig || die
	mv "${WORKDIR}/nv2a_vsh_cpu-${NV2A_VSH_CPU_SHA}" subprojects/nv2a_vsh_cpu || die
	mv "${WORKDIR}/tomlplusplus-${TOMLPLUSPLUS_SHA}" subprojects/tomlplusplus || die
	mv "${WORKDIR}/keycodemapdb-${KEYCODEMAPDB_SHA}" subprojects//keycodemapdb || die
	mv "${WORKDIR}/imgui-${IMGUI_SHA}" subprojects/imgui || die
	mv "${WORKDIR}/implot-${IMPLOT_SHA}" subprojects/implot || die
	mv "${WORKDIR}/glslang-${GLSLANG_SHA}" subprojects/glslang || die
	mv "${WORKDIR}/volk-${VOLK_SHA}" subprojects/volk || die
	mv "${WORKDIR}/SPIRV-Reflect-${SPIRV_REFLECT_SHA}" subprojects/SPIRV-Reflect || die
	mv "${WORKDIR}/VulkanMemoryAllocator-${VMA_SHA}" subprojects/VulkanMemoryAllocator || die
	mv "${WORKDIR}/berkeley-softfloat-3-${BERKELEY_SOFTFLOAT_SHA}" subprojects/berkeley-softfloat-3 || die
	cp subprojects/packagefiles/berkeley-softfloat-3/meson* subprojects/berkeley-softfloat-3 || die
	mv "${WORKDIR}/berkeley-testfloat-3-${BERKELEY_TESTFLOAT_SHA}" subprojects/berkeley-testfloat-3 || die
	cp subprojects/packagefiles/berkeley-testfloat-3/meson* subprojects/berkeley-testfloat-3 || die
	echo "${PV}" > XEMU_VERSION || die
	echo master > XEMU_BRANCH || die
	touch XEMU_COMMIT || die
	default
}

src_configure() {
	# Build the DSP FFI from source before Meson checks for it. Its fallback
	# downloads a prebuilt archive during configure.
	pushd "${WORKDIR}/dsp56300-${DSP_PV}" > /dev/null || die
	cargo_src_configure -p dsp56300-emu-ffi
	cargo_src_compile
	local cargo_libdir
	cargo_libdir="$(realpath "$(cargo_target_dir)")" || die
	mkdir -p "${T}/pkgconfig" || die
	cat > "${T}/pkgconfig/dsp56300-emu-ffi.pc" <<-EOF || die
		Name: dsp56300-emu-ffi
		Description: DSP56300 emulator C interface
		Version: ${DSP_PV}
		Libs: -L${cargo_libdir} -ldsp56300_emu_ffi -lpthread -ldl -lm
		Cflags: -I${PWD}/crates/emu-ffi/include
	EOF
	popd > /dev/null || die
	local -x PKG_CONFIG_PATH="${T}/pkgconfig${PKG_CONFIG_PATH:+:${PKG_CONFIG_PATH}}"
	local audio_drv_list=( "'sdl'," )
	local build_cflags=("-I${S}/ui/imgui")
	local debug_flag
	if use debug; then
		filter-flags '-O*'
		build_cflags+=(-O0 -g -DXEMU_DEBUG_BUILD=1)
		debug_flag=--enable-debug
	fi
	use alsa && audio_drv_list+=( "'alsa'," )
	use jack && audio_drv_list+=( "'jack'," )
	use pulseaudio && audio_drv_list+=( "'pa'," )
	local other_opts=(
		"$(use_enable alsa)"
		"$(use_enable debug debug-info)"
		"$(use_enable debug debug-tcg)"
		"$(use_enable jack)"
		--disable-gettext
		"$(use_enable pulseaudio pa)"
		"$(use_enable xattr attr)"
		--cc="$(tc-getCC)"
		--cxx="$(tc-getCXX)"
		--disable-bsd-user
		--disable-containers # bug #732972
		--disable-guest-agent
		--disable-tcg-interpreter
		--host-cc="$(tc-getBUILD_CC)"
		"--libdir=/usr/$(get_libdir)"
		# From qemu ebuild
		# We support gnutls/nettle for crypto operations.  It is possible
		# to use gcrypt when gnutls/nettle are disabled (but not when they
		# are enabled), but it's not really worth the hassle.  Disable it
		# all the time to avoid automatically detecting it. #568856
		--disable-gcrypt
		# use prebuilt keymaps, bug #759604
		--disable-xkbcommon
	)
	local audio_drv_list_str="${audio_drv_list[*]}"
	local l=$((${#audio_drv_list_str}-1))
	audio_drv_list_str="${audio_drv_list_str:0:${l}}"
	audio_drv_list_str="${audio_drv_list_str// /}"
	econf \
		"$(use_enable aio linux-aio)" \
		${debug_flag} \
		"$(use_enable io-uring linux-io-uring)" \
		"$(use_enable malloc-trim)" \
		"$(use_enable membarrier)" \
		"$(use_enable test tests)" \
		"--audio-drv-list=[${audio_drv_list_str}]" \
		 --disable-docs \
		--disable-qom-cast-debug \
		--disable-strip \
		--disable-werror \
		"--extra-cflags=-DXBOX=1 -DCONFIG_SOFTMMU ${build_cflags[*]} -Wno-error=redundant-decls ${CFLAGS}" \
		--target-list=xemu \
		"${other_opts[@]}"
}

src_compile() {
	MAKEOPTS+=" V=1"
	emake
}

src_install() {
	default
	rm -R "${D}/usr/share/qemu" || die
}

src_test() {
	cd "${S}/build" || die
	pax-mark m "${PN}"* #515550
	emake check
}

pkg_postinst() {
	fcaps_pkg_postinst
	xdg_desktop_database_update
	xdg_icon_cache_update
}