| Version | EAPI | Keywords | Slot |
|---|---|---|---|
| 2603 | 8 | -* ~arm64 | 0 |
# Copyright 1999-2026 Gentoo Authors
# Distributed under the terms of the GNU General Public License v2
EAPI=8
LLVM_COMPAT=( 19 20 21 )
LLVM_OPTIONAL=1
inherit flag-o-matic cmake toolchain-funcs llvm-r1 check-reqs
DESCRIPTION="A fast usermode x86 and x86-64 emulator for Arm64 Linux"
HOMEPAGE="https://fex-emu.com"
RPMALLOC_HASH="1f6fb494f2a4237c35494786a3c8f1eba048b217"
JEMALLOC_GLIBC_HASH="8436195ad5e1bc347d9b39743af3d29abee59f06"
CPP_OPTPARSE_HASH="9f94388a339fcbb0bc95c17768eb786c85988f6e"
UNORDERED_DENSE_HASH="3234af2c03549bc85656bfd3a86993bf1cd8aef1"
# This need to be vendored since thunk generator does not support the latest version
VULKAN_HEADERS_HASH="450bd2232225d6c7728a4108055ac2e37cef6475"
SRC_URI="
https://github.com/FEX-Emu/rpmalloc/archive/${RPMALLOC_HASH}.tar.gz -> rpmalloc-${RPMALLOC_HASH}.tar.gz
https://github.com/FEX-Emu/jemalloc/archive/${JEMALLOC_GLIBC_HASH}.tar.gz -> jemalloc-glibc-${JEMALLOC_GLIBC_HASH}.tar.gz
https://github.com/Sonicadvance1/cpp-optparse/archive/${CPP_OPTPARSE_HASH}.tar.gz -> cpp-optparse-${CPP_OPTPARSE_HASH}.tar.gz
https://github.com/martinus/unordered_dense/archive/${UNORDERED_DENSE_HASH}.tar.gz -> unordered_dense-${UNORDERED_DENSE_HASH}.tar.gz
thunks? (
https://github.com/KhronosGroup/Vulkan-Headers/archive/${VULKAN_HEADERS_HASH}.tar.gz -> Vulkan-Headers-${VULKAN_HEADERS_HASH}.tar.gz
)
https://github.com/FEX-Emu/${PN}/archive/refs/tags/${P}.tar.gz
"
S="${WORKDIR}/${PN}-${P}"
LICENSE="MIT"
SLOT="0"
KEYWORDS="-* ~arm64"
BDEPEND="
llvm-core/clang
llvm-core/llvm
llvm-core/lld
thunks? (
sys-fs/squashfs-tools[zstd]
$(llvm_gen_dep '
llvm-core/clang:${LLVM_SLOT}=
llvm-core/llvm:${LLVM_SLOT}=
')
)
"
RDEPEND="
dev-libs/xxhash
>=dev-libs/libfmt-11.0.2:=
qt6? (
dev-qt/qtbase:6[gui,wayland(-),widgets,X(-)]
dev-qt/qtdeclarative:6
)
thunks? (
x11-libs/libX11
x11-libs/libdrm
dev-libs/wayland
media-libs/alsa-lib
media-libs/libglvnd
x11-libs/libxcb
)
>=app-emulation/fex-rootfs-gentoo-20250904-r1
"
DEPEND="
dev-cpp/range-v3
>=sys-kernel/linux-headers-6.17
${RDEPEND}
"
PATCHES="
${FILESDIR}/${PN}-2601-unvendor-drm-headers.patch
${FILESDIR}/${PN}-2503-thunkgen-gcc-install-dir.patch
"
IUSE="+fexconfig +qt6 +thunks"
REQUIRED_USE="
fexconfig? ( qt6 )
thunks? ( ${LLVM_REQUIRED_USE} )
"
pkg_pretend() {
use thunks || return
CHECKREQS_DISK_BUILD=4G
check-reqs_pkg_pretend
}
pkg_setup() {
use thunks || return
CHECKREQS_DISK_BUILD=4G
check-reqs_pkg_pretend
llvm-r1_pkg_setup
}
src_unpack() {
default
local -A deps=(
rpmalloc "rpmalloc-${RPMALLOC_HASH}"
jemalloc_glibc "jemalloc-${JEMALLOC_GLIBC_HASH}"
unordered_dense "unordered_dense-${UNORDERED_DENSE_HASH}"
)
use thunks && deps[Vulkan-Headers]="Vulkan-Headers-${VULKAN_HEADERS_HASH}"
for dep in "${!deps[@]}"; do
rmdir "${S}/External/${dep}" || die
mv "${WORKDIR}/${deps[${dep}]}" "${S}/External/${dep}"
done
rmdir "${S}/Source/Common/cpp-optparse" || die
mv "${WORKDIR}/cpp-optparse-${CPP_OPTPARSE_HASH}" "${S}/Source/Common/cpp-optparse" || die
cp "${FILESDIR}/toolchain_x86_32.cmake" "${S}/Data/CMake/" || die
cp "${FILESDIR}/toolchain_x86_64.cmake" "${S}/Data/CMake/" || die
if use thunks ; then
unsquashfs -d "${WORKDIR}/fex-rootfs" "${ESYSROOT}/usr/share/fex-emu-rootfs-layers/gentoo/images/00-base.sqfs" || die
unsquashfs -d "${WORKDIR}/fex-rootfs" -f "${ESYSROOT}/usr/share/fex-emu-rootfs-layers/gentoo/extra/chroot.sqfs" || die
fi
}
src_configure() {
if ! tc-is-clang ; then
AR=llvm-ar
CC=clang
CXX=clang++
NM=llvm-nm
RANLIB=llvm-ranlib
STRIP=llvm-strip
strip-unsupported-flags
fi
local mycmakeargs=(
-DBUILD_TESTING=False
-DENABLE_CCACHE=False
-DENABLE_LTO=$(if tc-is-lto; then echo True; else echo False; fi)
-DBUILD_FEXCONFIG=$(usex fexconfig)
-DBUILD_THUNKS=$(usex thunks)
-DENABLE_CLANG_THUNKS=True
)
if use thunks; then
mycmakeargs+=(
-DX86_DEV_ROOTFS="${WORKDIR}/fex-rootfs"
)
fi
cmake_src_configure
}
src_install() {
cmake_src_install
tc-is-lto && dostrip -x /usr/lib/libFEXCore.a
rm "${ED}/usr/share/man/man1/FEX.1.gz" || die
if use thunks; then
dostrip -x /usr/share/fex-emu/GuestThunks{,_32}/
fi
}
pkg_postinst() {
if [[ "$(getconf PAGESIZE)" -ne 4096 ]] && ! type -P "${EPREFIX}/usr/bin/muvm" >/dev/null ; then
ewarn "Your system page size is not 4096 and as such"
ewarn "you need to install app-emulation/muvm or a similar solution"
ewarn "for FEX to work on your machine."
fi
}
dev-cpp/range-v3 >=sys-kernel/linux-headers-6.17 dev-libs/xxhash >=dev-libs/libfmt-11.0.2:= qt6? ( dev-qt/qtbase:6[gui,wayland(-),widgets,X(-)] dev-qt/qtdeclarative:6 ) thunks? ( x11-libs/libX11 x11-libs/libdrm dev-libs/wayland media-libs/alsa-lib media-libs/libglvnd x11-libs/libxcb ) >=app-emulation/fex-rootfs-gentoo-20250904-r1
dev-libs/xxhash >=dev-libs/libfmt-11.0.2:= qt6? ( dev-qt/qtbase:6[gui,wayland(-),widgets,X(-)] dev-qt/qtdeclarative:6 ) thunks? ( x11-libs/libX11 x11-libs/libdrm dev-libs/wayland media-libs/alsa-lib media-libs/libglvnd x11-libs/libxcb ) >=app-emulation/fex-rootfs-gentoo-20250904-r1
llvm-core/clang
llvm-core/llvm
llvm-core/lld
thunks? (
sys-fs/squashfs-tools[zstd]
$(llvm_gen_dep '
llvm-core/clang:${LLVM_SLOT}=
llvm-core/llvm:${LLVM_SLOT}=
')
)