Patch from NixOS:

  https://github.com/NixOS/nixpkgs/blob/master/pkgs/by-name/li/libvirt/0001-meson-patch-in-an-install-prefix-for-building-on-nix.patch

From 58c07f1d59ef683faf8b747e40bd75401306acf4 Mon Sep 17 00:00:00 2001
From: Euan Kemp <euank@euank.com>
Date: Mon, 24 Jun 2024 15:59:48 +0200
Subject: [PATCH] meson: patch in an install prefix for building on nix

Used in the nixpkgs version of libvirt so that we can install things in
the nix store, but read them from the root filesystem.
---
 meson.build                       |  9 +++++++
 meson_options.txt                 |  2 ++
 src/ch/meson.build                |  6 ++---
 src/interface/meson.build         |  2 +-
 src/libxl/meson.build             | 18 +++++++-------
 src/locking/meson.build           |  8 +++----
 src/lxc/meson.build               | 10 ++++----
 src/meson.build                   | 18 +++++++-------
 src/network/meson.build           | 14 +++++------
 src/node_device/meson.build       |  2 +-
 src/nwfilter/meson.build          |  6 ++---
 src/nwfilter/xml/meson.build      |  2 +-
 src/qemu/meson.build              | 40 +++++++++++++++----------------
 src/remote/meson.build            | 10 ++++----
 src/secret/meson.build            |  4 ++--
 src/security/apparmor/meson.build |  8 +++----
 src/storage/meson.build           |  6 ++---
 tools/meson.build                 |  2 +-
 tools/ssh-proxy/meson.build       |  2 +-
 19 files changed, 90 insertions(+), 79 deletions(-)

diff --git a/meson.build b/meson.build
index e98ab0d5ac..376f241c07 100644
--- a/meson.build
+++ b/meson.build
@@ -47,6 +47,8 @@ if host_machine.system() == 'windows'
   conf.set('WINVER', '0x0600') # Win Vista / Server 2008
 endif
 
+# patched in for nix
+install_prefix = get_option('install_prefix')
 
 # set various paths
 
@@ -65,6 +67,13 @@ else
   sysconfdir = prefix / get_option('sysconfdir')
 endif
 
+# nix: don't prefix the localstatedir; some things need to write to it, so it
+# can't be in the nix store, and that's what the prefix is.
+# We'll prefix things ourselves where needed
+localstatedir = get_option('localstatedir')
+# Same for sysconfidr
+sysconfdir = get_option('sysconfdir')
+
 # if --prefix is /usr, don't use /usr/var for localstatedir or /usr/etc for
 # 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 cdc8687795..c2b6da140c 100644
--- a/meson_options.txt
+++ b/meson_options.txt
@@ -1,3 +1,5 @@
+option('install_prefix', type: 'string', value: '', description: 'prefix for nix store installation')
+
 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 633966aac7..c0ce823345 100644
--- a/src/ch/meson.build
+++ b/src/ch/meson.build
@@ -74,8 +74,8 @@ if conf.has('WITH_CH')
   }
 
   virt_install_dirs += [
-    localstatedir / 'lib' / 'libvirt' / 'ch',
-    localstatedir / 'log' / 'libvirt' / 'ch',
-    runstatedir / 'libvirt' / 'ch',
+    install_prefix + localstatedir / 'lib' / 'libvirt' / 'ch',
+    install_prefix + localstatedir / 'log' / 'libvirt' / 'ch',
+    install_prefix + runstatedir / 'libvirt' / 'ch',
   ]
 endif
diff --git a/src/interface/meson.build b/src/interface/meson.build
index 3d2991315e..20f3266738 100644
--- a/src/interface/meson.build
+++ b/src/interface/meson.build
@@ -59,6 +59,6 @@ if conf.has('WITH_INTERFACE')
   }
 
   virt_install_dirs += [
-    runstatedir / 'libvirt' / 'interface',
+    install_prefix + runstatedir / 'libvirt' / 'interface',
   ]
 endif
