fex: Add support for library forwarding (#413255)

This commit is contained in:
Peder Bergebakken Sundt
2025-09-09 17:54:19 +02:00
committed by GitHub
+115
View File
@@ -11,8 +11,83 @@
xxHash,
fmt,
nasm,
buildEnv,
writeText,
pkgsCross,
libclang,
libllvm,
alsa-lib,
libdrm,
libGL,
wayland,
xorg,
}:
let
# Headers required to build the ThunkLibs subtree
libForwardingInputs = lib.map lib.getInclude [
alsa-lib
libdrm
libGL
wayland
xorg.libX11
xorg.libxcb
xorg.libXrandr
xorg.libXrender
xorg.xorgproto
];
pkgsCross32 = pkgsCross.gnu32;
pkgsCross64 = pkgsCross.gnu64;
devRootFS = buildEnv {
name = "fex-dev-rootfs";
paths = [
pkgsCross64.stdenv.cc.libc_dev
pkgsCross32.stdenv.cc.libc_dev
pkgsCross64.stdenv.cc.cc
pkgsCross32.stdenv.cc.cc
]
++ libForwardingInputs;
ignoreCollisions = true;
pathsToLink = [
"/include"
"/lib"
];
postBuild = ''
mkdir -p $out/usr
ln -s $out/include $out/usr/
'';
};
toolchain32 = writeText "toolchain_nix_x86_32.txt" ''
set(CMAKE_EXE_LINKER_FLAGS_INIT "-fuse-ld=lld")
set(CMAKE_MODULE_LINKER_FLAGS_INIT "-fuse-ld=lld")
set(CMAKE_SHARED_LINKER_FLAGS_INIT "-fuse-ld=lld")
set(CMAKE_SYSTEM_PROCESSOR i686)
set(CMAKE_C_COMPILER clang)
set(CMAKE_CXX_COMPILER clang++)
set(CMAKE_C_COMPILER ${pkgsCross32.buildPackages.clang}/bin/i686-unknown-linux-gnu-clang)
set(CMAKE_CXX_COMPILER ${pkgsCross32.buildPackages.clang}/bin/i686-unknown-linux-gnu-clang++)
set(CLANG_FLAGS "-nodefaultlibs -nostartfiles -target i686-linux-gnu -msse2 -mfpmath=sse --sysroot=${devRootFS} -iwithsysroot/usr/include")
set(CMAKE_C_FLAGS "''${CMAKE_C_FLAGS} ''${CLANG_FLAGS}")
set(CMAKE_CXX_FLAGS "''${CMAKE_CXX_FLAGS} ''${CLANG_FLAGS}")
'';
toolchain = writeText "toolchain_nix_x86_64.txt" ''
set(CMAKE_EXE_LINKER_FLAGS_INIT "-fuse-ld=lld")
set(CMAKE_MODULE_LINKER_FLAGS_INIT "-fuse-ld=lld")
set(CMAKE_SHARED_LINKER_FLAGS_INIT "-fuse-ld=lld")
set(CMAKE_SYSTEM_PROCESSOR x86_64)
set(CMAKE_C_COMPILER clang)
set(CMAKE_CXX_COMPILER clang++)
set(CMAKE_C_COMPILER ${pkgsCross64.buildPackages.clang}/bin/x86_64-unknown-linux-gnu-clang)
set(CMAKE_CXX_COMPILER ${pkgsCross64.buildPackages.clang}/bin/x86_64-unknown-linux-gnu-clang++)
set(CLANG_FLAGS "-nodefaultlibs -nostartfiles -target x86_64-linux-gnu --sysroot=${devRootFS} -iwithsysroot/usr/include")
set(CMAKE_C_FLAGS "''${CMAKE_C_FLAGS} ''${CLANG_FLAGS}")
set(CMAKE_CXX_FLAGS "''${CMAKE_CXX_FLAGS} ''${CLANG_FLAGS}")
'';
in
llvmPackages.stdenv.mkDerivation (finalAttrs: {
pname = "fex";
version = "2508.1";
@@ -49,6 +124,37 @@ llvmPackages.stdenv.mkDerivation (finalAttrs: {
'';
};
postPatch = ''
substituteInPlace ThunkLibs/GuestLibs/CMakeLists.txt ThunkLibs/HostLibs/CMakeLists.txt \
--replace-fail "/usr/include/libdrm" "${devRootFS}/include/libdrm" \
--replace-fail "/usr/include/wayland" "${devRootFS}/include/wayland"
# Add include paths for thunkgen invocation
substituteInPlace ThunkLibs/HostLibs/CMakeLists.txt \
--replace-fail "-- " "-- $(cat ${llvmPackages.stdenv.cc}/nix-support/libc-cflags) $(cat ${llvmPackages.stdenv.cc}/nix-support/libcxx-cxxflags) ${
lib.concatMapStrings (x: "-isystem " + x + "/include ") libForwardingInputs
}"
substituteInPlace ThunkLibs/GuestLibs/CMakeLists.txt \
--replace-fail "-- " "-- $(cat ${llvmPackages.stdenv.cc}/nix-support/libcxx-cxxflags) "
# Patch any references to library wrapper paths
substituteInPlace FEXCore/Source/Interface/Config/Config.json.in \
--replace-fail "ThunkGuestLibs" "UnusedThunkGuestLibs" \
--replace-fail "ThunkHostLibs" "UnusedThunkHostLibs"
substituteInPlace FEXCore/Source/Interface/Config/Config.cpp \
--replace-fail "FEXCore::Config::CONFIG_THUNKGUESTLIBS" "FEXCore::Config::CONFIG_UNUSEDTHUNKGUESTLIBS" \
--replace-fail "FEXCore::Config::CONFIG_THUNKHOSTLIBS" "FEXCore::Config::CONFIG_UNUSEDTHUNKHOSTLIBS"
substituteInPlace Source/Tools/LinuxEmulation/VDSO_Emulation.cpp \
--replace-fail "FEX_CONFIG_OPT(ThunkGuestLibs, THUNKGUESTLIBS);" "auto ThunkGuestLibs = []() { return \"$out/share/fex-emu/GuestThunks/\"; };"
substituteInPlace Source/Tools/LinuxEmulation/LinuxSyscalls/FileManagement.h \
--replace-fail "FEX_CONFIG_OPT(ThunkGuestLibs, THUNKGUESTLIBS);" "fextl::string ThunkGuestLibs() { return \"$out/share/fex-emu/GuestThunks/\"; }"
substituteInPlace Source/Tools/LinuxEmulation/Thunks.cpp \
--replace-fail "FEX_CONFIG_OPT(ThunkHostLibsPath, THUNKHOSTLIBS);" "fextl::string ThunkHostLibsPath() { return \"$out/lib/fex-emu/HostThunks/\"; }"
substituteInPlace Source/Tools/FEXConfig/main.qml \
--replace-fail "config: \"Thunk" "config: \"UnusedThunk" \
--replace-fail "title: qsTr(\"Library forwarding:\")" "visible: false; title: qsTr(\"Library forwarding:\")"
'';
nativeBuildInputs = [
cmake
ninja
@@ -69,7 +175,12 @@ llvmPackages.stdenv.mkDerivation (finalAttrs: {
buildInputs = [
xxHash
fmt
pkgsCross64.buildPackages.clang
pkgsCross32.buildPackages.clang
libclang
libllvm
]
++ libForwardingInputs
++ (with qt5; [
qtbase
qtdeclarative
@@ -83,6 +194,10 @@ llvmPackages.stdenv.mkDerivation (finalAttrs: {
(lib.cmakeBool "ENABLE_ASSERTIONS" false)
(lib.cmakeFeature "OVERRIDE_VERSION" finalAttrs.version)
(lib.cmakeBool "BUILD_TESTS" finalAttrs.finalPackage.doCheck)
(lib.cmakeBool "BUILD_THUNKS" true)
(lib.cmakeFeature "X86_32_TOOLCHAIN_FILE" "${toolchain32}")
(lib.cmakeFeature "X86_64_TOOLCHAIN_FILE" "${toolchain}")
(lib.cmakeFeature "X86_DEV_ROOTFS" "${devRootFS}")
];
strictDeps = true;