# Copyright 2020-2022 Gentoo Authors
# Distributed under the terms of the GNU General Public License v2

EAPI=8
inherit cmake xdg

DESCRIPTION="A Nintendo 3DS emulator."
HOMEPAGE="https://github.com/PabloMK7/citra https://web.archive.org/web/20240301162216/https://citra-emu.org/"
SHA="864414f8fd79c90feff29f674898993f0053552f"
DDS_KTX_SHA="42dd8aa6ded90b1ec06091522774feff51e83fc5"
LODEPNG_SHA="18964554bc769255401942e0e6dfd09f2fab2093"
SIRIT_SHA="4ab79a8c023aa63caaa93848b09b9fe8b183b1a9"
SIRIT_SPIRV_HEADERS_SHA="c214f6f2d1a7253bb0e9f195c2dc5b0659dc99ef"
SOUNDTOUCH_SHA="dd2252e9af3f2d6b749378173a4ae89551e06faf"
SUB_DYNARMIC_SHA="c08c5a9362bb224dc343c2f616c24df027dfdf13"
XBYAK_SHA="a1ac3750f9a639b5a6c6d6c7da4259b8d6790989"
SRC_URI="https://github.com/PabloMK7/citra/archive/${SHA}.tar.gz -> ${P}-${SHA:0:7}.tar.gz
	https://github.com/lvandeve/lodepng/archive/${LODEPNG_SHA}.tar.gz -> ${PN}-lodepng-${LODEPNG_SHA:0:7}.tar.gz
	https://github.com/yuzu-mirror/dynarmic/archive/${SUB_DYNARMIC_SHA}.tar.gz -> ${PN}-dynarmic-${SUB_DYNARMIC_SHA:0:7}.tar.gz
	https://github.com/herumi/xbyak/archive/${XBYAK_SHA}.tar.gz -> ${PN}-xbyak-${XBYAK_SHA:0:7}.tar.gz
	https://codeberg.org/soundtouch/soundtouch/archive/${SOUNDTOUCH_SHA}.tar.gz -> ${PN}-soundtouch-${SOUNDTOUCH_SHA:0:7}.tar.gz
	https://github.com/septag/dds-ktx/archive/${DDS_KTX_SHA}.tar.gz -> ${PN}-dds-ktx-${DDS_KTX_SHA:0:7}.tar.gz
	https://github.com/yuzu-mirror/sirit/archive/${SIRIT_SHA}.tar.gz -> ${PN}-yuzu-emu-sirit-${SIRIT_SHA:0:7}.tar.gz
	https://github.com/KhronosGroup/SPIRV-Headers/archive/${SIRIT_SPIRV_HEADERS_SHA}.tar.gz -> ${PN}-yuzu-emu-sirit-spirv-headers-${SIRIT_SPIRV_HEADERS_SHA:0:7}.tar.gz
	https://web.archive.org/web/20231111133415/https://api.citra-emu.org/gamedb -> ${PN}-compatibility_list.json"

LICENSE="ZLIB BSD GPL-2 LGPL-2.1"
SLOT="0"
KEYWORDS="~amd64"
IUSE="openal +qt6 scripting web-service"

# System xbyak is still used by Dynarmic, but not Citra itself
DEPEND="app-arch/zstd
	dev-cpp/robin-map
	dev-libs/boost:0[nls]
	dev-libs/crypto++:=
	dev-libs/openssl
	media-libs/cubeb
	dev-libs/inih
	dev-libs/libfmt
	dev-libs/mp
	dev-libs/teakra
	dev-libs/vulkan-memory-allocator
	>=dev-libs/xbyak-5.941
	qt6? ( dev-qt/qtbase:6 dev-qt/qtmultimedia:6 )
	dev-util/nihstro
	dev-util/glslang
	media-libs/faad2
	media-libs/libsdl2
	media-video/ffmpeg
	net-libs/enet:=
	virtual/libusb:1
	openal? ( media-libs/openal )"
RDEPEND="${DEPEND} media-libs/fdk-aac"
BDEPEND="dev-cpp/catch:0 media-libs/fdk-aac"

PATCHES=(
	"${FILESDIR}/${PN}-0001-system-libraries.patch"
	"${FILESDIR}/${PN}-0002-inih-fix.patch"
	"${FILESDIR}/${PN}-0003-boost-fix.patch"
)

