Merge pull request #164078 from lovesegfault/libvirt-refactor

libvirt: refactor
This commit is contained in:
Bernardo Meurer 2022-03-14 10:11:03 -07:00 committed by GitHub
commit f7353740ed
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 273 additions and 181 deletions

View file

@ -1,4 +1,4 @@
From a896b0be849455edb83a9305dfec9b41447ef3e4 Mon Sep 17 00:00:00 2001
From a6593bf70dd5f91acc7c2795d658a49eb9d4f672 Mon Sep 17 00:00:00 2001
From: Euan Kemp <euank@euank.com>
Date: Thu, 14 Jan 2021 00:32:00 -0800
Subject: [PATCH] meson: patch in an install prefix for building on nix
@ -8,20 +8,21 @@ the nix store, but read them from the root filesystem.
---
meson.build | 9 +++++++++
meson_options.txt | 2 ++
src/ch/meson.build | 4 ++--
src/libxl/meson.build | 6 +++---
src/locking/meson.build | 8 ++++----
src/lxc/meson.build | 6 +++---
src/meson.build | 18 +++++++++---------
src/network/meson.build | 12 ++++++------
src/network/meson.build | 10 +++++-----
src/nwfilter/xml/meson.build | 2 +-
src/qemu/meson.build | 14 +++++++-------
src/remote/meson.build | 6 +++---
src/security/apparmor/meson.build | 8 ++++----
tools/meson.build | 4 ++--
12 files changed, 53 insertions(+), 42 deletions(-)
13 files changed, 54 insertions(+), 43 deletions(-)
diff --git a/meson.build b/meson.build
index b5164f6..33719f1 100644
index ad0cd44aca..bdd87c926a 100644
--- a/meson.build
+++ b/meson.build
@@ -39,6 +39,8 @@ if host_machine.system() == 'windows'
@ -48,7 +49,7 @@ index b5164f6..33719f1 100644
# sysconfdir as this makes a lot of things break in testing situations
if prefix == '/usr'
diff --git a/meson_options.txt b/meson_options.txt
index e5d79c2..081cd32 100644
index 5b43cdbd6b..e9dff18441 100644
--- a/meson_options.txt
+++ b/meson_options.txt
@@ -1,3 +1,5 @@
@ -57,8 +58,22 @@ index e5d79c2..081cd32 100644
option('no_git', type: 'boolean', value: false, description: 'Disable git submodule update')
option('packager', type: 'string', value: '', description: 'Extra packager name')
option('packager_version', type: 'string', value: '', description: 'Extra packager version')
diff --git a/src/ch/meson.build b/src/ch/meson.build
index e34974d56c..4767763c2c 100644
--- a/src/ch/meson.build
+++ b/src/ch/meson.build
@@ -68,7 +68,7 @@ if conf.has('WITH_CH')
}
virt_install_dirs += [
- localstatedir / 'lib' / 'libvirt' / 'ch',
- runstatedir / 'libvirt' / 'ch',
+ install_prefix + localstatedir / 'lib' / 'libvirt' / 'ch',
+ install_prefix + runstatedir / 'libvirt' / 'ch',
]
endif
diff --git a/src/libxl/meson.build b/src/libxl/meson.build
index 3bb6cc5..78d7be0 100644
index 9793899106..4904387162 100644
--- a/src/libxl/meson.build
+++ b/src/libxl/meson.build
@@ -84,8 +84,8 @@ if conf.has('WITH_LIBXL')
@ -74,7 +89,7 @@ index 3bb6cc5..78d7be0 100644
]
endif
diff --git a/src/locking/meson.build b/src/locking/meson.build
index 8a28310..9da81cc 100644
index 184d3c3f56..7ffd3740e3 100644
--- a/src/locking/meson.build
+++ b/src/locking/meson.build
@@ -243,14 +243,14 @@ if conf.has('WITH_LIBVIRTD')
@ -97,10 +112,10 @@ index 8a28310..9da81cc 100644
endif
endif
diff --git a/src/lxc/meson.build b/src/lxc/meson.build
index f8e2a88..96d6687 100644
index ad5c659dba..8010dfbf02 100644
--- a/src/lxc/meson.build
+++ b/src/lxc/meson.build
@@ -182,8 +182,8 @@ if conf.has('WITH_LXC')
@@ -181,8 +181,8 @@ if conf.has('WITH_LXC')
}
virt_install_dirs += [
@ -113,7 +128,7 @@ index f8e2a88..96d6687 100644
]
endif
diff --git a/src/meson.build b/src/meson.build
index 7c47821..d33d16a 100644
index 2bd88e6699..76df507968 100644
--- a/src/meson.build
+++ b/src/meson.build
@@ -669,7 +669,7 @@ endforeach
@ -176,10 +191,10 @@ index 7c47821..d33d16a 100644
meson.add_install_script(
diff --git a/src/network/meson.build b/src/network/meson.build
index 3ec598c..b02040b 100644
index d6fb624bb7..96b757b144 100644
--- a/src/network/meson.build
+++ b/src/network/meson.build
@@ -79,9 +79,9 @@ if conf.has('WITH_NETWORK')
@@ -78,9 +78,9 @@ if conf.has('WITH_NETWORK')
}
virt_install_dirs += [
@ -192,7 +207,7 @@ index 3ec598c..b02040b 100644
]
configure_file(
@@ -89,12 +89,12 @@ if conf.has('WITH_NETWORK')
@@ -88,12 +88,12 @@ if conf.has('WITH_NETWORK')
output: '@BASENAME@',
copy: true,
install: true,
@ -208,7 +223,7 @@ index 3ec598c..b02040b 100644
)
diff --git a/src/nwfilter/xml/meson.build b/src/nwfilter/xml/meson.build
index 0d96c54..66c92a1 100644
index 0d96c54ebe..66c92a1016 100644
--- a/src/nwfilter/xml/meson.build
+++ b/src/nwfilter/xml/meson.build
@@ -25,4 +25,4 @@ nwfilter_xml_files = [
@ -218,7 +233,7 @@ index 0d96c54..66c92a1 100644
-install_data(nwfilter_xml_files, install_dir: sysconfdir / 'libvirt' / 'nwfilter')
+install_data(nwfilter_xml_files, install_dir: install_prefix + sysconfdir / 'libvirt' / 'nwfilter')
diff --git a/src/qemu/meson.build b/src/qemu/meson.build
index 90640b0..8802cec 100644
index 3898d23877..c2a2675187 100644
--- a/src/qemu/meson.build
+++ b/src/qemu/meson.build
@@ -171,12 +171,12 @@ if conf.has('WITH_QEMU')
@ -242,7 +257,7 @@ index 90640b0..8802cec 100644
]
endif
diff --git a/src/remote/meson.build b/src/remote/meson.build
index 9ad2f6a..429a15b 100644
index 0a188268b5..702822612e 100644
--- a/src/remote/meson.build
+++ b/src/remote/meson.build
@@ -245,7 +245,7 @@ if conf.has('WITH_REMOTE')
@ -273,10 +288,10 @@ index 9ad2f6a..429a15b 100644
)
endif
diff --git a/src/security/apparmor/meson.build b/src/security/apparmor/meson.build
index af43780..e2d6c81 100644
index 990f00b4f3..e5a7a14e1d 100644
--- a/src/security/apparmor/meson.build
+++ b/src/security/apparmor/meson.build
@@ -17,22 +17,22 @@ foreach name : apparmor_gen_profiles
@@ -19,22 +19,22 @@ foreach name : apparmor_gen_profiles
output: name,
configuration: apparmor_gen_profiles_conf,
install: true,
@ -304,10 +319,10 @@ index af43780..e2d6c81 100644
rename: 'usr.lib.libvirt.virt-aa-helper',
)
diff --git a/tools/meson.build b/tools/meson.build
index b8c6802..dacd0ff 100644
index 3fba313e5f..a2b891b86c 100644
--- a/tools/meson.build
+++ b/tools/meson.build
@@ -115,7 +115,7 @@ if conf.has('WITH_LOGIN_SHELL')
@@ -120,7 +120,7 @@ if conf.has('WITH_LOGIN_SHELL')
install_rpath: libvirt_rpath,
)
@ -316,7 +331,7 @@ index b8c6802..dacd0ff 100644
endif
if host_machine.system() == 'windows'
@@ -274,7 +274,7 @@ configure_file(
@@ -307,7 +307,7 @@ configure_file(
if init_script == 'systemd'
install_data(
'libvirt-guests.sysconf',
@ -324,3 +339,7 @@ index b8c6802..dacd0ff 100644
+ install_dir: install_prefix + sysconfdir / 'sysconfig',
rename: 'libvirt-guests',
)
--
2.35.1

View file

@ -1,14 +0,0 @@
diff --git a/src/ch/meson.build b/src/ch/meson.build
index e34974d56c..4767763c2c 100644
--- a/src/ch/meson.build
+++ b/src/ch/meson.build
@@ -68,7 +68,7 @@ if conf.has('WITH_CH')
}
virt_install_dirs += [
- localstatedir / 'lib' / 'libvirt' / 'ch',
- runstatedir / 'libvirt' / 'ch',
+ install_prefix + localstatedir / 'lib' / 'libvirt' / 'ch',
+ install_prefix + runstatedir / 'libvirt' / 'ch',
]
endif

View file

@ -1,81 +1,118 @@
{ lib
, stdenv
, fetchurl
, fetchFromGitLab
, makeWrapper
, autoreconfHook
, fetchpatch
, bash-completion
, bridge-utils
, cmake
, coreutils
, libxml2
, gnutls
, perl
, python3
, attr
, glib
, curl
, darwin
, dbus
, dnsmasq
, docutils
, iproute2
, readline
, lvm2
, util-linux
, systemd
, libpciaccess
, fetchFromGitLab
, fetchurl
, gettext
, libtasn1
, glib
, gnutls
, iproute2
, iptables
, libgcrypt
, yajl
, pmutils
, libcap_ng
, libapparmor
, dnsmasq
, libnl
, libpcap
, libtasn1
, libxml2
, libxslt
, xhtml1
, numad
, numactl
, perlPackages
, curl
, libiconv
, gmp
, zfs
, parted
, bridge-utils
, dmidecode
, dbus
, libtirpc
, rpcsvc-proto
, darwin
, makeWrapper
, meson
, ninja
, audit
, cmake
, bash-completion
, perl
, perlPackages
, pkg-config
, pmutils
, python3
, readline
, rpcsvc-proto
, stdenv
, xhtml1
, yajl
# Linux
, acl ? null
, attr ? null
, audit ? null
, dmidecode ? null
, fuse ? null
, 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 ? null
, libiconv ? null
, Carbon ? null
, AppKit ? null
# Options
, enableCeph ? false
, ceph ? null
, enableGlusterfs ? false
, glusterfs ? null
, enableIscsi ? false
, openiscsi ? null
, libiscsi ? null
, enableXen ? false
, xen ? null
, enableIscsi ? false
, openiscsi
, enableCeph ? false
, ceph
, enableGlusterfs ? false
, glusterfs
, Carbon
, AppKit
, enableZfs ? stdenv.isLinux
, zfs ? null
}:
with lib;
# if you update, also bump <nixpkgs/pkgs/development/python-modules/libvirt/default.nix> and SysVirt in <nixpkgs/pkgs/top-level/perl-packages.nix>
let
buildFromTarball = stdenv.isDarwin;
inherit (stdenv) isDarwin isLinux isx86_64;
binPath = makeBinPath ([
dnsmasq
] ++ optionals isLinux [
bridge-utils
dmidecode
dnsmasq
iproute2
iptables
kmod
lvm2
numactl
numad
pmutils
systemd
] ++ optionals enableIscsi [
libiscsi
openiscsi
]);
in
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>
stdenv.mkDerivation rec {
pname = "libvirt";
# NOTE: You must also bump:
# <nixpkgs/pkgs/development/python-modules/libvirt/default.nix>
# SysVirt in <nixpkgs/pkgs/top-level/perl-packages.nix>
version = "7.10.0";
src =
if buildFromTarball then
if isDarwin then
fetchurl
{
url = "https://libvirt.org/sources/${pname}-${version}.tar.xz";
@ -93,70 +130,76 @@ stdenv.mkDerivation rec {
patches = [
./0001-meson-patch-in-an-install-prefix-for-building-on-nix.patch
./0002-meson-patch-ch-install-prefix.patch
];
# 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
'';
nativeBuildInputs = [
ninja
meson
cmake
makeWrapper
pkg-config
docutils
] ++ optional (!stdenv.isDarwin) [
rpcsvc-proto
] ++ optionals stdenv.isDarwin [
darwin.developer_cmds # needed for rpcgen
];
makeWrapper
ninja
pkg-config
]
++ optional (!isDarwin) rpcsvc-proto
# NOTE: needed for rpcgen
++ optional isDarwin darwin.developer_cmds;
buildInputs = [
bash-completion
pkg-config
libxml2
curl
dbus
gettext
glib
gnutls
libgcrypt
libpcap
libtasn1
libxml2
libxslt
perl
perlPackages.XMLXPath
pkg-config
python3
readline
gettext
libtasn1
libgcrypt
yajl
libxslt
xhtml1
perlPackages.XMLXPath
curl
libpcap
glib
dbus
] ++ optionals stdenv.isLinux [
yajl
] ++ optionals isLinux [
acl
attr
audit
libpciaccess
lvm2
util-linux
systemd
libnl
numad
zfs
fuse
libapparmor
libcap_ng
numactl
attr
parted
libnl
libpciaccess
libtirpc
] ++ optionals (enableXen && stdenv.isLinux && stdenv.isx86_64) [
xen
] ++ optionals enableIscsi [
openiscsi
] ++ optionals enableCeph [
ceph
] ++ optionals enableGlusterfs [
glusterfs
] ++ optionals stdenv.isDarwin [
libiconv
gmp
Carbon
lvm2
numactl
numad
parted
systemd
util-linux
] ++ optionals isDarwin [
AppKit
];
Carbon
gmp
libiconv
]
++ optionals enableCeph [ ceph ]
++ optionals enableGlusterfs [ glusterfs ]
++ optionals enableIscsi [ libiscsi openiscsi ]
++ optionals enableXen [ xen ]
++ optionals enableZfs [ zfs ];
preConfigure =
let
@ -164,20 +207,23 @@ stdenv.mkDerivation rec {
QEMU_BRIDGE_HELPER = "/run/wrappers/bin/qemu-bridge-helper";
QEMU_PR_HELPER = "/run/libvirt/nix-helpers/qemu-pr-helper";
};
patchBuilder = var: value: ''
sed -i meson.build -e "s|conf.set_quoted('${var}',.*|conf.set_quoted('${var}','${value}')|"
'';
in
''
PATH=${lib.makeBinPath ([ dnsmasq ] ++ optionals stdenv.isLinux [ iproute2 iptables lvm2 systemd numad ] ++ optionals enableIscsi [ openiscsi ])}:$PATH
PATH="${binPath}:$PATH"
# 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",'
substituteInPlace build-aux/meson.build \
--replace "gsed" "sed" \
--replace "gmake" "make" \
--replace "ggrep" "grep"
patchShebangs .
''
+ (lib.concatStringsSep "\n" (lib.mapAttrsToList patchBuilder overrides));
@ -186,58 +232,99 @@ stdenv.mkDerivation rec {
mesonFlags =
let
opt = option: enable: "-D${option}=${if enable then "enabled" else "disabled"}";
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}";
in
[
"--sysconfdir=/var/lib"
"-Dinstall_prefix=${placeholder "out"}"
"-Dlocalstatedir=/var"
"-Drunstatedir=/run"
"-Dlibpcap=enabled"
"-Ddriver_qemu=enabled"
"-Ddriver_vmware=enabled"
"-Ddriver_vbox=enabled"
"-Ddriver_test=enabled"
"-Ddriver_esx=enabled"
"-Ddriver_remote=enabled"
"-Dpolkit=enabled"
(opt "storage_iscsi" enableIscsi)
] ++ optionals stdenv.isLinux [
(opt "storage_zfs" (zfs != null))
"-Dattr=enabled"
"-Dapparmor=enabled"
"-Dsecdriver_apparmor=enabled"
"-Dnumad=enabled"
"-Dstorage_disk=enabled"
(opt "glusterfs" enableGlusterfs)
(opt "storage_rbd" enableCeph)
] ++ optionals stdenv.isDarwin [
"-Dinit_script=none"
(cfg "install_prefix" (placeholder "out"))
(cfg "localstatedir" "/var")
(cfg "runstatedir" "/run")
(cfg "init_script" (if isDarwin then "none" else "systemd"))
(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)
(feat "nss" isLinux)
(feat "numactl" isLinux)
(feat "numad" isLinux)
(feat "pciaccess" isLinux)
(feat "polkit" true)
(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)
];
postInstall =
let
binPath = [ iptables iproute2 pmutils numad numactl bridge-utils dmidecode dnsmasq ] ++ optionals enableIscsi [ openiscsi ];
in
''
substituteInPlace $out/bin/virt-xml-validate \
--replace xmllint ${libxml2}/bin/xmllint
doCheck = true;
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 "$out/bin" '${gettext}/bin' \
--replace 'lock/subsys' 'lock' \
--replace 'gettext.sh' 'gettext.sh
# Added in nixpkgs:
gettext() { "${gettext}/bin/gettext" "$@"; }
'
'' + optionalString stdenv.isLinux ''
substituteInPlace $out/lib/systemd/system/libvirtd.service --replace /bin/kill ${coreutils}/bin/kill
rm $out/lib/systemd/system/{virtlockd,virtlogd}.*
wrapProgram $out/sbin/libvirtd \
--prefix PATH : /run/libvirt/nix-emulators:${makeBinPath binPath}
'';
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 "$out/bin" '${gettext}/bin' \
--replace 'lock/subsys' 'lock' \
--replace 'gettext.sh' 'gettext.sh
# Added in nixpkgs:
gettext() { "${gettext}/bin/gettext" "$@"; }
'
'' + optionalString isLinux ''
substituteInPlace $out/lib/systemd/system/libvirtd.service --replace /bin/kill ${coreutils}/bin/kill
rm $out/lib/systemd/system/{virtlockd,virtlogd}.*
wrapProgram $out/sbin/libvirtd \
--prefix PATH : /run/libvirt/nix-emulators:${binPath}
'';
meta = {
homepage = "https://libvirt.org/";
@ -248,6 +335,6 @@ stdenv.mkDerivation rec {
'';
license = licenses.lgpl2Plus;
platforms = platforms.unix;
maintainers = with maintainers; [ fpletz globin ];
maintainers = with maintainers; [ fpletz globin lovesegfault ];
};
}