diff --git a/src/libxl/meson.build b/src/libxl/meson.build
index e75a8f2fdb..d1800b4ea5 100644
--- a/src/libxl/meson.build
+++ b/src/libxl/meson.build
@@ -81,14 +81,14 @@ if conf.has('WITH_LIBXL')
   }
 
   virt_install_dirs += [
-    confdir / 'libxl',
-    confdir / 'libxl' / 'autostart',
-    localstatedir / 'lib' / 'libvirt' / 'libxl',
-    localstatedir / 'lib' / 'libvirt' / 'libxl' / 'channel',
-    localstatedir / 'lib' / 'libvirt' / 'libxl' / 'channel' / 'target',
-    localstatedir / 'lib' / 'libvirt' / 'libxl' / 'dump',
-    localstatedir / 'lib' / 'libvirt' / 'libxl' / 'save',
-    localstatedir / 'log' / 'libvirt' / 'libxl',
-    runstatedir / 'libvirt' / 'libxl',
+    install_prefix + confdir / 'libxl',
+    install_prefix + confdir / 'libxl' / 'autostart',
+    install_prefix + localstatedir / 'lib' / 'libvirt' / 'libxl',
+    install_prefix + localstatedir / 'lib' / 'libvirt' / 'libxl' / 'channel',
+    install_prefix + localstatedir / 'lib' / 'libvirt' / 'libxl' / 'channel' / 'target',
+    install_prefix + localstatedir / 'lib' / 'libvirt' / 'libxl' / 'dump',
+    install_prefix + localstatedir / 'lib' / 'libvirt' / 'libxl' / 'save',
+    install_prefix + localstatedir / 'log' / 'libvirt' / 'libxl',
+    install_prefix + runstatedir / 'libvirt' / 'libxl',
   ]
 endif
diff --git a/src/locking/meson.build b/src/locking/meson.build
index c3dfcf2961..cdc1442775 100644
--- a/src/locking/meson.build
+++ b/src/locking/meson.build
@@ -249,14 +249,14 @@ if conf.has('WITH_LIBVIRTD')
   }
 
   virt_install_dirs += [
-    localstatedir / 'lib' / 'libvirt' / 'lockd',
-    localstatedir / 'lib' / 'libvirt' / 'lockd' / 'files',
-    runstatedir / 'libvirt' / 'lockd',
+    install_prefix + localstatedir / 'lib' / 'libvirt' / 'lockd',
+    install_prefix + localstatedir / 'lib' / 'libvirt' / 'lockd' / 'files',
+    install_prefix + runstatedir / 'libvirt' / 'lockd',
   ]
 
   if conf.has('WITH_SANLOCK')
     virt_install_dirs += [
-      localstatedir / 'lib' / 'libvirt' / 'sanlock',
+      install_prefix + localstatedir / 'lib' / 'libvirt' / 'sanlock',
     ]
   endif
 endif
diff --git a/src/lxc/meson.build b/src/lxc/meson.build
index bf9afabc0f..6e9547000a 100644
--- a/src/lxc/meson.build
+++ b/src/lxc/meson.build
@@ -190,10 +190,10 @@ if conf.has('WITH_LXC')
   }
 
   virt_install_dirs += [
-    confdir / 'lxc',
-    confdir / 'lxc' / 'autostart',
-    localstatedir / 'lib' / 'libvirt' / 'lxc',
-    localstatedir / 'log' / 'libvirt' / 'lxc',
-    runstatedir / 'libvirt' / 'lxc',
+    install_prefix + confdir / 'lxc',
+    install_prefix + confdir / 'lxc' / 'autostart',
+    install_prefix + localstatedir / 'lib' / 'libvirt' / 'lxc',
+    install_prefix + localstatedir / 'log' / 'libvirt' / 'lxc',
+    install_prefix + runstatedir / 'libvirt' / 'lxc',
   ]
 endif
diff --git a/src/meson.build b/src/meson.build
index dd2682ec19..b330d1159e 100644
--- a/src/meson.build
+++ b/src/meson.build
@@ -220,7 +220,7 @@ openrc_init_files = []
 
 # virt_install_dirs:
 #   list of directories to create during installation
-virt_install_dirs = [ confdir ]
+virt_install_dirs = [ install_prefix + confdir ]
 
 # driver_source_files:
 #   driver source files to check
@@ -697,7 +697,7 @@ endforeach
 
 virt_conf_files += 'libvirt.conf'
 
-install_data(virt_conf_files, install_dir: confdir)
+install_data(virt_conf_files, install_dir: install_prefix + confdir)
 install_data(virt_aug_files, install_dir: virt_aug_dir)
 
 # augeas_test_data:
@@ -760,7 +760,7 @@ foreach data : virt_daemon_confs
     output: '@0@.conf'.format(data['name']),
     configuration: daemon_conf,
     install: true,
-    install_dir: confdir,
+    install_dir: install_prefix + confdir,
   )
 
   if data.get('with_ip', false)
