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

EAPI=8

inherit cmake flag-o-matic xdg

MY_PV="v.${PV}"
FDK_AAC_SHA="ee76460efbdb147e26d804c798949c23f174460b"
HALF_SHA="1ddada225144cac0de8f6b5c0dd9acffd99a2e68"
HWINFO_SHA="8660006e0ca4aae5dda7a29e585968b50b0273b7"
IMGUI_SHA="7e1b65d26d52e9dd199d889c148c72184de647b4"
IMGUIFILEDIALOG_SHA="57a1c6a6d44bd99e844e3642d27851f6c065af62"
LIBATRAC9_SHA="946e05a9212976626a9f5e52f29c0a7202871f29"
MINIMP3_SHA="7b590fdcfa5a79c033e76eacc05d0c3e4c79f536"
QTLAUNCHER_SHA="3d4f8d2ec00b830c6fb5459f2de6213168370c17"
QTLAUNCHER_VERSION="2026.10.17"
SIRIT_SHA="fc2b42d5e57ee2f638676c0c02f7fd71934b596a"
SPDLOG_SHA="b8944a4bcd478ee03375c9c50dc8d6c741f43f7b"
VOLK_SHA="e51c647181c7a8101454e69446079bc34100a320"

DESCRIPTION="PlayStation 4 emulator"
HOMEPAGE="https://shadps4.net/ https://github.com/shadps4-emu/shadPS4"
SRC_URI="https://github.com/shadps4-emu/shadPS4/archive/refs/tags/${MY_PV}.tar.gz -> ${P}.tar.gz
	https://github.com/mstorsjo/fdk-aac/archive/${FDK_AAC_SHA}.tar.gz -> ${PN}-fdk-aac-${FDK_AAC_SHA}.tar.gz
	https://github.com/ROCm/half/archive/${HALF_SHA}.tar.gz -> ${PN}-half-${HALF_SHA}.tar.gz
	https://github.com/shadps4-emu/ext-hwinfo/archive/${HWINFO_SHA}.tar.gz -> ${PN}-hwinfo-${HWINFO_SHA}.tar.gz
	https://github.com/shadexternals/imgui/archive/${IMGUI_SHA}.tar.gz -> ${PN}-imgui-${IMGUI_SHA}.tar.gz
	https://github.com/shadexternals/ImGuiFileDialog/archive/${IMGUIFILEDIALOG_SHA}.tar.gz
		-> ${PN}-ImGuiFileDialog-${IMGUIFILEDIALOG_SHA}.tar.gz
	https://github.com/shadps4-emu/ext-LibAtrac9/archive/${LIBATRAC9_SHA}.tar.gz
		-> ${PN}-LibAtrac9-${LIBATRAC9_SHA}.tar.gz
	https://github.com/lieff/minimp3/archive/${MINIMP3_SHA}.tar.gz -> ${PN}-minimp3-${MINIMP3_SHA}.tar.gz
	https://github.com/shadps4-emu/sirit/archive/${SIRIT_SHA}.tar.gz -> ${PN}-sirit-${SIRIT_SHA}.tar.gz
	https://github.com/gabime/spdlog/archive/${SPDLOG_SHA}.tar.gz -> ${PN}-spdlog-${SPDLOG_SHA}.tar.gz
	gui? (
		https://github.com/shadps4-emu/shadps4-qtlauncher/archive/${QTLAUNCHER_SHA}.tar.gz
			-> ${PN}-qtlauncher-${QTLAUNCHER_SHA}.tar.gz
		https://github.com/zeux/volk/archive/${VOLK_SHA}.tar.gz -> ${PN}-volk-${VOLK_SHA}.tar.gz
	)"
S="${WORKDIR}/shadPS4-${MY_PV}"

LICENSE="GPL-2+ BSD Boost-1.0 CC0-1.0 FraunhoferFDK MIT OFL-1.1"
SLOT="0"
KEYWORDS="~amd64"
IUSE="+gui cpu_flags_x86_sse4_1"
REQUIRED_USE="cpu_flags_x86_sse4_1"

RDEPEND="app-arch/zarchive
	>=app-arch/zstd-1.5.6:=
	>=dev-cpp/abseil-cpp-20250512.1:=
	>=dev-libs/boost-1.84:=
	>=dev-libs/libfmt-12:=
	dev-libs/libusb:1
	>=dev-libs/miniz-3.1:=
	dev-libs/openssl:=
	>=dev-libs/protobuf-30:=
	>=dev-libs/pugixml-1.14
	>=dev-libs/xxhash-0.8.2
	dev-libs/zydis:=
	media-libs/freetype
	media-libs/libpng:=
	>=media-libs/libsdl3-3.1.2
	media-libs/openal
	media-libs/vulkan-loader
	media-video/ffmpeg:=
	>=net-libs/miniupnpc-2.3.3:=
	virtual/zlib:=
	gui? (
		dev-qt/qtbase:6[concurrent,gui,network,widgets]
		dev-qt/qtmultimedia:6
	)"
