diff --git a/maintainers/maintainer-list.nix b/maintainers/maintainer-list.nix index 6eb24c930933..42e77a062f67 100644 --- a/maintainers/maintainer-list.nix +++ b/maintainers/maintainer-list.nix @@ -1351,6 +1351,13 @@ githubId = 638836; name = "Andreas Rammhold"; }; + andre4ik3 = { + name = "andre4ik3"; + email = "andre4ik3@fastmail.com"; + matrix = "@andre4ik3:matrix.org"; + github = "andre4ik3"; + githubId = 62390580; + }; andreasfelix = { email = "fandreas@physik.hu-berlin.de"; github = "andreasfelix"; diff --git a/pkgs/by-name/fe/fex/package.nix b/pkgs/by-name/fe/fex/package.nix new file mode 100644 index 000000000000..002fe3a70139 --- /dev/null +++ b/pkgs/by-name/fe/fex/package.nix @@ -0,0 +1,80 @@ +{ + fetchFromGitHub, + lib, + llvmPackages, + cmake, + ninja, + pkg-config, + gitMinimal, + qt5, + python3, +}: + +llvmPackages.stdenv.mkDerivation (finalAttrs: rec { + pname = "fex"; + version = "2412"; + + src = fetchFromGitHub { + owner = "FEX-Emu"; + repo = "FEX"; + tag = "FEX-${version}"; + hash = "sha256-VwcfxdRMjE/yoe5q0p3j4FdEMOJdtq17moxiGWO+CN0="; + fetchSubmodules = true; + }; + + patches = [ + # This is a workaround to get FEX working with NixOS's slightly weird binfmt + # infrastructure. + ./realpath.patch + ]; + + nativeBuildInputs = [ + cmake + ninja + pkg-config + gitMinimal + qt5.wrapQtAppsHook + llvmPackages.bintools + + (python3.withPackages ( + pythonPackages: with pythonPackages; [ + setuptools + libclang + ] + )) + ]; + + buildInputs = with qt5; [ + qtbase + qtdeclarative + qtquickcontrols + qtquickcontrols2 + ]; + + cmakeFlags = [ + "-DCMAKE_BUILD_TYPE=Release" + "-DUSE_LINKER=lld" + "-DENABLE_LTO=True" + "-DENABLE_ASSERTIONS=False" + (lib.cmakeBool "BUILD_TESTS" finalAttrs.finalPackage.doCheck) + ]; + + strictDeps = true; + doCheck = false; # broken on Apple silicon computers + + # Avoid wrapping anything other than FEXConfig, since the wrapped executables + # don't seem to work when registered as binfmts. + dontWrapQtApps = true; + preFixup = '' + wrapQtApp $out/bin/FEXConfig + ''; + + meta = { + description = "Fast usermode x86 and x86-64 emulator for Arm64 Linux"; + homepage = "https://fex-emu.com/"; + platforms = [ "aarch64-linux" ]; + license = lib.licenses.mit; + maintainers = with lib.maintainers; [ andre4ik3 ]; + mainProgram = "FEXBash"; + }; +}) diff --git a/pkgs/by-name/fe/fex/realpath.patch b/pkgs/by-name/fe/fex/realpath.patch new file mode 100644 index 000000000000..51cf02d426dc --- /dev/null +++ b/pkgs/by-name/fe/fex/realpath.patch @@ -0,0 +1,19 @@ +diff --git a/Source/Common/FEXServerClient.cpp b/Source/Common/FEXServerClient.cpp +index 424ecf0a0..501bcbac1 100644 +--- a/Source/Common/FEXServerClient.cpp ++++ b/Source/Common/FEXServerClient.cpp +@@ -209,7 +209,13 @@ int ConnectToAndStartServer(char* InterpreterPath) { + return -1; + } + +- fextl::string FEXServerPath = FHU::Filesystem::ParentPath(InterpreterPath) + "/FEXServer"; ++ char RealInterpreterPathBuf[PATH_MAX]; ++ char *RealInterpreterPath = realpath(InterpreterPath, RealInterpreterPathBuf); ++ if (!RealInterpreterPath) { ++ LogMan::Msg::EFmt("realpath failed"); ++ return -1; ++ } ++ fextl::string FEXServerPath = FHU::Filesystem::ParentPath(RealInterpreterPath) + "/FEXServer"; + // Check if a local FEXServer next to FEXInterpreter exists + // If it does then it takes priority over the installed one + if (!FHU::Filesystem::Exists(FEXServerPath)) {