@@ -910,7 +910,7 @@ if conf.has('WITH_LIBVIRTD')
 
       install_data(
         init_file,
-        install_dir: sysconfdir / 'init.d',
+        install_dir: install_prefix + sysconfdir / 'init.d',
         install_mode: 'rwxr-xr-x',
         rename: [ init['name'] ],
       )
@@ -918,7 +918,7 @@ if conf.has('WITH_LIBVIRTD')
       if init.has_key('confd')
         install_data(
           init['confd'],
-          install_dir: sysconfdir / 'conf.d',
+          install_dir: install_prefix + sysconfdir / 'conf.d',
           rename: [ init['name'] ],
         )
       endif
@@ -945,10 +945,10 @@ endif
 # Install empty directories
 
 virt_install_dirs += [
-  localstatedir / 'cache' / 'libvirt',
-  localstatedir / 'lib' / 'libvirt' / 'images',
-  localstatedir / 'lib' / 'libvirt' / 'filesystems',
-  localstatedir / 'lib' / 'libvirt' / 'boot',
+  install_prefix + localstatedir / 'cache' / 'libvirt',
+  install_prefix + localstatedir / 'lib' / 'libvirt' / 'images',
+  install_prefix + localstatedir / 'lib' / 'libvirt' / 'filesystems',
+  install_prefix + localstatedir / 'lib' / 'libvirt' / 'boot',
 ]
 
 meson.add_install_script(
diff --git a/src/network/meson.build b/src/network/meson.build
index 07cd5cda55..699309bb66 100644
--- a/src/network/meson.build
+++ b/src/network/meson.build
@@ -115,11 +115,11 @@ if conf.has('WITH_NETWORK')
   }
 
   virt_install_dirs += [
-    confdir / 'qemu' / 'networks',
-    confdir / 'qemu' / 'networks' / 'autostart',
-    localstatedir / 'lib' / 'libvirt' / 'network',
-    localstatedir / 'lib' / 'libvirt' / 'dnsmasq',
-    runstatedir / 'libvirt' / 'network',
+    install_prefix + confdir / 'qemu' / 'networks',
+    install_prefix + confdir / 'qemu' / 'networks' / 'autostart',
+    install_prefix + localstatedir / 'lib' / 'libvirt' / 'network',
+    install_prefix + localstatedir / 'lib' / 'libvirt' / 'dnsmasq',
+    install_prefix + runstatedir / 'libvirt' / 'network',
   ]
 
   configure_file(
@@ -127,12 +127,12 @@ if conf.has('WITH_NETWORK')
     output: '@BASENAME@',
     configuration: configmake_conf,
     install: true,
-    install_dir: confdir / 'qemu' / 'networks',
+    install_dir: install_prefix + confdir / 'qemu' / 'networks',
   )
 
   meson.add_install_script(
     meson_python_prog.full_path(), python3_prog.full_path(), meson_install_symlink_prog.full_path(),
-    confdir / 'qemu' / 'networks' / 'autostart',
+    install_prefix + confdir / 'qemu' / 'networks' / 'autostart',
     '../default.xml', 'default.xml',
   )
 
diff --git a/src/node_device/meson.build b/src/node_device/meson.build
index d66c02a0e2..f883b65431 100644
--- a/src/node_device/meson.build
+++ b/src/node_device/meson.build
@@ -67,6 +67,6 @@ if conf.has('WITH_NODE_DEVICES')
   }
 
   virt_install_dirs += [
-    runstatedir / 'libvirt' / 'nodedev',
+    install_prefix + runstatedir / 'libvirt' / 'nodedev',
   ]
 endif
diff --git a/src/nwfilter/meson.build b/src/nwfilter/meson.build
index de3d202267..346c435ee7 100644
--- a/src/nwfilter/meson.build
+++ b/src/nwfilter/meson.build
@@ -65,9 +65,9 @@ if conf.has('WITH_NWFILTER')
   }
 
   virt_install_dirs += [
-    confdir / 'nwfilter',
-    runstatedir / 'libvirt' / 'nwfilter-binding',
-    runstatedir / 'libvirt' / 'nwfilter',
+    install_prefix + confdir / 'nwfilter',
+    install_prefix + runstatedir / 'libvirt' / 'nwfilter-binding',
+    install_prefix + runstatedir / 'libvirt' / 'nwfilter',
   ]
 
   subdir('xml')
