From 35b73ea944dea02983e0b891b760528adfa84839 Mon Sep 17 00:00:00 2001
From: Stefan Kober <stefan.kober@cyberus-technology.de>
Date: Tue, 3 Mar 2026 16:37:24 +0100
Subject: [PATCH 1/2] 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              | 42 +++++++++++++++----------------
 src/remote/meson.build            | 10 ++++----
 src/secret/meson.build            |  6 ++---
 src/security/apparmor/meson.build |  6 ++---
 src/storage/meson.build           |  6 ++---
 tools/meson.build                 |  2 +-
 tools/ssh-proxy/meson.build       |  2 +-
 19 files changed, 91 insertions(+), 80 deletions(-)

diff --git a/meson.build b/meson.build
index 4478efd613..defba3869d 100644
--- a/meson.build
+++ b/meson.build
@@ -69,6 +69,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
 
@@ -87,6 +89,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 32009ce710..17641414c0 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 5ab3798cf8..39be032cc6 100644
--- a/src/ch/meson.build
+++ b/src/ch/meson.build
@@ -84,8 +84,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 f8d12c481f..f622fc9201 100644
--- a/src/locking/meson.build
+++ b/src/locking/meson.build
@@ -247,14 +247,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 cab52ce7a3..308462a2da 100644
--- a/src/meson.build
+++ b/src/meson.build
@@ -222,7 +222,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
@@ -699,7 +699,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:
@@ -762,7 +762,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)
@@ -911,7 +911,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'] ],
       )
@@ -919,7 +919,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
@@ -946,10 +946,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',
 ]
 
 if conf.has('WITH_LIBVIRTD')
diff --git a/src/network/meson.build b/src/network/meson.build
index 7a98974852..3a285d4084 100644
--- a/src/network/meson.build
+++ b/src/network/meson.build
@@ -120,11 +120,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(
@@ -132,12 +132,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 9e8a4797c5..e0782a8fad 100644
--- a/src/nwfilter/meson.build
+++ b/src/nwfilter/meson.build
@@ -66,9 +66,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 b4fb62f14f..421aa94561 100644
--- a/src/qemu/meson.build
+++ b/src/qemu/meson.build
@@ -211,26 +211,26 @@ if conf.has('WITH_QEMU')
   }
 
   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' / 'qemu' / 'varstore',
-    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' / 'qemu' / 'varstore',
+    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 e503263266..e0c660d8c9 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
@@ -338,7 +338,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 cfcc861f4f..85b67a6e89 100644
--- a/src/secret/meson.build
+++ b/src/secret/meson.build
@@ -79,8 +79,8 @@ if conf.has('WITH_SECRETS')
   }
 
   virt_install_dirs += [
-    confdir / 'secrets',
-    runstatedir / 'libvirt' / 'secrets',
-    localstatedir / 'lib' / 'libvirt' / 'secrets',
+    install_prefix + confdir / 'secrets',
+    install_prefix + runstatedir / 'libvirt' / 'secrets',
+    install_prefix + localstatedir / 'lib' / '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 f6f28757ef..2bf815fd03 100644
--- a/src/storage/meson.build
+++ b/src/storage/meson.build
@@ -124,9 +124,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..bb39ad8ca8 100644
--- a/tools/meson.build
+++ b/tools/meson.build
@@ -123,7 +123,7 @@ 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(
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.53.0