DEPEND="${RDEPEND}
	>=dev-cpp/cli11-2.6.1
	>=dev-cpp/magic_enum-0.9.7
	>=dev-cpp/nlohmann_json-3.12
	dev-cpp/robin-map
	>=dev-cpp/toml11-4.2
	dev-cpp/cpp-httplib
	dev-cpp/tracy
	dev-libs/stb
	>=dev-libs/xbyak-7.07
	dev-util/spirv-headers
	>=dev-util/vulkan-headers-1.4.330
	>=media-libs/VulkanMemoryAllocator-3.1
	dev-util/glslang"
BDEPEND="dev-libs/protobuf
	virtual/pkgconfig
	gui? ( dev-qt/qttools:6[linguist] )"

PATCHES=( "${FILESDIR}/${PN}-system-libs.patch" )

src_prepare() {
	local -A ext=(
		[aacdec/fdk-aac]="fdk-aac-${FDK_AAC_SHA}"
		[half]="half-${HALF_SHA}"
		[hwinfo]="ext-hwinfo-${HWINFO_SHA}"
		[imgui]="imgui-${IMGUI_SHA}"
		[ImGuiFileDialog]="ImGuiFileDialog-${IMGUIFILEDIALOG_SHA}"
		[LibAtrac9]="ext-LibAtrac9-${LIBATRAC9_SHA}"
		[minimp3]="minimp3-${MINIMP3_SHA}"
		[sirit]="sirit-${SIRIT_SHA}"
		[spdlog]="spdlog-${SPDLOG_SHA}"
	)
	local d
	for d in "${!ext[@]}"; do
		rmdir "externals/${d}" || die
		mv "${WORKDIR}/${ext[${d}]}" "externals/${d}" || die
	done
	cmake_src_prepare

	if use gui; then
		local launcher="${WORKDIR}/shadps4-qtlauncher-${QTLAUNCHER_SHA}"
		pushd "${launcher}" > /dev/null || die
		rmdir externals/{spdlog,volk} || die
		cp -r "${S}/externals/spdlog" externals/spdlog || die
		mv "${WORKDIR}/volk-${VOLK_SHA}" externals/volk || die
		eapply "${FILESDIR}/${PN}-qtlauncher-system-libs.patch"
		popd > /dev/null || die
		local PATCHES=()
		CMAKE_USE_DIR="${launcher}" BUILD_DIR="${launcher}_build" cmake_src_prepare
	fi
}

src_configure() {
	# The audio code uses SSE4.1 intrinsics; upstream's -march=x86-64-v3 is
	# dropped in favour of the user's flags.
	append-flags -msse4.1
	# Upstream only builds with NDEBUG; without it debug-only code breaks with
	# system fmt 12.
	append-cppflags -DNDEBUG
	local mycmakeargs=(
		-DENABLE_DISCORD_RPC=OFF
		-DENABLE_SYSTEM_LIBRARIES=ON
		-DENABLE_UPDATER=OFF
		-DSIRIT_USE_SYSTEM_SPIRV_HEADERS=ON
	)
	cmake_src_configure

	if use gui; then
		local launcher="${WORKDIR}/shadps4-qtlauncher-${QTLAUNCHER_SHA}"
		# qt_standard_project_setup() adds an $ORIGIN RPATH meant for relocatable bundles.
		mycmakeargs=(
			-DCMAKE_SKIP_INSTALL_RPATH=ON
			-DENABLE_UPDATER=OFF
			# The tarball has no git metadata for the title bar.
			-DLAUNCHER_APP_VERSION="${QTLAUNCHER_VERSION}"
			-DLAUNCHER_GIT_BRANCH=main
			-DLAUNCHER_GIT_DESC="${QTLAUNCHER_SHA:0:7}"
			# Register the shadps4 found in PATH as the default emulator version.
			-DSHADPS4_SYSTEM_VERSION="${PV}"
		)
		CMAKE_USE_DIR="${launcher}" BUILD_DIR="${launcher}_build" cmake_src_configure
	fi
}

src_compile() {
	cmake_src_compile
	if use gui; then
		BUILD_DIR="${WORKDIR}/shadps4-qtlauncher-${QTLAUNCHER_SHA}_build" cmake_src_compile
	fi
}

src_install() {
	cmake_src_install
	if use gui; then
		BUILD_DIR="${WORKDIR}/shadps4-qtlauncher-${QTLAUNCHER_SHA}_build" cmake_src_install
	fi
}