nixpkgs/pkgs/development/libraries/libvirt/default.nix

Ignoring revisions in .git-blame-ignore-revs. Click here to bypass and see the normal blame view.

387 lines
10 KiB
Nix
Raw Normal View History

2021-09-05 03:06:15 +00:00
{ lib
, bash
2022-03-14 07:33:21 +00:00
, bash-completion
, bridge-utils
2021-09-05 03:06:15 +00:00
, coreutils
2022-03-14 07:33:21 +00:00
, curl
, darwin
, dbus
, dnsmasq
, docutils
2022-03-14 07:33:21 +00:00
, fetchFromGitLab
, gettext
2022-03-14 07:33:21 +00:00
, glib
, gnutls
, iproute2
2021-09-05 03:06:15 +00:00
, iptables
, libgcrypt
, libpcap
2022-03-14 07:33:21 +00:00
, libtasn1
, libxml2
2021-09-05 03:06:15 +00:00
, libxslt
2022-03-14 07:33:21 +00:00
, makeWrapper
2021-09-05 03:06:15 +00:00
, meson
, ninja
, openssh
2022-03-14 07:33:21 +00:00
, perl
, perlPackages
, polkit
2021-09-05 03:06:15 +00:00
, pkg-config
2022-03-14 07:33:21 +00:00
, pmutils
, python3
, readline
, rpcsvc-proto
, stdenv
, substituteAll
2022-03-14 07:33:21 +00:00
, xhtml1
, yajl
2022-04-27 12:00:53 +00:00
, writeScript
2022-08-22 03:17:06 +00:00
, nixosTests
2022-03-14 07:33:21 +00:00
# Linux
, acl ? null
, attr ? null
, audit ? null
, dmidecode ? null
2023-01-17 07:14:00 +00:00
, fuse3 ? null
2022-03-14 07:33:21 +00:00
, kmod ? null
, libapparmor ? null
, libcap_ng ? null
, libnl ? null
, libpciaccess ? null
, libtirpc ? null
, lvm2 ? null
, numactl ? null
, numad ? null
, parted ? null
, systemd ? null
, util-linux ? null
# Darwin
, gmp
, libiconv
, qemu
, Carbon
, AppKit
2022-03-14 07:33:21 +00:00
# Options
, enableCeph ? false
, ceph
, enableGlusterfs ? false
, glusterfs
2022-03-14 07:33:21 +00:00
, enableIscsi ? false
, openiscsi
, libiscsi
2022-03-14 07:33:21 +00:00
, enableXen ? false
, xen
2022-03-14 07:33:21 +00:00
, enableZfs ? stdenv.isLinux
, zfs
}:
2017-03-23 20:26:37 +00:00
2018-02-26 22:50:46 +00:00
let
2022-03-14 07:33:21 +00:00
inherit (stdenv) isDarwin isLinux isx86_64;
binPath = lib.makeBinPath ([
2022-03-14 07:33:21 +00:00
dnsmasq
] ++ lib.optionals isLinux [
2022-03-14 07:33:21 +00:00
bridge-utils
dmidecode
dnsmasq
iproute2
iptables
kmod
lvm2
numactl
numad
openssh
2022-03-14 07:33:21 +00:00
pmutils
systemd
] ++ lib.optionals enableIscsi [
2022-03-14 07:33:21 +00:00
libiscsi
openiscsi
] ++ lib.optionals enableZfs [
zfs
2022-03-14 07:33:21 +00:00
]);
2021-09-05 03:06:15 +00:00
in
2022-03-14 07:33:21 +00:00
assert enableXen -> isLinux && isx86_64;
assert enableCeph -> isLinux;
assert enableGlusterfs -> isLinux;
assert enableZfs -> isLinux;
# if you update, also bump <nixpkgs/pkgs/development/python-modules/libvirt/default.nix> and SysVirt in <nixpkgs/pkgs/top-level/perl-packages.nix>
2021-09-05 03:06:15 +00:00
stdenv.mkDerivation rec {
pname = "libvirt";
2022-03-14 07:33:21 +00:00
# NOTE: You must also bump:
# <nixpkgs/pkgs/development/python-modules/libvirt/default.nix>
# SysVirt in <nixpkgs/pkgs/top-level/perl-packages.nix>
2023-04-10 01:57:03 +00:00
version = "9.2.0";
2022-04-27 11:58:33 +00:00
src = fetchFromGitLab {
owner = pname;
repo = pname;
rev = "v${version}";
2023-04-10 01:57:03 +00:00
sha256 = "sha256-uASIfQVbY/5I/PELEB6EGzzHfcgY4jIolbyH05TgiLA=";
2022-04-27 11:58:33 +00:00
fetchSubmodules = true;
};
patches = [
./0001-meson-patch-in-an-install-prefix-for-building-on-nix.patch
] ++ lib.optionals enableZfs [
(substituteAll {
src = ./0002-substitute-zfs-and-zpool-commands.patch;
zfs = "${zfs}/bin/zfs";
zpool = "${zfs}/bin/zpool";
})
];
2022-03-14 07:33:21 +00:00
# remove some broken tests
postPatch = ''
sed -i '/commandtest/d' tests/meson.build
sed -i '/virnetsockettest/d' tests/meson.build
# delete only the first occurrence of this
sed -i '0,/qemuxml2argvtest/{/qemuxml2argvtest/d;}' tests/meson.build
2023-05-22 14:02:49 +00:00
'' + lib.optionalString isLinux ''
for binary in mount umount mkfs; do
substituteInPlace meson.build \
--replace "find_program('$binary'" "find_program('${lib.getBin util-linux}/bin/$binary'"
done
2023-05-22 14:02:49 +00:00
'' + ''
substituteInPlace meson.build \
--replace "'dbus-daemon'," "'${lib.getBin dbus}/bin/dbus-daemon',"
'' + lib.optionalString isLinux ''
sed -i 's,define PARTED "parted",define PARTED "${parted}/bin/parted",' \
src/storage/storage_backend_disk.c \
src/storage/storage_util.c
'' + lib.optionalString isDarwin ''
2022-03-14 17:12:12 +00:00
sed -i '/qemucapabilitiestest/d' tests/meson.build
2022-08-02 23:56:44 +00:00
sed -i '/vircryptotest/d' tests/meson.build
sed -i '/domaincapstest/d' tests/meson.build
sed -i '/qemufirmwaretest/d' tests/meson.build
sed -i '/qemuvhostusertest/d' tests/meson.build
2023-04-11 13:10:21 +00:00
sed -i '/qemuxml2xmltest/d' tests/meson.build
'' + lib.optionalString (isDarwin && isx86_64) ''
2022-08-06 10:01:58 +00:00
sed -i '/qemucaps2xmltest/d' tests/meson.build
sed -i '/qemuhotplugtest/d' tests/meson.build
sed -i '/virnetdaemontest/d' tests/meson.build
2022-03-14 07:33:21 +00:00
'';
2022-09-08 19:56:44 +00:00
strictDeps = true;
nativeBuildInputs = [
meson
2022-03-14 07:33:21 +00:00
docutils
2022-09-08 19:56:44 +00:00
libxml2 # for xmllint
libxslt # for xsltproc
gettext
2021-09-05 03:06:15 +00:00
makeWrapper
2022-03-14 07:33:21 +00:00
ninja
2021-09-05 03:06:15 +00:00
pkg-config
perl
perlPackages.XMLXPath
2022-03-14 07:33:21 +00:00
]
++ lib.optional (!isDarwin) rpcsvc-proto
2022-03-14 07:33:21 +00:00
# NOTE: needed for rpcgen
++ lib.optional isDarwin darwin.developer_cmds;
2020-08-17 17:50:54 +00:00
buildInputs = [
bash
2021-09-05 03:06:15 +00:00
bash-completion
2022-03-14 07:33:21 +00:00
curl
dbus
glib
gnutls
2022-03-14 07:33:21 +00:00
libgcrypt
libpcap
libtasn1
libxml2
2021-09-05 03:06:15 +00:00
python3
readline
xhtml1
2022-03-14 07:33:21 +00:00
yajl
] ++ lib.optionals isLinux [
2022-03-14 07:33:21 +00:00
acl
attr
2021-09-05 03:06:15 +00:00
audit
2023-01-17 07:14:00 +00:00
fuse3
libapparmor
libcap_ng
2022-03-14 07:33:21 +00:00
libnl
libpciaccess
libtirpc
lvm2
numactl
2022-03-14 07:33:21 +00:00
numad
2021-09-05 03:06:15 +00:00
parted
2022-03-14 07:33:21 +00:00
systemd
util-linux
] ++ lib.optionals isDarwin [
AppKit
2022-03-14 07:33:21 +00:00
Carbon
gmp
libiconv
]
++ lib.optionals enableCeph [ ceph ]
++ lib.optionals enableGlusterfs [ glusterfs ]
++ lib.optionals enableIscsi [ libiscsi openiscsi ]
++ lib.optionals enableXen [ xen ]
++ lib.optionals enableZfs [ zfs ];
2021-09-05 03:06:15 +00:00
preConfigure =
let
overrides = {
QEMU_BRIDGE_HELPER = "/run/wrappers/bin/qemu-bridge-helper";
QEMU_PR_HELPER = "/run/libvirt/nix-helpers/qemu-pr-helper";
};
2022-03-14 07:33:21 +00:00
2021-09-05 03:06:15 +00:00
patchBuilder = var: value: ''
sed -i meson.build -e "s|conf.set_quoted('${var}',.*|conf.set_quoted('${var}','${value}')|"
'';
in
''
2022-03-14 07:33:21 +00:00
PATH="${binPath}:$PATH"
2021-09-05 03:06:15 +00:00
# the path to qemu-kvm will be stored in VM's .xml and .save files
# do not use "''${qemu_kvm}/bin/qemu-kvm" to avoid bound VMs to particular qemu derivations
substituteInPlace src/lxc/lxc_conf.c \
--replace 'lxc_path,' '"/run/libvirt/nix-emulators/libvirt_lxc",'
2022-03-14 07:33:21 +00:00
2021-09-13 04:20:00 +00:00
substituteInPlace build-aux/meson.build \
--replace "gsed" "sed" \
--replace "gmake" "make" \
--replace "ggrep" "grep"
2022-03-14 07:33:21 +00:00
substituteInPlace src/util/virpolkit.h \
2022-08-02 23:56:44 +00:00
--replace '"/usr/bin/pkttyagent"' '"${if isLinux then polkit.bin else "/usr"}/bin/pkttyagent"'
2021-09-05 03:06:15 +00:00
patchShebangs .
''
+ (lib.concatStringsSep "\n" (lib.mapAttrsToList patchBuilder overrides));
2022-03-14 17:12:12 +00:00
mesonAutoFeatures = "disabled";
2021-09-05 03:06:15 +00:00
mesonFlags =
let
2022-03-14 07:33:21 +00:00
cfg = option: val: "-D${option}=${val}";
feat = option: enable: cfg option (if enable then "enabled" else "disabled");
driver = name: feat "driver_${name}";
storage = name: feat "storage_${name}";
2021-09-05 03:06:15 +00:00
in
[
"--sysconfdir=/var/lib"
2022-03-14 07:33:21 +00:00
(cfg "install_prefix" (placeholder "out"))
(cfg "localstatedir" "/var")
(cfg "runstatedir" "/run")
(cfg "init_script" (if isDarwin then "none" else "systemd"))
2023-02-06 20:49:02 +00:00
(cfg "qemu_datadir" (lib.optionalString isDarwin "${qemu}/share/qemu"))
2022-03-14 07:33:21 +00:00
(feat "apparmor" isLinux)
(feat "attr" isLinux)
(feat "audit" isLinux)
(feat "bash_completion" true)
(feat "blkid" isLinux)
(feat "capng" isLinux)
(feat "curl" true)
(feat "docs" true)
(feat "expensive_tests" true)
(feat "firewalld" isLinux)
(feat "firewalld_zone" isLinux)
(feat "fuse" isLinux)
(feat "glusterfs" enableGlusterfs)
(feat "host_validate" true)
(feat "libiscsi" enableIscsi)
(feat "libnl" isLinux)
(feat "libpcap" true)
(feat "libssh2" true)
(feat "login_shell" isLinux)
2023-02-18 23:06:36 +00:00
(feat "nss" (isLinux && !stdenv.hostPlatform.isMusl))
2022-03-14 07:33:21 +00:00
(feat "numactl" isLinux)
(feat "numad" isLinux)
(feat "pciaccess" isLinux)
2022-08-02 23:56:44 +00:00
(feat "polkit" isLinux)
2022-03-14 07:33:21 +00:00
(feat "readline" true)
(feat "secdriver_apparmor" isLinux)
(feat "tests" true)
(feat "udev" isLinux)
(feat "yajl" true)
(driver "ch" isLinux)
(driver "esx" true)
(driver "interface" isLinux)
(driver "libvirtd" true)
(driver "libxl" enableXen)
(driver "lxc" isLinux)
(driver "network" true)
(driver "openvz" isLinux)
(driver "qemu" true)
(driver "remote" true)
(driver "secrets" true)
(driver "test" true)
(driver "vbox" true)
(driver "vmware" true)
(storage "dir" true)
(storage "disk" isLinux)
(storage "fs" isLinux)
(storage "gluster" enableGlusterfs)
(storage "iscsi" enableIscsi)
(storage "iscsi_direct" enableIscsi)
(storage "lvm" isLinux)
(storage "mpath" isLinux)
(storage "rbd" enableCeph)
(storage "scsi" true)
(storage "vstorage" isLinux)
(storage "zfs" enableZfs)
2022-03-11 23:24:01 +00:00
];
2022-03-14 07:33:21 +00:00
doCheck = true;
postInstall = ''
substituteInPlace $out/bin/virt-xml-validate \
--replace xmllint ${libxml2}/bin/xmllint
substituteInPlace $out/libexec/libvirt-guests.sh \
--replace 'ON_BOOT="start"' 'ON_BOOT=''${ON_BOOT:-start}' \
--replace 'ON_SHUTDOWN="suspend"' 'ON_SHUTDOWN=''${ON_SHUTDOWN:-suspend}' \
--replace 'PARALLEL_SHUTDOWN=0' 'PARALLEL_SHUTDOWN=''${PARALLEL_SHUTDOWN:-0}' \
2022-03-14 07:33:21 +00:00
--replace "$out/bin" '${gettext}/bin' \
--replace 'lock/subsys' 'lock' \
--replace 'gettext.sh' 'gettext.sh
# Added in nixpkgs:
gettext() { "${gettext}/bin/gettext" "$@"; }
'
'' + lib.optionalString isLinux ''
for f in $out/lib/systemd/system/*.service ; do
substituteInPlace $f --replace /bin/kill ${coreutils}/bin/kill
done
2022-03-14 07:33:21 +00:00
rm $out/lib/systemd/system/{virtlockd,virtlogd}.*
wrapProgram $out/sbin/libvirtd \
--prefix PATH : /run/libvirt/nix-emulators:${binPath}
'';
2022-04-27 12:00:53 +00:00
passthru.updateScript = writeScript "update-libvirt" ''
#!/usr/bin/env nix-shell
#!nix-shell -i bash -p curl jq common-updater-scripts
set -eu -o pipefail
libvirtVersion=$(curl https://gitlab.com/api/v4/projects/192693/repository/tags | jq -r '.[].name|select(. | contains("rc") | not)' | head -n1 | sed "s/v//g")
sysvirtVersion=$(curl https://gitlab.com/api/v4/projects/192677/repository/tags | jq -r '.[].name|select(. | contains("rc") | not)' | head -n1 | sed "s/v//g")
update-source-version ${pname} "$libvirtVersion"
update-source-version python3Packages.${pname} "$libvirtVersion"
update-source-version perlPackages.SysVirt "$sysvirtVersion" --file="pkgs/top-level/perl-packages.nix"
'';
2022-08-22 03:17:06 +00:00
passthru.tests.libvirtd = nixosTests.libvirtd;
meta = with lib; {
description = "A toolkit to interact with the virtualization capabilities of recent versions of Linux and other OSes";
2022-12-03 04:20:00 +00:00
homepage = "https://libvirt.org/";
changelog = "https://gitlab.com/libvirt/libvirt/-/raw/v${version}/NEWS.rst";
license = licenses.lgpl2Plus;
platforms = platforms.unix;
2022-03-14 07:33:21 +00:00
maintainers = with maintainers; [ fpletz globin lovesegfault ];
};
}