# Copyright 2025 Gentoo Authors # Distributed under the terms of the GNU General Public License v2 EAPI=8 inherit cmake desktop DESCRIPTION="Xbox 360 emulator research project (Canary version)." HOMEPAGE="https://github.com/xenia-canary/xenia-canary https://xenia.jp/" SHA="ef65c6761bcfa16ab40101ee229c2b88e47251e2" AES_128_SHA="7e3ac3bb6b478187472b4ac6f1698eb203e8e90b" BINUTILS_PPC_CYGWIN_SHA="6f3f15db908d339472db7be450f7c58bb71545cc" DATE_SHA="f94b8f36c6180be0021876c4a397a054fe50c6f2" FIDELITYFX_CAS_SHA="9fabcc9a2c45f958aff55ddfda337e74ef894b7f" FIDELITYFX_FSR_SHA="a21ffb8f6c13233ba336352bdff293894c706575" PREMAKE_ANDROIDNDK_SHA="35a6955410a34840c9d091f071c46cd3e5280fb7" PREMAKE_CMAKE_SHA="91c646f638a6fbff20f0ea90769df8dcf62bc5e4" PREMAKE_CORE_SHA="ba2c383c0456aa75d1b93faf62f4aec2691f23b2" PREMAKE_EXPORT_CC_SHA="59e3e55df8dd87eea70556f50d172a17f1c4b6d0" DISRUPTORPLUS_SHA="302b6e03e829c6d6a70415f10d818a5088cb6ccf" FFMPEG_SHA="85e39939c90f3b34efe45fee29a2b653d06b55e5" GLSLANG_SHA="ae2a562936cc8504c9ef2757cceaff163147834f" SPIRV_TOOLS_SHA="4451f6ab13dda98bf255a7cd7b4d120132dc0dfd" RAPIDCSV_SHA="a98b85e663114b8fdc9c0dc03abf22c296f38241" TABULATE_SHA="3a58301067bbc03da89ae5a51b3e05b7da719d38" XBYAK_SHA="4e44f4614ddbf038f2a6296f5b906d5c72691e0f" VMA_SHA="c788c52156f3ef7bc7ab769cb03c110a53ac8fcb" VULKAN_HEADERS_SHA="409c16be502e39fe70dd6fe2d9ad4842ef2c9a53" IMGUI_SHA="4806a1924ff6181180bf5e4b8b79ab4394118875" 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/benvanik/binutils-ppc-cygwin/archive/${BINUTILS_PPC_CYGWIN_SHA}.tar.gz -> ${PN}-binutils-ppc-cygwin-${BINUTILS_PPC_CYGWIN_SHA:0:7}.tar.gz https://github.com/HowardHinnant/date/archive/${DATE_SHA}.tar.gz -> ${PN}-date-${DATE_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/Triang3l/premake-androidndk/archive/${PREMAKE_ANDROIDNDK_SHA}.tar.gz -> ${PN}-premake-androidndk-${PREMAKE_ANDROIDNDK_SHA:0:7}.tar.gz https://github.com/JoelLinn/premake-cmake/archive/${PREMAKE_CMAKE_SHA}.tar.gz -> ${PN}-premake-cmake-${PREMAKE_CMAKE_SHA:0:7}.tar.gz https://github.com/premake/premake-core/archive/${PREMAKE_CORE_SHA}.tar.gz -> ${PN}-premake-core-${PREMAKE_CORE_SHA:0:7}.tar.gz https://github.com/xenia-project/premake-export-compile-commands/archive/${PREMAKE_EXPORT_CC_SHA}.tar.gz -> ${PN}-premake-export-compile-commands-${PREMAKE_EXPORT_CC_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/xenia-canary/FFmpeg_radixsplit/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/KhronosGroup/SPIRV-Tools/archive/${SPIRV_TOOLS_SHA}.tar.gz -> ${PN}-SPIRV-Tools-${SPIRV_TOOLS_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 https://github.com/GPUOpen-LibrariesAndSDKs/VulkanMemoryAllocator/archive/${VMA_SHA}.tar.gz -> ${PN}-vulkanmemoryallocator-${VMA_SHA:0:7}.tar.gz https://github.com/KhronosGroup/Vulkan-Headers/archive/${VULKAN_HEADERS_SHA}.tar.gz -> ${PN}-vulkan-headers-${VULKAN_HEADERS_SHA:0:7}.tar.gz https://github.com/ocornut/imgui/archive/${IMGUI_SHA}.tar.gz -> ${PN}-imgui-${IMGUI_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/expat dev-libs/libfmt:= dev-libs/libpcre2 dev-libs/pugixml dev-libs/xxhash 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/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/directx-headers dev-util/premake:5 llvm-core/clang" PATCHES=( "${FILESDIR}/${PN}-0001-use_system_xxhash.patch" "${FILESDIR}/${PN}-0002-build-treat-wunused-result-a.patch" "${FILESDIR}/${PN}-0003-build-generate-build-version.patch" "${FILESDIR}/${PN}-0004-build-fix-linux-linker-error.patch" "${FILESDIR}/${PN}-0005-build-add-use_system_fmt-opt.patch" "${FILESDIR}/${PN}-0006-build-add-use_system_zstd-an.patch" "${FILESDIR}/${PN}-0007-use_system_glslang.patch" "${FILESDIR}/${PN}-0008-build-add-use_system_capston.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.patch" "${FILESDIR}/${PN}-0016-add-use_system_vulkan_header.patch" "${FILESDIR}/${PN}-0017-discord.patch" "${FILESDIR}/${PN}-0018-add-use_system_imgui-option-.patch" "${FILESDIR}/${PN}-0019-use-system-sdl2-on-linux.patch" "${FILESDIR}/${PN}-0020-zarchive-sha_256-guard-system.patch" "${FILESDIR}/${PN}-0021-use-system-premake.patch" "${FILESDIR}/${PN}-0022-allow-version-override.patch" "${FILESDIR}/${PN}-0023-gentoo-cflags.patch" "${FILESDIR}/${PN}-0024-cmake-relwithdebinfo.patch" ) CMAKE_USE_DIR="${S}/build" xenia_env() { # Upstream only supports Clang. export CC=${CHOST}-clang CXX=${CHOST}-clang++ export USE_SYSTEM_CAPSTONE=1 export USE_SYSTEM_CXXOPTS=1 USE_SYSTEM_DISCORD_RPC=$(usex discord 1 0) export USE_SYSTEM_DISCORD_RPC export USE_SYSTEM_FMT=1 export USE_SYSTEM_PUGIXML=1 export USE_SYSTEM_SNAPPY=1 export USE_SYSTEM_TOMLPLUSPLUS=1 export USE_SYSTEM_UTFCPP=1 export USE_SYSTEM_XXHASH=1 export USE_SYSTEM_ZARCHIVE=1 export USE_SYSTEM_ZLIB_NG=1 export USE_SYSTEM_ZSTD=1 export XENIA_BUILD_BRANCH="${PV}" export XENIA_BUILD_COMMIT="${SHA}" export XENIA_BUILD_COMMIT_SHORT="${SHA:0:7}" XENIA_DISCORD="$(usex discord 1 0)" export XENIA_DISCORD export XENIA_USE_SYSTEM_PREMAKE=1 } src_prepare() { rm .gitmodules || die rmdir "${S}"/third_party/{aes_128,binutils-ppc-cygwin} || die rm -rf "${S}"/third_party/date || die rmdir "${S}"/third_party/{FidelityFX-CAS,FidelityFX-FSR} || die rm -rf "${S}"/third_party/disruptorplus || die rm -rf "${S}"/third_party/FFmpeg || die rm -rf "${S}"/third_party/imgui || die rm -rf "${S}"/third_party/glslang || die rm -rf "${S}"/third_party/rapidcsv || die rm -rf "${S}"/third_party/xbyak || die rm -rf "${S}"/third_party/VulkanMemoryAllocator || die rm -rf "${S}"/third_party/Vulkan-Headers || die rm -rf "${S}"/third_party/SPIRV-Tools || die rm -rf "${S}"/third_party/tabulate || die rmdir "${S}"/third_party/{premake-androidndk,premake-cmake,premake-core} || die rmdir "${S}"/third_party/premake-export-compile-commands || die mv "${WORKDIR}/aes_128-${AES_128_SHA}" "${S}/third_party/aes_128" || die mv "${WORKDIR}/binutils-ppc-cygwin-${BINUTILS_PPC_CYGWIN_SHA}" \ "${S}/third_party/binutils-ppc-cygwin" || die mv "${WORKDIR}/date-${DATE_SHA}" "${S}/third_party/date" || 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_radixsplit-${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}/xbyak-${XBYAK_SHA}" "${S}/third_party/xbyak" || die mv "${WORKDIR}/VulkanMemoryAllocator-${VMA_SHA}" "${S}/third_party/VulkanMemoryAllocator" || die mv "${WORKDIR}/Vulkan-Headers-${VULKAN_HEADERS_SHA}" "${S}/third_party/Vulkan-Headers" || die mv "${WORKDIR}/SPIRV-Tools-${SPIRV_TOOLS_SHA}" "${S}/third_party/SPIRV-Tools" || die mv "${WORKDIR}/tabulate-${TABULATE_SHA}" "${S}/third_party/tabulate" || die mv "${WORKDIR}/premake-androidndk-${PREMAKE_ANDROIDNDK_SHA}" \ "${S}/third_party/premake-androidndk" || die mv "${WORKDIR}/premake-cmake-${PREMAKE_CMAKE_SHA}" \ "${S}/third_party/premake-cmake" || die mv "${WORKDIR}/premake-core-${PREMAKE_CORE_SHA}" \ "${S}/third_party/premake-core" || die mv "${WORKDIR}/premake-export-compile-commands-${PREMAKE_EXPORT_CC_SHA}" \ "${S}/third_party/premake-export-compile-commands" || die xenia_env default premake5 --file=premake5.lua --os=linux --cc=clang --verbose cmake || die mkdir -p build || die cat < build/version.h #ifndef GENERATED_VERSION_H_ #define GENERATED_VERSION_H_ #define XE_BUILD_BRANCH "${XENIA_BUILD_BRANCH}" #define XE_BUILD_COMMIT "${XENIA_BUILD_COMMIT}" #define XE_BUILD_COMMIT_SHORT "${XENIA_BUILD_COMMIT_SHORT}" #define XE_BUILD_DATE __DATE__ #endif // GENERATED_VERSION_H_ EOF cmake_prepare } src_configure() { xenia_env cmake_src_configure } src_install() { local build_type=${CMAKE_BUILD_TYPE:-Release} newbin "build/bin/Linux/${build_type}/${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 }