fex: Add support for library forwarding (#413255)
This commit is contained in:
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user