200 lines
6.4 KiB
Nix
200 lines
6.4 KiB
Nix
{ stdenv, lib, requireFile, makeWrapper, substituteAll, p7zip
|
|
, gawk, utillinux, xorg, glib, dbus_glib, zlib
|
|
, kernel ? null, libsOnly ? false
|
|
}:
|
|
|
|
assert (!libsOnly) -> kernel != null;
|
|
|
|
let xorgFullVer = (builtins.parseDrvName xorg.xorgserver.name).version;
|
|
xorgVer = lib.concatStringsSep "." (lib.take 2 (lib.splitString "." xorgFullVer));
|
|
x64 = if stdenv.system == "x86_64-linux" then true
|
|
else if stdenv.system == "i686-linux" then false
|
|
else abort "Parallels Tools for Linux only support {x86-64,i686}-linux targets";
|
|
# We autostart user services by ourselves, because prlcc uses hardcoded paths.
|
|
autostart = [ { exec = "prlcc";
|
|
description = "Parallels Control Center";
|
|
}
|
|
{ exec = "prldhd";
|
|
description = "Parallels Control Center"; # not a mistake
|
|
}
|
|
{ exec = "prl_wmouse_d";
|
|
description = "Parallels Walking Mouse Daemon";
|
|
}
|
|
{ exec = "prlcp";
|
|
description = "Parallels CopyPaste Tool";
|
|
}
|
|
{ exec = "prlsga";
|
|
description = "Parallels Shared Guest Applications Tool";
|
|
}
|
|
{ exec = "prlshprof";
|
|
description = "Parallels Shared Profile Tool";
|
|
}
|
|
];
|
|
in
|
|
stdenv.mkDerivation rec {
|
|
version = "10.0.2.27712";
|
|
name = "prl-tools-${version}";
|
|
|
|
src = requireFile rec {
|
|
name = "prl-tools-lin.iso";
|
|
sha256 = "07960jvyv7gihjlg922znjm6db6l6bd23x9mg6ympwibzf2mylmx";
|
|
message = ''
|
|
Please, place Parallels Tools for Linux image into Nix store
|
|
using either
|
|
nix-store --add-fixed sha256 ${name}
|
|
or
|
|
nix-prefetch-url file://path/to/${name}
|
|
'';
|
|
};
|
|
|
|
hardeningDisable = [ "pic" ];
|
|
|
|
# also maybe python2 to generate xorg.conf
|
|
nativeBuildInputs = [ p7zip ] ++ lib.optionals (!libsOnly) [ makeWrapper ];
|
|
|
|
inherit libsOnly;
|
|
|
|
unpackPhase = ''
|
|
7z x $src
|
|
export sourceRoot=.
|
|
if test -z "$libsOnly"; then
|
|
( cd kmods; tar -xaf prl_mod.tar.gz )
|
|
fi
|
|
( cd tools; tar -xaf prltools${if x64 then ".x64" else ""}.tar.gz )
|
|
'';
|
|
|
|
kernelVersion = if libsOnly then "" else (builtins.parseDrvName kernel.name).version;
|
|
kernelDir = if libsOnly then "" else "${kernel.dev}/lib/modules/${kernelVersion}";
|
|
scriptPath = lib.concatStringsSep ":" (lib.optionals (!libsOnly) [ "${utillinux}/bin" "${gawk}/bin" ]);
|
|
|
|
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
|
|
)
|
|
|
|
# Xorg config (maybe would be useful for other versions)
|
|
#python2 installer/xserver-config.py xorg ${xorgVer} /dev/null parallels.conf
|
|
fi
|
|
'';
|
|
|
|
libPath = with xorg;
|
|
stdenv.lib.makeLibraryPath ([ stdenv.cc.cc libXrandr libXext libX11 libXcomposite libXinerama ]
|
|
++ lib.optionals (!libsOnly) [ libXi glib dbus_glib zlib ]);
|
|
|
|
desktops = map (x: substituteAll ({
|
|
src = ./autostart.desktop;
|
|
name = x.exec + ".desktop";
|
|
version = version;
|
|
} // x)) autostart;
|
|
|
|
installPhase = ''
|
|
if test -z "$libsOnly"; then
|
|
( # kernel modules
|
|
cd kmods
|
|
mkdir -p $out/lib/modules/${kernelVersion}/extra
|
|
cp prl_eth/pvmnet/prl_eth.ko $out/lib/modules/${kernelVersion}/extra
|
|
cp prl_tg/Toolgate/Guest/Linux/prl_tg/prl_tg.ko $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
|
|
)
|
|
fi
|
|
|
|
( # tools
|
|
cd tools
|
|
mkdir -p $out/lib
|
|
|
|
if test -z "$libsOnly"; then
|
|
# install binaries
|
|
for i in bin/* sbin/prl_nettool sbin/prl_snapshot; do
|
|
install -Dm755 $i $out/$i
|
|
done
|
|
# other binaries
|
|
for i in xorg.7.1/usr/bin/*; do
|
|
cp $i $out/bin
|
|
done
|
|
|
|
for i in $out/bin/* $out/sbin/*; do
|
|
patchelf \
|
|
--interpreter "$(cat $NIX_CC/nix-support/dynamic-linker)" \
|
|
--set-rpath "$out/lib:$libPath" \
|
|
$i
|
|
done
|
|
|
|
mkdir -p $out/bin
|
|
install -Dm755 ../installer/prlfsmountd.sh $out/sbin/prlfsmountd
|
|
wrapProgram $out/sbin/prlfsmountd \
|
|
--prefix PATH ':' "$scriptPath"
|
|
|
|
for i in lib/*.a; do
|
|
cp $i $out/lib
|
|
done
|
|
|
|
for i in xorg.7.1/usr/lib/libprl_wmouse_watcher.*; do
|
|
cp $i $out/lib
|
|
done
|
|
|
|
mkdir -p $out/lib/udev/rules.d
|
|
for i in *.rules; do
|
|
sed 's,/bin/bash,${stdenv.shell},g' $i > $out/lib/udev/rules.d/$i
|
|
done
|
|
|
|
mkdir -p $out/share/autostart
|
|
for i in $desktops; do
|
|
cat $i | sed "s,^Exec=,Exec=$out/bin/," > $out/share/autostart/$(basename $i)
|
|
done
|
|
|
|
(
|
|
cd xorg.${xorgVer}
|
|
# Install the X modules.
|
|
(
|
|
cd x-server/modules
|
|
for i in */*; do
|
|
install -Dm755 $i $out/lib/xorg/modules/$i
|
|
done
|
|
)
|
|
(
|
|
cd usr/lib
|
|
libGLXname=$(echo libglx.so*)
|
|
install -Dm755 $libGLXname $out/lib/xorg/modules/extensions/$libGLXname
|
|
ln -s $libGLXname $out/lib/xorg/modules/extensions/libglx.so
|
|
ln -s $libGLXname $out/lib/xorg/modules/extensions/libglx.so.1
|
|
)
|
|
)
|
|
fi
|
|
|
|
for i in xorg.7.1/usr/lib/libGL.*; do
|
|
cp $i $out/lib
|
|
done
|
|
|
|
cd $out
|
|
find -name \*.so\* -type f -exec \
|
|
patchelf --set-rpath "$out/lib:$libPath" {} \;
|
|
|
|
cd lib
|
|
libGLname=$(echo libGL.so*)
|
|
ln -s $libGLname libGL.so
|
|
ln -s $libGLname libGL.so.1
|
|
)
|
|
'';
|
|
|
|
dontStrip = true;
|
|
dontPatchELF = true;
|
|
|
|
meta = with stdenv.lib; {
|
|
description = "Parallels Tools for Linux guests";
|
|
homepage = http://parallels.com;
|
|
platforms = platforms.linux;
|
|
license = licenses.unfree;
|
|
# I was making this package blindly and requesting testing from the real user,
|
|
# so I can't even test it by myself and won't provide future updates.
|
|
maintainers = with maintainers; [ abbradar ];
|
|
};
|
|
}
|