summary refs log tree commit diff
path: root/pkgs/os-specific
diff options
context:
space:
mode:
authorWeijia Wang <9713184+wegank@users.noreply.github.com>2023-03-27 13:47:01 +0300
committerWeijia Wang <9713184+wegank@users.noreply.github.com>2023-03-27 13:47:01 +0300
commit76694fdeb3fc6e4f975cbf621df6b332b61ae35e (patch)
treead005256eb39edd4027fcd1d31a8964c77adefa5 /pkgs/os-specific
parent03b6ad65f3e62ed36d0982b1022d0a97bd9ccf4c (diff)
downloadnixpkgs-76694fdeb3fc6e4f975cbf621df6b332b61ae35e.tar
nixpkgs-76694fdeb3fc6e4f975cbf621df6b332b61ae35e.tar.gz
nixpkgs-76694fdeb3fc6e4f975cbf621df6b332b61ae35e.tar.bz2
nixpkgs-76694fdeb3fc6e4f975cbf621df6b332b61ae35e.tar.lz
nixpkgs-76694fdeb3fc6e4f975cbf621df6b332b61ae35e.tar.xz
nixpkgs-76694fdeb3fc6e4f975cbf621df6b332b61ae35e.tar.zst
nixpkgs-76694fdeb3fc6e4f975cbf621df6b332b61ae35e.zip
prl-tools: refactor
Diffstat (limited to 'pkgs/os-specific')
-rw-r--r--pkgs/os-specific/linux/prl-tools/default.nix227
1 files changed, 123 insertions, 104 deletions
diff --git a/pkgs/os-specific/linux/prl-tools/default.nix b/pkgs/os-specific/linux/prl-tools/default.nix
index b0769f70ca4..b800e2ee98d 100644
--- a/pkgs/os-specific/linux/prl-tools/default.nix
+++ b/pkgs/os-specific/linux/prl-tools/default.nix
@@ -1,28 +1,39 @@
-{ stdenv
-, lib
+{ lib
+, stdenv
+, fetchurl
+, autoPatchelfHook
+, bbe
 , makeWrapper
 , p7zip
-, gawk
-, util-linux
-, xorg
-, glib
+, perl
+, undmg
 , dbus-glib
+, glib
+, xorg
 , zlib
-, bbe
+, kernel
 , bash
-, timetrap
-, netcat
 , cups
-, kernel ? null
-, libsOnly ? false
-, fetchurl
-, undmg
-, perl
-, autoPatchelfHook
+, gawk
+, netcat
+, timetrap
+, util-linux
 }:
 
-assert (!libsOnly) -> kernel != null;
+let
+  kernelVersion = kernel.modDirVersion;
+  kernelDir = "${kernel.dev}/lib/modules/${kernelVersion}";
 
+  libPath = lib.concatStringsSep ":" [ "${glib.out}/lib" "${xorg.libXrandr}/lib" ];
+  scriptPath = lib.concatStringsSep ":" [
+    "${bash}/bin"
+    "${cups}/sbin"
+    "${gawk}/bin"
+    "${netcat}/bin"
+    "${timetrap}/bin"
+    "${util-linux}/bin"
+  ];
+in
 stdenv.mkDerivation rec {
   version = "18.2.0-53488";
   pname = "prl-tools";
@@ -36,124 +47,132 @@ stdenv.mkDerivation rec {
 
   hardeningDisable = [ "pic" "format" ];
 
-  nativeBuildInputs = [ p7zip undmg perl bbe autoPatchelfHook ]
-    ++ lib.optionals (!libsOnly) [ makeWrapper ] ++ kernel.moduleBuildDependencies;
-
-  buildInputs = with xorg; [ libXrandr libXext libX11 libXcomposite libXinerama ]
-    ++ lib.optionals (!libsOnly) [ libXi glib dbus-glib zlib ];
-
-  runtimeDependencies = [ glib xorg.libXrandr ];
-
-  inherit libsOnly;
+  nativeBuildInputs = [
+    autoPatchelfHook
+    bbe
+    makeWrapper
+    p7zip
+    perl
+    undmg
+  ] ++ kernel.moduleBuildDependencies;
+
+  buildInputs = [
+    dbus-glib
+    glib
+    xorg.libX11
+    xorg.libXcomposite
+    xorg.libXext
+    xorg.libXrandr
+    xorg.libXi
+    xorg.libXinerama
+    zlib
+  ];
+
+  runtimeDependencies = [
+    glib
+    xorg.libXrandr
+  ];
 
   unpackPhase = ''
+    runHook preUnpack
+
     undmg $src
     export sourceRoot=prl-tools-build
     7z x "Parallels Desktop.app/Contents/Resources/Tools/prl-tools-lin${lib.optionalString stdenv.isAarch64 "-arm"}.iso" -o$sourceRoot
-    if test -z "$libsOnly"; then
-      ( cd $sourceRoot/kmods; tar -xaf prl_mod.tar.gz )
-    fi
-  '';
-
-  kernelVersion = lib.optionalString (!libsOnly) kernel.modDirVersion;
-  kernelDir = lib.optionalString (!libsOnly) "${kernel.dev}/lib/modules/${kernelVersion}";
+    ( cd $sourceRoot/kmods; tar -xaf prl_mod.tar.gz )
 
-  libPath = lib.concatStringsSep ":" [ "${glib.out}/lib" "${xorg.libXrandr}/lib" ];
+    runHook postUnpack
+  '';
 
-  scriptPath = lib.concatStringsSep ":" (lib.optionals (!libsOnly) [
-    "${util-linux}/bin"
-    "${gawk}/bin"
-    "${bash}/bin"
-    "${timetrap}/bin"
-    "${netcat}/bin"
-    "${cups}/sbin"
-  ]);
+  env.NIX_CFLAGS_COMPILE = lib.optionalString (lib.versionAtLeast kernelVersion "6.3") "-Wno-incompatible-pointer-types";
 
   buildPhase = ''
-    if test -z "$libsOnly"; then
-      ( # kernel modules
-        cd kmods
-        make -f Makefile.kmods \
-          KSRC=$kernelDir/source \
-          HEADERS_CHECK_DIR=$kernelDir/source \
-          KERNEL_DIR=$kernelDir/build \
-          SRC=$kernelDir/build \
-          KVER=$kernelVersion
-      )
-    fi
+    runHook preBuild
+
+    ( # kernel modules
+      cd kmods
+      make -f Makefile.kmods \
+        KSRC=${kernelDir}/source \
+        HEADERS_CHECK_DIR=${kernelDir}/source \
+        KERNEL_DIR=${kernelDir}/build \
+        SRC=${kernelDir}/build \
+        KVER=${kernelVersion}
+    )
+
+    runHook postBuild
   '';
 
   installPhase = ''
-    if test -z "$libsOnly"; then
-      ( # kernel modules
-        cd kmods
-        mkdir -p $out/lib/modules/${kernelVersion}/extra
-        cp prl_fs/SharedFolders/Guest/Linux/prl_fs/prl_fs.ko $out/lib/modules/${kernelVersion}/extra
-        cp prl_fs_freeze/Snapshot/Guest/Linux/prl_freeze/prl_fs_freeze.ko $out/lib/modules/${kernelVersion}/extra
-        cp prl_tg/Toolgate/Guest/Linux/prl_tg/prl_tg.ko $out/lib/modules/${kernelVersion}/extra
-        ${lib.optionalString stdenv.isAarch64
-        "cp prl_notifier/Installation/lnx/prl_notifier/prl_notifier.ko $out/lib/modules/${kernelVersion}/extra"}
-      )
-    fi
+    runHook preInstall
+
+    ( # kernel modules
+      cd kmods
+      mkdir -p $out/lib/modules/${kernelVersion}/extra
+      cp prl_fs/SharedFolders/Guest/Linux/prl_fs/prl_fs.ko $out/lib/modules/${kernelVersion}/extra
+      cp prl_fs_freeze/Snapshot/Guest/Linux/prl_freeze/prl_fs_freeze.ko $out/lib/modules/${kernelVersion}/extra
+      cp prl_tg/Toolgate/Guest/Linux/prl_tg/prl_tg.ko $out/lib/modules/${kernelVersion}/extra
+      ${lib.optionalString stdenv.isAarch64
+      "cp prl_notifier/Installation/lnx/prl_notifier/prl_notifier.ko $out/lib/modules/${kernelVersion}/extra"}
+    )
 
     ( # tools
       cd tools/tools${if stdenv.isAarch64 then "-arm64" else if stdenv.isx86_64 then "64" else "32"}
       mkdir -p $out/lib
 
-      if test -z "$libsOnly"; then
-        # prltoolsd contains hardcoded /bin/bash path
-        # we're lucky because it uses only -c command
-        # => replace to /bin/sh
-        bbe -e "s:/bin/bash:/bin/sh\x00\x00:" -o bin/prltoolsd.tmp bin/prltoolsd
-        rm -f bin/prltoolsd
-        mv bin/prltoolsd.tmp bin/prltoolsd
-
-        # install binaries
-        for i in bin/* sbin/prl_nettool sbin/prl_snapshot; do
-          # also patch binaries to replace /usr/bin/XXX to XXX
-          # here a two possible cases:
-          # 1. it is uses as null terminated string and should be truncated by null;
-          # 2. it is uses inside shell script and should be truncated by space.
-          for p in bin/* sbin/prl_nettool sbin/prl_snapshot sbin/prlfsmountd; do
-            p=$(basename $p)
-            bbe -e "s:/usr/bin/$p\x00:./$p\x00\x00\x00\x00\x00\x00\x00\x00:" -o $i.tmp $i
-            bbe -e "s:/usr/sbin/$p\x00:./$p\x00\x00\x00\x00\x00\x00\x00\x00 :" -o $i $i.tmp
-            bbe -e "s:/usr/bin/$p:$p         :" -o $i.tmp $i
-            bbe -e "s:/usr/sbin/$p:$p          :" -o $i $i.tmp
-          done
-
-          install -Dm755 $i $out/$i
+      # prltoolsd contains hardcoded /bin/bash path
+      # we're lucky because it uses only -c command
+      # => replace to /bin/sh
+      bbe -e "s:/bin/bash:/bin/sh\x00\x00:" -o bin/prltoolsd.tmp bin/prltoolsd
+      rm -f bin/prltoolsd
+      mv bin/prltoolsd.tmp bin/prltoolsd
+
+      # install binaries
+      for i in bin/* sbin/prl_nettool sbin/prl_snapshot; do
+        # also patch binaries to replace /usr/bin/XXX to XXX
+        # here a two possible cases:
+        # 1. it is uses as null terminated string and should be truncated by null;
+        # 2. it is uses inside shell script and should be truncated by space.
+        for p in bin/* sbin/prl_nettool sbin/prl_snapshot sbin/prlfsmountd; do
+          p=$(basename $p)
+          bbe -e "s:/usr/bin/$p\x00:./$p\x00\x00\x00\x00\x00\x00\x00\x00:" -o $i.tmp $i
+          bbe -e "s:/usr/sbin/$p\x00:./$p\x00\x00\x00\x00\x00\x00\x00\x00 :" -o $i $i.tmp
+          bbe -e "s:/usr/bin/$p:$p         :" -o $i.tmp $i
+          bbe -e "s:/usr/sbin/$p:$p          :" -o $i $i.tmp
         done
 
-        install -Dm755 ../../tools/prlfsmountd.sh $out/sbin/prlfsmountd
-        for f in $out/bin/* $out/sbin/*; do
-          wrapProgram $f \
-            --prefix LD_LIBRARY_PATH ':' "$libPath" \
-            --prefix PATH ':' "$scriptPath"
-        done
+        install -Dm755 $i $out/$i
+      done
 
-        for i in lib/libPrl*.0.0; do
-          cp $i $out/lib
-          ln -s $out/$i $out/''${i%.0.0}
-        done
+      install -Dm755 ../../tools/prlfsmountd.sh $out/sbin/prlfsmountd
+      for f in $out/bin/* $out/sbin/*; do
+        wrapProgram $f \
+          --prefix LD_LIBRARY_PATH ':' "${libPath}" \
+          --prefix PATH ':' "${scriptPath}"
+      done
+
+      for i in lib/libPrl*.0.0; do
+        cp $i $out/lib
+        ln -s $out/$i $out/''${i%.0.0}
+      done
 
-        mkdir -p $out/share/man/man8
-        install -Dm644 ../mount.prl_fs.8 $out/share/man/man8
+      mkdir -p $out/share/man/man8
+      install -Dm644 ../mount.prl_fs.8 $out/share/man/man8
 
-        substituteInPlace ../99prltoolsd-hibernate \
-          --replace "/bin/bash" "${bash}/bin/bash"
+      substituteInPlace ../99prltoolsd-hibernate \
+        --replace "/bin/bash" "${bash}/bin/bash"
 
-        mkdir -p $out/etc/pm/sleep.d
-        install -Dm644 ../99prltoolsd-hibernate $out/etc/pm/sleep.d
-      fi
+      mkdir -p $out/etc/pm/sleep.d
+      install -Dm644 ../99prltoolsd-hibernate $out/etc/pm/sleep.d
     )
+
+    runHook postInstall
   '';
 
   meta = with lib; {
     description = "Parallels Tools for Linux guests";
     homepage = "https://parallels.com";
-    platforms = platforms.linux;
     license = licenses.unfree;
     maintainers = with maintainers; [ catap wegank ];
+    platforms = platforms.linux;
   };
 }