1{
2 stdenv,
3 kernel,
4 fetchurl,
5 lib,
6 pam,
7 libxslt,
8 libXext,
9 libXcursor,
10 libXmu,
11 glib,
12 libXrandr,
13 dbus,
14 xz,
15 pkg-config,
16 which,
17 xorg,
18 yasm,
19 patchelf,
20 makeself,
21 linuxHeaders,
22 openssl,
23 virtualboxVersion,
24 virtualboxSubVersion,
25 virtualboxSha256,
26}:
27
28let
29 buildType = "release";
30in
31stdenv.mkDerivation (finalAttrs: {
32 pname = "VirtualBox-GuestAdditions-builder-${kernel.version}";
33 version = "${virtualboxVersion}${virtualboxSubVersion}";
34
35 inherit virtualboxVersion virtualboxSubVersion;
36
37 src = fetchurl {
38 url = "https://download.virtualbox.org/virtualbox/${finalAttrs.virtualboxVersion}/VirtualBox-${finalAttrs.virtualboxVersion}${finalAttrs.virtualboxSubVersion}.tar.bz2";
39 sha256 = virtualboxSha256;
40 };
41
42 env.NIX_CFLAGS_COMPILE = "-Wno-error=incompatible-pointer-types -Wno-error=implicit-function-declaration";
43
44 nativeBuildInputs = [
45 patchelf
46 pkg-config
47 which
48 yasm
49 makeself
50 xorg.xorgserver
51 openssl
52 linuxHeaders
53 xz
54 ]
55 ++ kernel.moduleBuildDependencies;
56 buildInputs = [
57 dbus
58 libxslt
59 libXext
60 libXcursor
61 pam
62 libXmu
63 libXrandr
64 ];
65
66 KERN_DIR = "${kernel.dev}/lib/modules/${kernel.modDirVersion}/build";
67 KERN_INCL = "${kernel.dev}/lib/modules/${kernel.modDirVersion}/source/include";
68
69 prePatch = ''
70 rm -r src/VBox/Additions/x11/x11include/
71 rm -r src/VBox/Additions/3D/mesa/mesa-*/
72 rm -r src/libs/openssl-*/
73 rm -r src/libs/curl-*/
74 rm -r src/libs/libpng-*/
75 rm -r src/libs/libxml2-*/
76 rm -r src/libs/liblzma-*/
77 rm -r src/libs/zlib*/
78 '';
79
80 postPatch = ''
81 set -x
82 sed -e 's@MKISOFS --version@MKISOFS -version@' \
83 -e 's@CXX_FLAGS="\(.*\)"@CXX_FLAGS="-std=c++17 \1"@' \
84 -i configure
85 ls kBuild/bin/linux.x86/k* tools/linux.x86/bin/* | xargs -n 1 patchelf --set-interpreter ${stdenv.cc.libc}/lib/ld-linux.so.2
86 ls kBuild/bin/linux.amd64/k* tools/linux.amd64/bin/* | xargs -n 1 patchelf --set-interpreter ${stdenv.cc.libc}/lib/ld-linux-x86-64.so.2
87
88 substituteInPlace ./include/VBox/dbus-calls.h --replace-fail libdbus-1.so.3 ${dbus.lib}/lib/libdbus-1.so.3
89
90 substituteInPlace ./src/VBox/Additions/common/VBoxGuest/lib/VBoxGuestR3LibDrmClient.cpp --replace-fail /usr/bin/VBoxDRMClient /run/current-system/sw/bin/VBoxDRMClient
91 substituteInPlace ./src/VBox/Additions/common/VBoxGuest/lib/VBoxGuestR3LibDrmClient.cpp --replace-fail /usr/bin/VBoxClient /run/current-system/sw/bin/VBoxClient
92 substituteInPlace ./src/VBox/Additions/x11/VBoxClient/display.cpp --replace-fail /usr/X11/bin/xrandr ${xorg.xrandr}/bin/xrandr
93 substituteInPlace ./src/VBox/Additions/x11/vboxvideo/Makefile.kmk --replace-fail /usr/include/xorg "${xorg.xorgserver.dev}/include/xorg "
94 '';
95
96 configurePhase = ''
97 NIX_CFLAGS_COMPILE=$(echo "$NIX_CFLAGS_COMPILE" | sed 's,\-isystem ${lib.getDev stdenv.cc.libc}/include,,g')
98
99 cat >> LocalConfig.kmk <<LOCAL_CONFIG
100 VBOX_WITH_TESTCASES :=
101 VBOX_WITH_TESTSUITE :=
102 VBOX_WITH_VALIDATIONKIT :=
103 VBOX_WITH_DOCS :=
104 VBOX_WITH_WARNINGS_AS_ERRORS :=
105
106 VBOX_WITH_ORIGIN :=
107 VBOX_PATH_APP_PRIVATE_ARCH_TOP := $out/share/virtualbox
108 VBOX_PATH_APP_PRIVATE_ARCH := $out/libexec/virtualbox
109 VBOX_PATH_SHARED_LIBS := $out/libexec/virtualbox
110 VBOX_WITH_RUNPATH := $out/libexec/virtualbox
111 VBOX_PATH_APP_PRIVATE := $out/share/virtualbox
112 VBOX_PATH_APP_DOCS := $out/doc
113
114 VBOX_USE_SYSTEM_XORG_HEADERS := 1
115 VBOX_USE_SYSTEM_GL_HEADERS := 1
116 VBOX_NO_LEGACY_XORG_X11 := 1
117 SDK_VBoxLibPng_INCS :=
118 SDK_VBoxLibXml2_INCS :=
119 SDK_VBoxLibLzma_INCS := ${xz.dev}/include
120 SDK_VBoxLibLzma_LIBS := ${xz.out}/lib
121
122 SDK_VBoxOpenSslStatic_INCS := ${openssl.dev}/include/ssl
123
124 VBOX_ONLY_ADDITIONS := 1
125 VBOX_WITH_SHARED_CLIPBOARD := 1
126 VBOX_WITH_GUEST_PROPS := 1
127 VBOX_WITH_VMSVGA := 1
128 VBOX_WITH_SHARED_FOLDERS := 1
129 VBOX_WITH_GUEST_CONTROL := 1
130 VBOX_WITHOUT_LINUX_GUEST_PACKAGE := 1
131 VBOX_WITH_PAM :=
132 VBOX_WITH_UPDATE_AGENT :=
133 VBOX_WITH_AUDIO_ALSA :=
134 VBOX_WITH_AUDIO_PULSE :=
135
136 VBOX_BUILD_PUBLISHER := _NixOS
137 LOCAL_CONFIG
138
139 ./configure \
140 --only-additions \
141 --with-linux=${kernel.dev} \
142 --disable-kmods
143
144 sed -e 's@PKG_CONFIG_PATH=.*@PKG_CONFIG_PATH=${glib.dev}/lib/pkgconfig @' \
145 -i AutoConfig.kmk
146 sed -e 's@arch/x86/@@' \
147 -i Config.kmk
148
149 export USER=nix
150 set +x
151 '';
152
153 enableParallelBuilding = true;
154
155 buildPhase = ''
156 runHook preBuild
157
158 source env.sh
159 VBOX_ONLY_ADDITIONS=1 VBOX_ONLY_BUILD=1 kmk -j $NIX_BUILD_CORES BUILD_TYPE="${buildType}"
160 VBOX_ONLY_ADDITIONS=1 VBOX_ONLY_BUILD=1 kmk packing
161
162 runHook postBuild
163 '';
164
165 installPhase = ''
166 runHook preInstall
167
168 mkdir -p $out
169 cp -rv ./out/linux.${
170 if stdenv.hostPlatform.is32bit then "x86" else "amd64"
171 }/${buildType}/bin/additions/VBoxGuestAdditions-${
172 if stdenv.hostPlatform.is32bit then "x86" else "amd64"
173 }.tar.bz2 $out/
174
175 runHook postInstall
176 '';
177})