anvil-editor: init at 0.4
[NixPkgs.git] / pkgs / build-support / xen / default.nix
blobefff9b3045449b0b73049df4526872afe81d1031
2   lib,
3   stdenv,
4   autoPatchelfHook,
5   cmake,
6   pkg-config,
7   testers,
8   which,
9   fetchgit,
11   # Xen
12   acpica-tools,
13   bison,
14   bzip2,
15   dev86,
16   e2fsprogs,
17   flex,
18   libnl,
19   libuuid,
20   lzo,
21   ncurses,
22   ocamlPackages,
23   perl,
24   python3Packages,
25   systemdMinimal,
26   xz,
27   yajl,
28   zlib,
29   zstd,
31   # Optional Components
32   seabios-qemu,
33   systemSeaBIOS ? seabios-qemu,
34   OVMF,
35   ipxe,
36   checkpolicy,
37   binutils-unwrapped-all-targets,
39   # Documentation
40   pandoc,
42   # Scripts
43   bridge-utils,
44   coreutils,
45   diffutils,
46   gawk,
47   gnugrep,
48   gnused,
49   inetutils,
50   iproute2,
51   iptables,
52   multipath-tools,
53   nbd,
54   openvswitch,
55   util-linux,
59   pname,
60   branch ? lib.versions.majorMinor version,
61   version,
62   vendor ? "nixos",
63   upstreamVersion,
64   withFlask ? false,
65   withSeaBIOS ? true,
66   withOVMF ? true,
67   withIPXE ? true,
68   rev,
69   hash,
70   patches ? [ ],
71   meta ? { },
74 let
75   inherit (lib)
76     enableFeature
77     getExe'
78     licenses
79     makeSearchPathOutput
80     optional
81     optionalString
82     optionals
83     systems
84     teams
85     versionOlder
86     warn
87     ;
88   inherit (systems.inspect.patterns) isLinux isAarch64;
89   inherit (licenses)
90     cc-by-40
91     gpl2Only
92     lgpl21Only
93     mit
94     ;
96   # Mark versions older than minSupportedVersion as EOL.
97   minSupportedVersion = "4.16";
99   #TODO: fix paths instead.
100   scriptEnvPath = makeSearchPathOutput "out" "bin" [
101     bridge-utils
102     coreutils
103     diffutils
104     gawk
105     gnugrep
106     gnused
107     inetutils
108     iproute2
109     iptables
110     multipath-tools
111     nbd
112     openvswitch
113     perl
114     util-linux.bin
115     which
116   ];
119 stdenv.mkDerivation (finalAttrs: {
120   inherit pname version patches;
122   outputs = [
123     "out"
124     "man"
125     "doc"
126     "dev"
127     "boot"
128   ];
130   src = fetchgit {
131     url = "https://xenbits.xenproject.org/git-http/xen.git";
132     inherit rev hash;
133   };
135   nativeBuildInputs = [
136     autoPatchelfHook
137     bison
138     cmake
139     flex
140     pandoc
141     pkg-config
142     python3Packages.setuptools
143   ];
144   buildInputs = [
145     # Xen
146     acpica-tools
147     bzip2
148     dev86
149     e2fsprogs.dev
150     libnl
151     libuuid
152     lzo
153     ncurses
154     perl
155     python3Packages.python
156     xz
157     yajl
158     zlib
159     zstd
161     # oxenstored
162     ocamlPackages.findlib
163     ocamlPackages.ocaml
165     # Python Fixes
166     python3Packages.wrapPython
167   ] ++ optional withFlask checkpolicy ++ optional (versionOlder version "4.19") systemdMinimal;
169   configureFlags = [
170     "--enable-systemd"
171     "--disable-qemu-traditional"
172     "--with-system-qemu"
173     (if withSeaBIOS then "--with-system-seabios=${systemSeaBIOS.firmware}" else "--disable-seabios")
174     (if withOVMF then "--with-system-ovmf=${OVMF.firmware}" else "--disable-ovmf")
175     (if withIPXE then "--with-system-ipxe=${ipxe.firmware}" else "--disable-ipxe")
176     (enableFeature withFlask "xsmpolicy")
177   ];
179   makeFlags =
180     [
181       "SUBSYSTEMS=${toString finalAttrs.buildFlags}"
183       "PREFIX=$(out)"
184       "BASH_COMPLETION_DIR=$(PREFIX)/share/bash-completion/completions"
186       "XEN_WHOAMI=${pname}"
187       "XEN_DOMAIN=${vendor}"
189       "GIT=${coreutils}/bin/false"
190       "WGET=${coreutils}/bin/false"
191       "EFI_VENDOR=${vendor}"
192       "INSTALL_EFI_STRIP=1"
193       "LD=${getExe' binutils-unwrapped-all-targets "ld"}"
194     ]
195     # These flags set the CONFIG_* options in /boot/xen.config
196     # and define if the default policy file is built. However,
197     # the Flask binaries always get compiled by default.
198     ++ optionals withFlask [
199       "XSM_ENABLE=y"
200       "FLASK_ENABLE=y"
201     ];
203   buildFlags = [
204     "xen"
205     "tools"
206     "docs"
207   ];
209   enableParallelBuilding = true;
211   env.NIX_CFLAGS_COMPILE = toString [
212     "-Wno-error=maybe-uninitialized"
213     "-Wno-error=array-bounds"
214   ];
216   dontUseCmakeConfigure = true;
218   # Remove in-tree QEMU sources, we don't need them in any circumstance.
219   prePatch = "rm --recursive --force tools/qemu-xen tools/qemu-xen-traditional";
221   postPatch =
222     # The following patch forces Xen to install xen.efi on $out/boot
223     # instead of $out/boot/efi/efi/nixos, as the latter directory
224     # would otherwise need to be created manually. This also creates
225     # a more consistent output for downstreams who override the
226     # vendor attribute above.
227     ''
228       substituteInPlace xen/Makefile \
229         --replace-fail "\$(D)\$(EFI_MOUNTPOINT)/efi/\$(EFI_VENDOR)/\$(T)-\$(XEN_FULLVERSION).efi" \
230                   "\$(D)\$(BOOT_DIR)/\$(T)-\$(XEN_FULLVERSION).efi"
231     ''
233     # The following patch fixes the call to /bin/mkdir on the
234     # launch_xenstore.sh helper script.
235     + ''
236       substituteInPlace tools/hotplug/Linux/launch-xenstore.in \
237         --replace-fail "/bin/mkdir" "${coreutils}/bin/mkdir"
238     ''
240     # The following expression fixes the paths called by Xen's systemd
241     # units, so we can use them in the NixOS module.
242     + ''
243       substituteInPlace \
244         tools/hotplug/Linux/systemd/{xen-init-dom0,xen-qemu-dom0-disk-backend,xenconsoled,xendomains,xenstored}.service.in \
245         --replace-fail /bin/grep ${gnugrep}/bin/grep
246       substituteInPlace \
247        tools/hotplug/Linux/systemd/{xen-qemu-dom0-disk-backend,xenconsoled}.service.in \
248         --replace-fail "/bin/mkdir" "${coreutils}/bin/mkdir"
249     '';
251   installPhase = ''
252     runHook preInstall
254     mkdir --parents $out $out/share $boot
255     cp -prvd dist/install/nix/store/*/* $out/
256     cp -prvd dist/install/etc $out
257     cp -prvd dist/install/boot $boot
259     runHook postInstall
260   '';
262   postInstall =
263     # Wrap xencov_split, xenmon and xentrace_format.
264     ''
265       wrapPythonPrograms
266     ''
268     # We also need to wrap pygrub, which lies in $out/libexec/xen/bin.
269     + ''
270       wrapPythonProgramsIn "$out/libexec/xen/bin" "$out $pythonPath"
271     ''
273     # Fix shebangs in Xen's various scripts.
274     #TODO: Remove any and all usage of `sed` and replace these complicated magic runes with readable code.
275     + ''
276       shopt -s extglob
277       for i in $out/etc/xen/scripts/!(*.sh); do
278         sed --in-place "2s@^@export PATH=$out/bin:${scriptEnvPath}\n@" $i
279       done
280     '';
282   postFixup =
283     ''
284       addAutoPatchelfSearchPath $out/lib
285       autoPatchelf $out/libexec/xen/bin
286     ''
287     # Flask is particularly hard to disable. Even after
288     # setting the make flags to `n`, it still gets compiled.
289     # If withFlask is disabled, delete the extra binaries.
290     + optionalString (!withFlask) ''
291       rm -f $out/bin/flask-*
292     '';
294   passthru = {
295     efi = "boot/xen-${upstreamVersion}.efi";
296     flaskPolicy =
297       if withFlask then
298         warn "This Xen was compiled with FLASK support, but the FLASK file does not match the Xen version number. Please hardcode the path to the FLASK file instead." "boot/xenpolicy-${version}"
299       else
300         throw "This Xen was compiled without FLASK support.";
301     # This test suite is very simple, as Xen's userspace
302     # utilities require the hypervisor to be booted.
303     tests = {
304       pkg-config = testers.hasPkgConfigModules {
305         package = finalAttrs.finalPackage;
306         moduleNames = [
307           "xencall"
308           "xencontrol"
309           "xendevicemodel"
310           "xenevtchn"
311           "xenforeignmemory"
312           "xengnttab"
313           "xenguest"
314           "xenhypfs"
315           "xenlight"
316           "xenstat"
317           "xenstore"
318           "xentoolcore"
319           "xentoollog"
320           "xenvchan"
321           "xlutil"
322         ];
323       };
324     };
325   };
327   meta = {
328     inherit branch;
330     description = "Type-1 hypervisor intended for embedded and hyperscale use cases";
331     longDescription =
332       ''
333         The Xen Project Hypervisor is a virtualisation technology defined as a *type-1
334         hypervisor*, which allows multiple virtual machines, known as domains, to run
335         concurrently with the host on the physical machine. On a typical *type-2
336         hypervisor*, the virtual machines run as applications on top of the
337         host. NixOS runs as the privileged **Domain 0**, and can paravirtualise or fully
338         virtualise **Unprivileged Domains**.
340         Use with the `qemu_xen` package.
341       ''
342       + "\nIncludes:\n* `xen.efi`: The Xen Project's [EFI binary](https://xenbits.xenproject.org/docs/${branch}-testing/misc/efi.html), available on the `boot` output of this package."
343       + optionalString withFlask "\n* `xsm-flask`: The [FLASK Xen Security Module](https://wiki.xenproject.org/wiki/Xen_Security_Modules_:_XSM-FLASK). The `xenpolicy-${upstreamVersion}` file is available on the `boot` output of this package."
344       + optionalString withSeaBIOS "\n* `seabios`: Support for the SeaBIOS boot firmware on HVM domains."
345       + optionalString withOVMF "\n* `ovmf`: Support for the OVMF UEFI boot firmware on HVM domains."
346       + optionalString withIPXE "\n* `ipxe`: Support for the iPXE boot firmware on HVM domains.";
348     homepage = "https://xenproject.org/";
349     downloadPage = "https://downloads.xenproject.org/release/xen/${version}/";
350     changelog = "https://wiki.xenproject.org/wiki/Xen_Project_${branch}_Release_Notes";
352     license = [
353       # Documentation.
354       cc-by-40
355       # Most of Xen is licensed under the GPL v2.0.
356       gpl2Only
357       # Xen Libraries and the `xl` command-line utility.
358       lgpl21Only
359       # Development headers in $dev/include.
360       mit
361     ];
363     maintainers = teams.xen.members;
364     knownVulnerabilities = optional (versionOlder version minSupportedVersion) "The Xen Project Hypervisor version ${version} is no longer supported by the Xen Project Security Team. See https://xenbits.xenproject.org/docs/unstable/support-matrix.html";
366     mainProgram = "xl";
368     platforms = [ isLinux ];
369     badPlatforms = [ isAarch64 ];
370   } // meta;