From 925e670b550a6d8038a414a631c9d63847fe5222 Mon Sep 17 00:00:00 2001 From: Zhaofeng Li Date: Mon, 1 May 2023 17:39:19 -0600 Subject: [PATCH] darling: init at unstable-2023-05-02 --- .../emulators/darling/default.nix | 197 ++++++++++++++++++ pkgs/top-level/all-packages.nix | 2 + 2 files changed, 199 insertions(+) create mode 100644 pkgs/applications/emulators/darling/default.nix diff --git a/pkgs/applications/emulators/darling/default.nix b/pkgs/applications/emulators/darling/default.nix new file mode 100644 index 000000000000..053b82cfedee --- /dev/null +++ b/pkgs/applications/emulators/darling/default.nix @@ -0,0 +1,197 @@ +{ clangStdenv +, lib +, runCommandWith +, writeShellScript +, fetchFromGitHub +, fetchpatch + +, freetype +, libjpeg +, libpng +, libtiff +, giflib +, libX11 +, libXext +, libXrandr +, libXcursor +, libxkbfile +, cairo +, libglvnd +, fontconfig +, dbus +, libGLU +, fuse +, ffmpeg +, pulseaudio + +, makeWrapper +, python2 +, python3 +, cmake +, ninja +, pkg-config +, bison +, flex + +, libbsd +, openssl + +, xdg-user-dirs + +, addOpenGLRunpath + +# Whether to pre-compile Python 2 bytecode for performance. +, compilePy2Bytecode ? false +}: +let + stdenv = clangStdenv; + + # The build system invokes clang to compile Darwin executables. + # In this case, our cc-wrapper must not be used. + ccWrapperBypass = runCommandWith { + inherit stdenv; + name = "cc-wrapper-bypass"; + runLocal = false; + derivationArgs = { + template = writeShellScript "template" '' + for (( i=1; i<=$#; i++)); do + j=$((i+1)) + if [[ "''${!i}" == "-target" && "''${!j}" == *"darwin"* ]]; then + # their flags must take precedence + exec @unwrapped@ "$@" $NIX_CFLAGS_COMPILE + fi + done + exec @wrapped@ "$@" + ''; + }; + } '' + unwrapped_bin=${stdenv.cc.cc}/bin + wrapped_bin=${stdenv.cc}/bin + + mkdir -p $out/bin + + unwrapped=$unwrapped_bin/$CC wrapped=$wrapped_bin/$CC \ + substituteAll $template $out/bin/$CC + unwrapped=$unwrapped_bin/$CXX wrapped=$wrapped_bin/$CXX \ + substituteAll $template $out/bin/$CXX + + chmod +x $out/bin/$CC $out/bin/$CXX + ''; + + wrappedLibs = [ + # To find all of them: rg -w wrap_elf + + # src/native/CMakeLists.txt + freetype + libjpeg + libpng + libtiff + giflib + libX11 + libXext + libXrandr + libXcursor + libxkbfile + cairo + libglvnd + fontconfig + dbus + libGLU + + # src/external/darling-dmg/CMakeLists.txt + fuse + + # src/CoreAudio/CMakeLists.txt + ffmpeg + pulseaudio + ]; +in stdenv.mkDerivation { + pname = "darling"; + version = "unstable-2023-05-02"; + + src = fetchFromGitHub { + owner = "darlinghq"; + repo = "darling"; + rev = "557e7e9dece394a3f623825679474457e5b64fd0"; + fetchSubmodules = true; + hash = "sha256-SOoLaV7wg33qRHPQXkdMvrY++CvoG85kwd6IU6DkYa0="; + }; + + + postPatch = '' + # We have to be careful - Patching everything indiscriminately + # would affect Darwin scripts as well + chmod +x src/external/bootstrap_cmds/migcom.tproj/mig.sh + patchShebangs \ + src/external/bootstrap_cmds/migcom.tproj/mig.sh \ + src/external/darlingserver/scripts \ + src/external/openssl_certificates/scripts + + substituteInPlace src/startup/CMakeLists.txt --replace SETUID "" + substituteInPlace src/external/basic_cmds/CMakeLists.txt --replace SETGID "" + ''; + + nativeBuildInputs = [ + bison + ccWrapperBypass + cmake + flex + makeWrapper + ninja + pkg-config + python3 + ] + ++ lib.optional compilePy2Bytecode python2; + buildInputs = wrappedLibs ++ [ + libbsd + openssl + stdenv.cc.libc.linuxHeaders + ]; + + # Breaks valid paths like + # Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/usr/include + dontFixCmake = true; + + # src/external/objc4 forces OBJC_IS_DEBUG_BUILD=1, which conflicts with NDEBUG + # TODO: Fix in a better way + cmakeBuildType = " "; + + cmakeFlags = [ + "-DTARGET_i386=OFF" + "-DCOMPILE_PY2_BYTECODE=${if compilePy2Bytecode then "ON" else "OFF"}" + "-DDARLINGSERVER_XDG_USER_DIR_CMD=${xdg-user-dirs}/bin/xdg-user-dir" + ]; + + env.NIX_CFLAGS_COMPILE = "-Wno-macro-redefined -Wno-unused-command-line-argument"; + + # Linux .so's are dlopen'd by wrapgen during the build + env.LD_LIBRARY_PATH = lib.makeLibraryPath wrappedLibs; + + # Breaks shebangs of Darwin scripts + dontPatchShebangs = true; + + postFixup = '' + echo "Checking for references to $NIX_STORE in Darling root..." + + set +e + grep -r --exclude=mldr "$NIX_STORE" $out/libexec/darling + ret=$? + set -e + + if [[ $ret == 0 ]]; then + echo "Found references to $NIX_STORE in Darling root (see above)" + exit 1 + fi + + patchelf --add-rpath "${lib.makeLibraryPath wrappedLibs}:${addOpenGLRunpath.driverLink}/lib" \ + $out/libexec/darling/usr/libexec/darling/mldr + ''; + + meta = with lib; { + description = "Open-source Darwin/macOS emulation layer for Linux"; + homepage = "https://www.darlinghq.org"; + license = licenses.gpl3Plus; + maintainers = with maintainers; [ zhaofengli ]; + platforms = [ "x86_64-linux" ]; + }; +} diff --git a/pkgs/top-level/all-packages.nix b/pkgs/top-level/all-packages.nix index b71f0c6f1da8..7a18e54c02d2 100644 --- a/pkgs/top-level/all-packages.nix +++ b/pkgs/top-level/all-packages.nix @@ -493,6 +493,8 @@ with pkgs; dae = callPackage ../tools/networking/dae { }; + darling = callPackage ../applications/emulators/darling { }; + databricks-sql-cli = python3Packages.callPackage ../applications/misc/databricks-sql-cli { }; dhallDirectoryToNix = callPackage ../build-support/dhall/directory-to-nix.nix { };