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
|
{ lib
, stdenv
, fetchFromGitHub
, nixosTests
# Dependencies
, bzip2
, cmake
, freetype
, libGL
, libjpeg_turbo
, makeWrapper
, mesa # for built-in 3D software rendering using swrast
, openjdk # for the client with Java GUI
, openjdk_headless # for the server
, openssh
, openssl
, pam
, perl
, python3
, which
, xkbcomp
, xkeyboard_config
, xorg
, xterm
, zlib
}:
stdenv.mkDerivation rec {
pname = "turbovnc";
version = "3.0";
src = fetchFromGitHub {
owner = "TurboVNC";
repo = "turbovnc";
rev = version;
sha256 = "sha256-4/pfKb89ld32LvqTXjVpIJUCCDA+D7CLYMNFYytKVIE=";
};
# TODO:
# * Build outputs that are unclear:
# * `-- FONT_ENCODINGS_DIRECTORY = /var/empty/share/X11/fonts/encodings`
# Maybe relevant what the tigervnc and tightvnc derivations
# do with their `fontDirectories`?
# * `SERVER_MISC_CONFIG_PATH = /var/empty/lib64/xorg`
# * The thing about xorg `protocol.txt`
# * Does SSH support require `openssh` on PATH?
# * Add `enableClient ? true` flag that disables the client GUI
# so that the server can be built without openjdk dependency.
# * Perhaps allow to build the client on non-Linux platforms.
nativeBuildInputs = [
cmake
makeWrapper
openjdk_headless
python3
];
buildInputs = [
bzip2
freetype
libGL # for -DTVNC_SYSTEMX11=1
libjpeg_turbo
openssl
pam
perl
zlib
] ++ (with xorg; [
libfontenc # for -DTVNC_SYSTEMX11=1
libSM
libX11
libXdamage # for -DTVNC_SYSTEMX11=1
libXdmcp # for -DTVNC_SYSTEMX11=1
libXext
libXfont2 # for -DTVNC_SYSTEMX11=1
libxkbfile # for -DTVNC_SYSTEMX11=1
libXi
mesa # for -DTVNC_SYSTEMX11=1
pixman # for -DTVNC_SYSTEMX11=1
xorgproto
xtrans # for -DTVNC_SYSTEMX11=1
]);
postPatch = ''
substituteInPlace unix/Xvnc/CMakeLists.txt --replace 'string(REGEX REPLACE "X11" "Xfont2" X11_Xfont2_LIB' 'set(X11_Xfont2_LIB ${xorg.libXfont2}/lib/libXfont2.so) #'
substituteInPlace unix/Xvnc/CMakeLists.txt --replace 'string(REGEX REPLACE "X11" "fontenc" X11_Fontenc_LIB' 'set(X11_Fontenc_LIB ${xorg.libfontenc}/lib/libfontenc.so) #'
substituteInPlace unix/Xvnc/CMakeLists.txt --replace 'string(REGEX REPLACE "X11" "pixman-1" X11_Pixman_LIB' 'set(X11_Pixman_LIB ${xorg.pixman}/lib/libpixman-1.so) #'
'';
cmakeFlags = [
# For the 3D software rendering built into TurboVNC, pass the path
# to the swrast dri driver in Mesa.
# Can also be given at runtime to its `Xvnc` as:
# -dridir /nix/store/...-mesa-20.1.10-drivers/lib/dri/
"-DDRI_DRIVER_PATH=${mesa.drivers}/lib/dri"
# The build system doesn't find these files automatically.
"-DTJPEG_JAR=${libjpeg_turbo.out}/share/java/turbojpeg.jar"
"-DTJPEG_JNILIBRARY=${libjpeg_turbo.out}/lib/libturbojpeg.so"
"-DXKB_BASE_DIRECTORY=${xkeyboard_config}/share/X11/xkb"
"-DXKB_BIN_DIRECTORY=${xkbcomp}/bin"
# use system libs
"-DTVNC_SYSTEMLIBS=1"
"-DTVNC_SYSTEMX11=1"
"-DTVNC_DLOPENSSL=0"
];
postInstall = ''
# turbovnc dlopen()s libssl.so depending on the requested encryption.
wrapProgram $out/bin/Xvnc \
--prefix LD_LIBRARY_PATH : ${lib.makeLibraryPath [ openssl ]}
# `twm` is the default window manager that `vncserver` tries to start,
# and it has minimal dependencies (no non-Xorg).
# (This default is written by `vncserver` to `~/.vnc/xstartup.turbovnc`,
# see https://github.com/TurboVNC/turbovnc/blob/ffdb57d9/unix/vncserver.in#L201.)
# It checks for it using `which twm`.
# vncserver needs also needs `xauth` and we add in `xterm` for convenience
wrapProgram $out/bin/vncserver \
--prefix PATH : ${lib.makeBinPath [ which xorg.twm xorg.xauth xterm ]}
# Patch /usr/bin/perl
patchShebangs $out/bin/vncserver
# The viewer is in Java and requires `JAVA_HOME` (which is a single
# path, cannot be multiple separated paths).
# For SSH support, `ssh` is required on `PATH`.
wrapProgram $out/bin/vncviewer \
--set JAVA_HOME "${lib.makeLibraryPath [ openjdk ]}/openjdk" \
--prefix PATH : ${lib.makeBinPath [ openssh ]}
'';
passthru.tests.turbovnc-headless-server = nixosTests.turbovnc-headless-server;
meta = {
homepage = "https://turbovnc.org/";
license = lib.licenses.gpl2Plus;
description = "High-speed version of VNC derived from TightVNC";
maintainers = with lib.maintainers; [ nh2 ];
platforms = with lib.platforms; linux;
};
}
|