# Copyright 2026 Gentoo Authors # Distributed under the terms of the GNU General Public License v2 EAPI=8 inherit cmake desktop flag-o-matic toolchain-funcs DESCRIPTION="Xbox 360 emulator research project (Canary version)." HOMEPAGE="https://github.com/xenia-canary/xenia-canary https://xenia.jp/" SHA="2771366b8bb92d32d475b18a4fe9241c5aa691a4" AES_128_SHA="7e3ac3bb6b478187472b4ac6f1698eb203e8e90b" FIDELITYFX_CAS_SHA="9fabcc9a2c45f958aff55ddfda337e74ef894b7f" FIDELITYFX_FSR_SHA="a21ffb8f6c13233ba336352bdff293894c706575" DISRUPTORPLUS_SHA="bf9c70c0cc92b6435f7edec75e12751ea37e5c2f" FFMPEG_SHA="d980192e175e6ff95bcd287af77e16fcb6597974" GLSLANG_SHA="a57276bf558f5cf94d3a9854ebdf5a2236849a5a" IMGUI_SHA="4806a1924ff6181180bf5e4b8b79ab4394118875" RAPIDCSV_SHA="a98b85e663114b8fdc9c0dc03abf22c296f38241" TABULATE_SHA="3a58301067bbc03da89ae5a51b3e05b7da719d38" XBYAK_SHA="4e44f4614ddbf038f2a6296f5b906d5c72691e0f" SRC_URI="https://github.com/xenia-canary/xenia-canary/archive/${SHA}.tar.gz -> ${P}-${SHA:0:7}.tar.gz https://github.com/openluopworld/aes_128/archive/${AES_128_SHA}.tar.gz -> ${PN}-aes_128-${AES_128_SHA:0:7}.tar.gz https://github.com/GPUOpen-Effects/FidelityFX-CAS/archive/${FIDELITYFX_CAS_SHA}.tar.gz -> ${PN}-FidelityFX-CAS-${FIDELITYFX_CAS_SHA:0:7}.tar.gz https://github.com/GPUOpen-Effects/FidelityFX-FSR/archive/${FIDELITYFX_FSR_SHA}.tar.gz -> ${PN}-FidelityFX-FSR-${FIDELITYFX_FSR_SHA:0:7}.tar.gz https://github.com/xenia-canary/disruptorplus/archive/${DISRUPTORPLUS_SHA}.tar.gz -> ${PN}-disruptorplus-${DISRUPTORPLUS_SHA:0:7}.tar.gz https://github.com/has207/FFmpeg/archive/${FFMPEG_SHA}.tar.gz -> ${PN}-FFmpeg-${FFMPEG_SHA:0:7}.tar.gz https://github.com/KhronosGroup/glslang/archive/${GLSLANG_SHA}.tar.gz -> ${PN}-glslang-${GLSLANG_SHA:0:7}.tar.gz https://github.com/ocornut/imgui/archive/${IMGUI_SHA}.tar.gz -> ${PN}-imgui-${IMGUI_SHA:0:7}.tar.gz https://github.com/d99kris/rapidcsv/archive/${RAPIDCSV_SHA}.tar.gz -> ${PN}-rapidcsv-${RAPIDCSV_SHA:0:7}.tar.gz https://github.com/p-ranav/tabulate/archive/${TABULATE_SHA}.tar.gz -> ${PN}-tabulate-${TABULATE_SHA:0:7}.tar.gz https://github.com/herumi/xbyak/archive/${XBYAK_SHA}.tar.gz -> ${PN}-xbyak-${XBYAK_SHA:0:7}.tar.gz" S="${WORKDIR}/xenia-canary-${SHA}" LICENSE="MIT" SLOT="0" KEYWORDS="~amd64" IUSE="cpu_flags_x86_avx discord" REQUIRED_USE="cpu_flags_x86_avx" DEPEND="app-arch/brotli app-arch/bzip2 app-arch/snappy app-arch/zarchive app-arch/zstd dev-cpp/tomlplusplus dev-libs/capstone dev-libs/date dev-libs/expat dev-libs/libfmt:= dev-libs/libpcre2 dev-libs/pugixml dev-libs/xxhash dev-util/spirv-tools discord? ( dev-libs/discord-rpc ) media-gfx/graphite2 media-libs/alsa-lib media-libs/libjpeg-turbo:= media-libs/libpulse media-libs/libsdl2 media-libs/libsndfile media-libs/VulkanMemoryAllocator media-libs/vulkan-loader media-video/pipewire sys-apps/util-linux sys-libs/zlib-ng x11-libs/gtk+" RDEPEND="${DEPEND}" BDEPEND="dev-libs/cxxopts dev-libs/utfcpp dev-util/vulkan-headers" PATCHES=( "${FILESDIR}/${PN}-0001-fix-build-with-gcc-clang-unc.patch" "${FILESDIR}/${PN}-0002-write-xenia.log-to-xdg-state.patch" "${FILESDIR}/${PN}-0003-cmake-add-use_system_-de-ven.patch" "${FILESDIR}/${PN}-0004-add-use_system_xxhash-option.patch" "${FILESDIR}/${PN}-0005-add-use_system_fmt-option-fo.patch" "${FILESDIR}/${PN}-0006-add-use_system_zstd-and-use_.patch" "${FILESDIR}/${PN}-0007-use-system-glslang-use_syste.patch" "${FILESDIR}/${PN}-0008-add-use_system_capstone-opti.patch" "${FILESDIR}/${PN}-0009-add-use_system_snappy-option.patch" "${FILESDIR}/${PN}-0010-add-use_system_pugixml-optio.patch" "${FILESDIR}/${PN}-0011-add-use_system_zlib_ng-optio.patch" "${FILESDIR}/${PN}-0012-add-use_system_cxxopts-optio.patch" "${FILESDIR}/${PN}-0013-add-use_system_xbyak-option-.patch" "${FILESDIR}/${PN}-0014-add-use_system_tomlplusplus-.patch" "${FILESDIR}/${PN}-0015-use-system-utfcpp-use_system.patch" "${FILESDIR}/${PN}-0016-add-use_system_vulkan_header.patch" "${FILESDIR}/${PN}-0017-add-use_system_discord_rpc-o.patch" "${FILESDIR}/${PN}-0018-make-discord-rich-presence-o.patch" "${FILESDIR}/${PN}-0019-add-use_system_imgui-option-.patch" "${FILESDIR}/${PN}-0020-zarchive-sha-256-guard-syste.patch" "${FILESDIR}/${PN}-0021-system-date-library-support.patch" "${FILESDIR}/${PN}-0022-use-system-sdl2-on-linux.patch" "${FILESDIR}/${PN}-0023-add-use_system_spirv_tools-o.patch" ) # Avoid the upstream Release configuration (forced thin LTO + lld, Clang only). CMAKE_BUILD_TYPE="RelWithDebInfo" src_prepare() { rm .gitmodules || die # Replace the submodule placeholders that are still built from source with # the matching upstream-pinned snapshots. Everything else is de-vendored to # system libraries. rm -rf "${S}"/third_party/{aes_128,disruptorplus,FFmpeg,glslang,imgui,rapidcsv,tabulate,xbyak} || die rm -rf "${S}"/third_party/{FidelityFX-CAS,FidelityFX-FSR} || die mv "${WORKDIR}/aes_128-${AES_128_SHA}" "${S}/third_party/aes_128" || die mv "${WORKDIR}/FidelityFX-CAS-${FIDELITYFX_CAS_SHA}" \ "${S}/third_party/FidelityFX-CAS" || die mv "${WORKDIR}/FidelityFX-FSR-${FIDELITYFX_FSR_SHA}" \ "${S}/third_party/FidelityFX-FSR" || die mv "${WORKDIR}/disruptorplus-${DISRUPTORPLUS_SHA}" \ "${S}/third_party/disruptorplus" || die mv "${WORKDIR}/FFmpeg-${FFMPEG_SHA}" "${S}/third_party/FFmpeg" || die mv "${WORKDIR}/glslang-${GLSLANG_SHA}" "${S}/third_party/glslang" || die mv "${WORKDIR}/imgui-${IMGUI_SHA}" "${S}/third_party/imgui" || die mv "${WORKDIR}/rapidcsv-${RAPIDCSV_SHA}" "${S}/third_party/rapidcsv" || die mv "${WORKDIR}/tabulate-${TABULATE_SHA}" "${S}/third_party/tabulate" || die mv "${WORKDIR}/xbyak-${XBYAK_SHA}" "${S}/third_party/xbyak" || die # version.h is normally written by xenia-build.py; generate it directly. # ${S} is on the include path, so #include "version.h" resolves here. cat <<-EOF > "${S}/version.h" || die #ifndef GENERATED_VERSION_H_ #define GENERATED_VERSION_H_ #define XE_BUILD_BRANCH "${PV}" #define XE_BUILD_COMMIT "${SHA}" #define XE_BUILD_COMMIT_SHORT "${SHA:0:7}" #define XE_BUILD_DATE __DATE__ #endif // GENERATED_VERSION_H_ EOF cmake_src_prepare } src_configure() { if tc-is-gcc; then # Causes startup error in libstdc++ HashTable with GCC. filter-lto fi if tc-is-clang; then # These flags result in the emulator showing no video (Rocket/Tiger Lake). filter-flags -march=* -mtune=* fi local mycmakeargs=( -DXENIA_BUILD_TESTS=OFF "-DXENIA_BUILD_DISCORD=$(usex discord ON OFF)" -DUSE_SYSTEM_CAPSTONE=ON -DUSE_SYSTEM_CXXOPTS=ON -DUSE_SYSTEM_DATE=ON "-DUSE_SYSTEM_DISCORD_RPC=$(usex discord ON OFF)" -DUSE_SYSTEM_FMT=ON -DUSE_SYSTEM_PUGIXML=ON -DUSE_SYSTEM_SNAPPY=ON -DUSE_SYSTEM_SPIRV_TOOLS=ON -DUSE_SYSTEM_TOMLPLUSPLUS=ON -DUSE_SYSTEM_UTFCPP=ON -DUSE_SYSTEM_VULKAN_HEADERS=ON -DUSE_SYSTEM_VULKAN_MEMORY_ALLOCATOR=ON -DUSE_SYSTEM_XXHASH=ON -DUSE_SYSTEM_ZARCHIVE=ON -DUSE_SYSTEM_ZLIB_NG=ON -DUSE_SYSTEM_ZSTD=ON ) cmake_src_configure } src_install() { newbin "${BUILD_DIR}/bin/Linux/${PN/-/_}" "${PN}" for size in 16 32 48 64 128 256 512 1024; do newicon -s ${size} "assets/icon/${size}.png" "${PN}.png" done make_desktop_entry xenia-canary "Xenia Canary" "${PN}" "Game;Emulator" dodoc README.md }