diff --git a/src/nwfilter/xml/meson.build b/src/nwfilter/xml/meson.build
index 0d96c54ebe..66c92a1016 100644
--- a/src/nwfilter/xml/meson.build
+++ b/src/nwfilter/xml/meson.build
@@ -25,4 +25,4 @@ nwfilter_xml_files = [
   'qemu-announce-self.xml',
 ]
 
-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 907893d431..99b62c8955 100644
--- a/src/qemu/meson.build
+++ b/src/qemu/meson.build
@@ -218,25 +218,25 @@ if conf.has('WITH_QEMU')
   endif
 
   virt_install_dirs += [
-    confdir / 'qemu',
-    confdir / 'qemu' / 'autostart',
-    localstatedir / 'cache' / 'libvirt' / 'qemu',
-    localstatedir / 'lib' / 'libvirt' / 'qemu',
-    localstatedir / 'lib' / 'libvirt' / 'qemu' / 'channel',
-    localstatedir / 'lib' / 'libvirt' / 'qemu' / 'channel' / 'target',
-    localstatedir / 'lib' / 'libvirt' / 'qemu' / 'checkpoint',
-    localstatedir / 'lib' / 'libvirt' / 'qemu' / 'dump',
-    localstatedir / 'lib' / 'libvirt' / 'qemu' / 'nvram',
-    localstatedir / 'lib' / 'libvirt' / 'qemu' / 'ram',
-    localstatedir / 'lib' / 'libvirt' / 'qemu' / 'save',
-    localstatedir / 'lib' / 'libvirt' / 'qemu' / 'snapshot',
-    localstatedir / 'lib' / 'libvirt' / 'swtpm',
-    localstatedir / 'log' / 'libvirt' / 'qemu',
-    localstatedir / 'log' / 'swtpm' / 'libvirt' / 'qemu',
-    runstatedir / 'libvirt' / 'qemu',
-    runstatedir / 'libvirt' / 'qemu' / 'dbus',
-    runstatedir / 'libvirt' / 'qemu' / 'passt',
-    runstatedir / 'libvirt' / 'qemu' / 'slirp',
-    runstatedir / 'libvirt' / 'qemu' / 'swtpm',
+    install_prefix + confdir / 'qemu',
+    install_prefix + confdir / 'qemu' / 'autostart',
+    install_prefix + localstatedir / 'cache' / 'libvirt' / 'qemu',
+    install_prefix + localstatedir / 'lib' / 'libvirt' / 'qemu',
+    install_prefix + localstatedir / 'lib' / 'libvirt' / 'qemu' / 'channel',
+    install_prefix + localstatedir / 'lib' / 'libvirt' / 'qemu' / 'channel' / 'target',
+    install_prefix + localstatedir / 'lib' / 'libvirt' / 'qemu' / 'checkpoint',
+    install_prefix + localstatedir / 'lib' / 'libvirt' / 'qemu' / 'dump',
+    install_prefix + localstatedir / 'lib' / 'libvirt' / 'qemu' / 'nvram',
+    install_prefix + localstatedir / 'lib' / 'libvirt' / 'qemu' / 'ram',
+    install_prefix + localstatedir / 'lib' / 'libvirt' / 'qemu' / 'save',
+    install_prefix + localstatedir / 'lib' / 'libvirt' / 'qemu' / 'snapshot',
+    install_prefix + localstatedir / 'lib' / 'libvirt' / 'swtpm',
+    install_prefix + localstatedir / 'log' / 'libvirt' / 'qemu',
+    install_prefix + localstatedir / 'log' / 'swtpm' / 'libvirt' / 'qemu',
+    install_prefix + runstatedir / 'libvirt' / 'qemu',
+    install_prefix + runstatedir / 'libvirt' / 'qemu' / 'dbus',
+    install_prefix + runstatedir / 'libvirt' / 'qemu' / 'passt',
+    install_prefix + runstatedir / 'libvirt' / 'qemu' / 'slirp',
+    install_prefix + runstatedir / 'libvirt' / 'qemu' / 'swtpm',
   ]
 endif