S="${WORKDIR}/${PN}-${SHA}"

src_prepare() {
	rmdir "${S}/externals/lodepng/lodepng" \
		"${S}/externals/"{soundtouch,dynarmic,fmt,xbyak,dds-ktx,sirit} || die
	mv "${WORKDIR}/soundtouch" "${S}/externals/soundtouch" || die
	mv "${WORKDIR}/dds-ktx-${DDS_KTX_SHA}" "${S}/externals/dds-ktx" || die
	mv "${WORKDIR}/dynarmic-${SUB_DYNARMIC_SHA}" "${S}/externals/dynarmic" || die
	mv "${WORKDIR}/lodepng-${LODEPNG_SHA}" "${S}/externals/lodepng/lodepng" || die
	mv "${WORKDIR}/sirit-${SIRIT_SHA}" "${S}/externals/sirit" || die
	rmdir "${S}/externals/sirit/externals/SPIRV-Headers" || die
	mv "${WORKDIR}/SPIRV-Headers-${SIRIT_SPIRV_HEADERS_SHA}" "${S}/externals/sirit/externals/SPIRV-Headers"
	mv "${WORKDIR}/xbyak-${XBYAK_SHA}" "${S}/externals/xbyak" || die
	mkdir -p "${WORKDIR}/${P}_build/dist/compatibility_list" || die
	cp -f "${DISTDIR}/${PN}-compatibility_list.json" "${WORKDIR}/${P}_build/dist/compatibility_list/compatibility_list.json" || die
	# shellcheck disable=SC2016
	sed -e 's|${CMAKE_CURRENT_SOURCE_DIR}/xbyak/xbyak|/usr/include/xbyak|' \
		-i externals/dynarmic/externals/CMakeLists.txt || die
	sed -re 's/-W(all|error)//g' -i externals/dynarmic/CMakeLists.txt \
		externals/dynarmic/externals/catch/CMake/CatchMiscFunctions.cmake \
		externals/dynarmic/externals/catch/CMakeLists.txt \
		externals/dynarmic/externals/fmt/CMakeLists.txt \
		externals/dynarmic/externals/mcl/CMakeLists.txt \
		externals/dynarmic/externals/robin-map/tests/CMakeLists.txt \
		externals/dynarmic/externals/zycore/CMakeLists.txt \
		externals/dynarmic/externals/zycore/cmake/zyan-functions.cmake \
		externals/sirit/CMakeLists.txt \
		src/CMakeLists.txt || die
	cmake_src_prepare
}

src_configure() {
	local mycmakeargs=(
		"-DENABLE_OPENAL=$(usex openal)"
		"-DENABLE_QT=$(usex qt6)"
		"-DENABLE_SCRIPTING=$(usex scripting)"
		"-DENABLE_WEB_SERVICE=$(usex web-service)"
		-DBUILD_SHARED_LIBS=OFF
		-DCITRA_WARNINGS_AS_ERRORS=OFF
		-DDISABLE_SUBMODULE_CHECK=ON
		-DENABLE_QT_UPDATER=OFF
		-DENABLE_TESTS=OFF
		-DUSE_SYSTEM_BOOST=ON
		-DUSE_SYSTEM_CATCH2=ON
		-DUSE_SYSTEM_CRYPTOPP=ON
		-DUSE_SYSTEM_CUBEB=ON
		-DUSE_SYSTEM_ENET=ON
		-DUSE_SYSTEM_FAAD2=ON
		-DUSE_SYSTEM_FMT=ON
		-DUSE_SYSTEM_GLSLANG=ON
		-DUSE_SYSTEM_INIH=ON
		-DUSE_SYSTEM_LIBUSB=ON
		-DUSE_SYSTEM_OPENAL=ON
		-DUSE_SYSTEM_OPENSSL=ON
		-DUSE_SYSTEM_SDL2=ON
		-DUSE_SYSTEM_TEAKRA=ON
		-DUSE_SYSTEM_XBYAK=OFF
		-DUSE_SYSTEM_ZSTD=ON
		-Wno-dev
	)
	cmake_src_configure
}

src_install() {
	cmake_src_install
	local libdir
	libdir=$(get_libdir)
	rm -fR "${D}/usr/include" "${D}/usr/${libdir:?}" || die
}