1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
|
{ stdenv
, lib
, buildFHSEnvChroot
, copyDesktopItems
, fetchurl
, gsettings-desktop-schemas
, makeDesktopItem
, makeWrapper
, opensc
, writeTextDir
, configText ? ""
}:
let
version = "2312";
sysArch =
if stdenv.hostPlatform.system == "x86_64-linux" then "x64"
else throw "Unsupported system: ${stdenv.hostPlatform.system}";
# The downloaded archive also contains ARM binaries, but these have not been tested.
# For USB support, ensure that /var/run/vmware/<YOUR-UID>
# exists and is owned by you. Then run vmware-usbarbitrator as root.
mainProgram = "vmware-view";
# This forces the default GTK theme (Adwaita) because Horizon is prone to
# UI usability issues when using non-default themes, such as Adwaita-dark.
wrapBinCommands = path: name: ''
makeWrapper "$out/${path}/${name}" "$out/bin/${name}_wrapper" \
--set GTK_THEME Adwaita \
--suffix XDG_DATA_DIRS : "${gsettings-desktop-schemas}/share/gsettings-schemas/${gsettings-desktop-schemas.name}" \
--suffix LD_LIBRARY_PATH : "$out/lib/vmware/view/crtbora:$out/lib/vmware"
'';
vmwareHorizonClientFiles = stdenv.mkDerivation {
pname = "vmware-horizon-files";
inherit version;
src = fetchurl {
url = "https://download3.vmware.com/software/CART24FQ4_LIN_2312_TARBALL/VMware-Horizon-Client-Linux-2312-8.12.0-23149323.tar.gz";
sha256 = "15ca1d6028b9ca88e23fa363a2942fd76456c19e95ced4734595c3dc44db38d8";
};
nativeBuildInputs = [ makeWrapper ];
installPhase = ''
mkdir ext
find ${sysArch} -type f -print0 | xargs -0n1 tar -Cext --strip-components=1 -xf
chmod -R u+w ext/usr/lib
mv ext/usr $out
cp -r ext/lib $out/
# Horizon includes a copy of libstdc++ which is loaded via $LD_LIBRARY_PATH
# when it cannot detect a new enough version already present on the system.
# The checks are distribution-specific and do not function correctly on NixOS.
# Deleting the bundled library is the simplest way to force it to use our version.
rm "$out/lib/vmware/gcc/libstdc++.so.6"
# This opensc library is required to support smartcard authentication during the
# initial connection to Horizon.
mkdir $out/lib/vmware/view/pkcs11
ln -s ${opensc}/lib/pkcs11/opensc-pkcs11.so $out/lib/vmware/view/pkcs11/libopenscpkcs11.so
${wrapBinCommands "bin" "vmware-view"}
${wrapBinCommands "lib/vmware/view/usb" "vmware-usbarbitrator"}
'';
};
vmwareFHSUserEnv = name: buildFHSEnvChroot {
inherit name;
runScript = "${vmwareHorizonClientFiles}/bin/${name}_wrapper";
targetPkgs = pkgs: with pkgs; [
at-spi2-atk
atk
cairo
dbus
file
fontconfig
freetype
gdk-pixbuf
glib
gtk2
gtk3-x11
harfbuzz
liberation_ttf
libjpeg
libpulseaudio
libtiff
libudev0-shim
libuuid
libv4l
libxml2
pango
pcsclite
pixman
vmwareHorizonClientFiles
xorg.libX11
xorg.libXau
xorg.libXcursor
xorg.libXext
xorg.libXi
xorg.libXinerama
xorg.libxkbfile
xorg.libXrandr
xorg.libXrender
xorg.libXScrnSaver
xorg.libXtst
zlib
(writeTextDir "etc/vmware/config" configText)
];
};
desktopItem = makeDesktopItem {
name = "vmware-view";
desktopName = "VMware Horizon Client";
icon = "${vmwareHorizonClientFiles}/share/icons/vmware-view.png";
exec = "${vmwareFHSUserEnv mainProgram}/bin/${mainProgram} %u";
mimeTypes = [ "x-scheme-handler/vmware-view" ];
};
in
stdenv.mkDerivation {
pname = "vmware-horizon-client";
inherit version;
dontUnpack = true;
nativeBuildInputs = [ copyDesktopItems ];
desktopItems = [ desktopItem ];
installPhase = ''
runHook preInstall
mkdir -p $out/bin
ln -s ${vmwareFHSUserEnv "vmware-view"}/bin/vmware-view $out/bin/
ln -s ${vmwareFHSUserEnv "vmware-usbarbitrator"}/bin/vmware-usbarbitrator $out/bin/
runHook postInstall
'';
unwrapped = vmwareHorizonClientFiles;
passthru.updateScript = ./update.sh;
meta = with lib; {
inherit mainProgram;
description = "Allows you to connect to your VMware Horizon virtual desktop";
homepage = "https://www.vmware.com/go/viewclients";
license = licenses.unfree;
platforms = [ "x86_64-linux" ];
maintainers = with maintainers; [ buckley310 ];
};
}
|