diff --git a/src/remote/meson.build b/src/remote/meson.build
index 831acaaa01..0ba34d3bad 100644
--- a/src/remote/meson.build
+++ b/src/remote/meson.build
@@ -261,9 +261,9 @@ if conf.has('WITH_REMOTE')
     }
 
     virt_install_dirs += [
-      localstatedir / 'log' / 'libvirt',
-      runstatedir / 'libvirt',
-      runstatedir / 'libvirt' / 'common',
+      install_prefix + localstatedir / 'log' / 'libvirt',
+      install_prefix + runstatedir / 'libvirt',
+      install_prefix + runstatedir / 'libvirt' / 'common',
     ]
 
     logrotate_conf = configuration_data({
@@ -278,7 +278,7 @@ if conf.has('WITH_REMOTE')
       )
       install_data(
         log_file,
-        install_dir: sysconfdir / 'logrotate.d',
+        install_dir: install_prefix + sysconfdir / 'logrotate.d',
         rename: [ name ],
       )
     endforeach
@@ -328,7 +328,7 @@ endif
 if conf.has('WITH_SASL')
   install_data(
     'libvirtd.sasl',
-    install_dir: sysconfdir / 'sasl2',
+    install_dir: install_prefix + sysconfdir / 'sasl2',
     rename: [ 'libvirt.conf' ],
   )
 endif
diff --git a/src/secret/meson.build b/src/secret/meson.build
index 3b859ea7b4..ccddb3e805 100644
--- a/src/secret/meson.build
+++ b/src/secret/meson.build
@@ -48,7 +48,7 @@ if conf.has('WITH_SECRETS')
   }
 
   virt_install_dirs += [
-    confdir / 'secrets',
-    runstatedir / 'libvirt' / 'secrets',
+    install_prefix + confdir / 'secrets',
+    install_prefix + runstatedir / 'libvirt' / 'secrets',
   ]
 endif
diff --git a/src/security/apparmor/meson.build b/src/security/apparmor/meson.build
index 09d9fac02c..ee0c74ceec 100644
--- a/src/security/apparmor/meson.build
+++ b/src/security/apparmor/meson.build
@@ -20,16 +20,16 @@ foreach name : apparmor_gen_profiles
     output: name,
     configuration: apparmor_gen_profiles_conf,
     install: true,
-    install_dir: apparmor_dir,
+    install_dir: install_prefix + apparmor_dir,
   )
 endforeach

 install_data(
   [ 'libvirt-qemu', 'libvirt-lxc' ],
-  install_dir: apparmor_dir / 'abstractions',
+  install_dir: install_prefix + apparmor_dir / 'abstractions',
 )

 install_data(
   [ 'TEMPLATE.qemu', 'TEMPLATE.lxc' ],
-  install_dir: apparmor_dir / 'libvirt',
+  install_dir: install_prefix + apparmor_dir / 'libvirt',
 )
diff --git a/src/storage/meson.build b/src/storage/meson.build
index 404d6a6941..fb4e67a0a8 100644
--- a/src/storage/meson.build
+++ b/src/storage/meson.build
@@ -126,9 +126,9 @@ if conf.has('WITH_STORAGE')
   }

   virt_install_dirs += [
-    confdir / 'storage',
-    confdir / 'storage' / 'autostart',
-    runstatedir / 'libvirt' / 'storage',
+    install_prefix + confdir / 'storage',
+    install_prefix + confdir / 'storage' / 'autostart',
+    install_prefix + runstatedir / 'libvirt' / 'storage',
   ]
 endif

diff --git a/tools/meson.build b/tools/meson.build
index a099148d3c..d0d6510f17 100644
--- a/tools/meson.build
+++ b/tools/meson.build
@@ -123,12 +123,12 @@ if conf.has('WITH_LOGIN_SHELL')
     install_rpath: libvirt_rpath,
   )

-  install_data('virt-login-shell.conf', install_dir: sysconfdir / 'libvirt')
+  install_data('virt-login-shell.conf', install_dir: install_prefix + sysconfdir / 'libvirt')

   # Install the sysuser config for the setgid binary
   install_data(
     'libvirt-login-shell.sysusers.conf',
-    install_dir: sysusersdir,
+    install_dir: install_prefix + sysusersdir,
     rename: [ 'libvirt-login-shell.conf' ],
   )
 endif

diff --git a/tools/ssh-proxy/meson.build b/tools/ssh-proxy/meson.build
index e9f312fa25..95d5d8fe0b 100644
--- a/tools/ssh-proxy/meson.build
+++ b/tools/ssh-proxy/meson.build
@@ -20,6 +20,6 @@ if conf.has('WITH_SSH_PROXY')
     output: '@BASENAME@',
     configuration: tools_conf,
     install: true,
-    install_dir : sshconfdir,
+    install_dir : install_prefix + sshconfdir,
   )
 endif
-- 
2.45.1
