[libvirt PATCH 088/351] meson: add qemu driver build options

Pavel Hrdina phrdina at redhat.com
Thu Jul 16 09:55:24 UTC 2020


Signed-off-by: Pavel Hrdina <phrdina at redhat.com>
---
 configure.ac           |   8 ---
 m4/virt-driver-qemu.m4 | 132 -----------------------------------------
 meson.build            | 127 +++++++++++++++++++++++++++++++++++++++
 meson_options.txt      |   3 +
 4 files changed, 130 insertions(+), 140 deletions(-)
 delete mode 100644 m4/virt-driver-qemu.m4

diff --git a/configure.ac b/configure.ac
index 30b84856d38..d0189c8701a 100644
--- a/configure.ac
+++ b/configure.ac
@@ -85,7 +85,6 @@ AM_CONDITIONAL([WITH_MACOS], [test "$with_macos" = "yes"])
 
 # Stateful drivers are useful only when building the daemon.
 if test "$with_libvirtd" = "no" ; then
-  with_qemu=no
   with_vbox=no
 fi
 
@@ -103,7 +102,6 @@ dnl
 dnl Virtualization drivers check
 dnl
 
-LIBVIRT_DRIVER_ARG_QEMU
 LIBVIRT_DRIVER_ARG_VMWARE
 LIBVIRT_DRIVER_ARG_VBOX
 LIBVIRT_DRIVER_ARG_VZ
@@ -111,7 +109,6 @@ LIBVIRT_DRIVER_ARG_TEST
 LIBVIRT_DRIVER_ARG_NETWORK
 LIBVIRT_DRIVER_ARG_INTERFACE
 
-LIBVIRT_DRIVER_CHECK_QEMU
 LIBVIRT_DRIVER_CHECK_VMWARE
 LIBVIRT_DRIVER_CHECK_VBOX
 LIBVIRT_DRIVER_CHECK_VZ
@@ -311,7 +308,6 @@ AC_MSG_NOTICE([=====================])
 AC_MSG_NOTICE([])
 AC_MSG_NOTICE([Drivers])
 AC_MSG_NOTICE([])
-LIBVIRT_DRIVER_RESULT_QEMU
 LIBVIRT_DRIVER_RESULT_VMWARE
 LIBVIRT_DRIVER_RESULT_VBOX
 LIBVIRT_DRIVER_RESULT_VZ
@@ -366,7 +362,3 @@ LIBVIRT_RESULT_LOGIN_SHELL
 LIBVIRT_RESULT_HOST_VALIDATE
 LIBVIRT_RESULT_TLS_PRIORITY
 AC_MSG_NOTICE([])
-AC_MSG_NOTICE([Privileges])
-AC_MSG_NOTICE([])
-LIBVIRT_RESULT_QEMU_PRIVILEGES
-AC_MSG_NOTICE([])
diff --git a/m4/virt-driver-qemu.m4 b/m4/virt-driver-qemu.m4
deleted file mode 100644
index 886261fce5c..00000000000
--- a/m4/virt-driver-qemu.m4
+++ /dev/null
@@ -1,132 +0,0 @@
-dnl The QEMU driver
-dnl
-dnl Copyright (C) 2016 Red Hat, Inc.
-dnl
-dnl This library is free software; you can redistribute it and/or
-dnl modify it under the terms of the GNU Lesser General Public
-dnl License as published by the Free Software Foundation; either
-dnl version 2.1 of the License, or (at your option) any later version.
-dnl
-dnl This library is distributed in the hope that it will be useful,
-dnl but WITHOUT ANY WARRANTY; without even the implied warranty of
-dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-dnl Lesser General Public License for more details.
-dnl
-dnl You should have received a copy of the GNU Lesser General Public
-dnl License along with this library.  If not, see
-dnl <http://www.gnu.org/licenses/>.
-dnl
-
-AC_DEFUN([LIBVIRT_DRIVER_ARG_QEMU], [
-  LIBVIRT_ARG_WITH_FEATURE([QEMU], [QEMU/KVM], [check])
-  LIBVIRT_ARG_WITH([QEMU_USER], [username to run QEMU system instance as],
-                   ['platform dependent'])
-  LIBVIRT_ARG_WITH([QEMU_GROUP], [groupname to run QEMU system instance as],
-                   ['platform dependent'])
-])
-
-AC_DEFUN([LIBVIRT_DRIVER_CHECK_QEMU], [
-  dnl There is no way qemu driver will work without JSON support
-  AC_REQUIRE([LIBVIRT_CHECK_YAJL])
-  if test "$with_qemu:$with_yajl" = "yes:no"; then
-    AC_MSG_ERROR([YAJL 2 is required to build QEMU driver])
-  fi
-  if test "$with_qemu" = "check"; then
-    with_qemu=$with_yajl
-  fi
-
-  if test "$with_qemu" = "yes" ; then
-    AC_DEFINE_UNQUOTED([WITH_QEMU], 1, [whether QEMU driver is enabled])
-  fi
-  AM_CONDITIONAL([WITH_QEMU], [test "$with_qemu" = "yes"])
-
-  if test $with_freebsd = yes || test $with_macos = yes; then
-    default_qemu_user=root
-    default_qemu_group=wheel
-  else
-    # Try to integrate gracefully with downstream packages by running QEMU
-    # processes using the same user and group they would
-    case $(grep ^ID= /etc/os-release 2>/dev/null) in
-      *arch*)
-        default_qemu_user=nobody
-        default_qemu_group=nobody
-        ;;
-      *centos*|*fedora*|*gentoo*|*rhel*|*suse*)
-        default_qemu_user=qemu
-        default_qemu_group=qemu
-        ;;
-      *debian*)
-        default_qemu_user=libvirt-qemu
-        default_qemu_group=libvirt-qemu
-        ;;
-      *ubuntu*)
-        default_qemu_user=libvirt-qemu
-        default_qemu_group=kvm
-        ;;
-      *)
-        default_qemu_user=root
-        default_qemu_group=root
-        ;;
-    esac
-    # If the expected user and group don't exist, or we haven't hit any
-    # of the cases above because we're running on an unknown OS, the only
-    # sensible fallback is root:root
-    AC_MSG_CHECKING([for QEMU credentials ($default_qemu_user:$default_qemu_group)])
-    if getent passwd "$default_qemu_user" >/dev/null 2>&1 && \
-       getent group "$default_qemu_group" >/dev/null 2>&1; then
-      AC_MSG_RESULT([ok])
-    else
-      AC_MSG_RESULT([not found, using root:root instead])
-      default_qemu_user=root
-      default_qemu_group=root
-    fi
-  fi
-
-  if test "x$with_qemu_user" = "xplatform dependent" ; then
-    QEMU_USER="$default_qemu_user"
-  else
-    QEMU_USER="$with_qemu_user"
-  fi
-  if test "x$with_qemu_group" = "xplatform dependent" ; then
-    QEMU_GROUP="$default_qemu_group"
-  else
-    QEMU_GROUP="$with_qemu_group"
-  fi
-  AC_DEFINE_UNQUOTED([QEMU_USER], ["$QEMU_USER"], [QEMU user account])
-  AC_DEFINE_UNQUOTED([QEMU_GROUP], ["$QEMU_GROUP"], [QEMU group account])
-
-  AC_PATH_PROG([QEMU_BRIDGE_HELPER], [qemu-bridge-helper],
-               [/usr/libexec/qemu-bridge-helper],
-               [/usr/libexec:/usr/lib/qemu:/usr/lib])
-  AC_DEFINE_UNQUOTED([QEMU_BRIDGE_HELPER], ["$QEMU_BRIDGE_HELPER"],
-                     [QEMU bridge helper])
-  AC_PATH_PROG([QEMU_PR_HELPER], [qemu-pr-helper],
-               [/usr/bin/qemu-pr-helper],
-               [/usr/bin:/usr/libexec])
-  AC_DEFINE_UNQUOTED([QEMU_PR_HELPER], ["$QEMU_PR_HELPER"],
-                     [QEMU PR helper])
-  AC_PATH_PROG([QEMU_SLIRP_HELPER], [slirp-helper],
-               [/usr/bin/slirp-helper],
-               [/usr/bin:/usr/libexec])
-  AC_DEFINE_UNQUOTED([QEMU_SLIRP_HELPER], ["$QEMU_SLIRP_HELPER"],
-                     [QEMU slirp helper])
-
-  AC_PATH_PROG([QEMU_DBUS_DAEMON], [dbus-daemon],
-               [/usr/bin/dbus-daemon],
-               [/usr/bin:/usr/libexec])
-  AC_DEFINE_UNQUOTED([QEMU_DBUS_DAEMON], ["$QEMU_DBUS_DAEMON"],
-                     [QEMU dbus daemon])
-])
-
-AC_DEFUN([LIBVIRT_DRIVER_RESULT_QEMU], [
-  LIBVIRT_RESULT([QEMU], [$with_qemu])
-])
-
-AC_DEFUN([LIBVIRT_RESULT_QEMU_PRIVILEGES], [
-  if test "$QEMU_USER" = "root"; then
-    LIBVIRT_RESULT([QEMU], [$QEMU_USER:$QEMU_GROUP],
-                   [!!! running QEMU as root is strongly discouraged !!!])
-  else
-    LIBVIRT_RESULT([QEMU], [$QEMU_USER:$QEMU_GROUP])
-  fi
-])
diff --git a/meson.build b/meson.build
index cae9743f5b2..b7710bd0fcb 100644
--- a/meson.build
+++ b/meson.build
@@ -1689,6 +1689,121 @@ elif get_option('driver_openvz').enabled()
   error('OpenVZ driver can be enabled on Linux only')
 endif
 
+if not get_option('driver_qemu').disabled()
+  use_qemu = true
+
+  if not yajl_dep.found()
+    use_qemu = false
+    if get_option('driver_qemu').enabled()
+      error('YAJL 2 is required to build QEMU driver')
+    endif
+  endif
+
+  if not conf.has('WITH_LIBVIRTD')
+    use_qemu = false
+    if get_option('driver_qemu').enabled()
+      error('libvirtd is required to build QEMU driver')
+    endif
+  endif
+
+  if use_qemu
+    conf.set('WITH_QEMU', 1)
+
+    if host_machine.system() in ['freebsd', 'darwin']
+      default_qemu_user = 'root'
+      default_qemu_group = 'wheel'
+    else
+      os_release = run_command('grep', '^ID=', '/etc/os-release').stdout()
+      if os_release.contains('arch')
+        default_qemu_user = 'nobody'
+        default_qemu_group = 'nobody'
+      elif ( os_release.contains('centos') or
+             os_release.contains('fedora') or
+             os_release.contains('gentoo') or
+             os_release.contains('rhel') or
+             os_release.contains('suse'))
+        default_qemu_user = 'qemu'
+        default_qemu_group = 'qemu'
+      elif os_release.contains('debian')
+        default_qemu_user = 'libvirt-qemu'
+        default_qemu_group = 'libvirt-qemu'
+      elif os_release.contains('ubuntu')
+        default_qemu_user = 'libvirt-qemu'
+        default_qemu_group = 'kvm'
+      else
+        default_qemu_user = 'root'
+        default_qemu_group = 'root'
+      endif
+      # If the expected user and group don't exist, or we haven't hit any
+      # of the cases above bacuse we're running on an unknown OS, the only
+      # sensible fallback is root:root
+      if ( run_command('getent', 'passwd', default_qemu_user).returncode() != 0 and
+           run_command('getent', 'group', default_qemu_group).returncode() != 0 )
+        default_qemu_user = 'root'
+        default_qemu_group = 'root'
+      endif
+    endif
+    qemu_user = get_option('qemu_user')
+    if qemu_user == ''
+      qemu_user = default_qemu_user
+    endif
+    qemu_group = get_option('qemu_group')
+    if qemu_group == ''
+      qemu_group = default_qemu_group
+    endif
+    conf.set_quoted('QEMU_USER', qemu_user)
+    conf.set_quoted('QEMU_GROUP', qemu_group)
+
+    qemu_bridge_prog = find_program(
+      'qemu-bridge-helper',
+      dirs: [ '/usr/libexec', '/usr/lib/qemu', '/usr/lib' ],
+      required: false
+    )
+    if qemu_bridge_prog.found()
+      qemu_bridge_path = qemu_bridge_prog.path()
+    else
+      qemu_bridge_path = '/usr/libexec/qemu-bridge-helper'
+    endif
+    conf.set_quoted('QEMU_BRIDGE_HELPER', qemu_bridge_path)
+
+    qemu_pr_prog = find_program(
+      'qemu-pr-helper',
+      dirs: [ '/usr/bin', '/usr/libexec' ],
+      required: false
+    )
+    if qemu_pr_prog.found()
+      qemu_pr_path = qemu_pr_prog.path()
+    else
+      qemu_pr_path = '/usr/bin/qemu-pr-helper'
+    endif
+    conf.set_quoted('QEMU_PR_HELPER', qemu_pr_path)
+
+    qemu_slirp_prog = find_program(
+      'slirp-helper',
+      dirs: [ '/usr/bin', '/usr/libexec' ],
+      required: false
+    )
+    if qemu_slirp_prog.found()
+      qemu_slirp_path = qemu_slirp_prog.path()
+    else
+      qemu_slirp_path = '/usr/bin/slirp-helper'
+    endif
+    conf.set_quoted('QEMU_SLIRP_HELPER', qemu_slirp_path)
+
+    qemu_dbus_daemon_prog = find_program(
+      'dbus-daemon',
+      dirs: [ '/usr/bin', '/usr/libexec' ],
+      required: false
+    )
+    if qemu_dbus_daemon_prog.found()
+      qemu_dbus_daemon_path = qemu_dbus_daemon_prog.path()
+    else
+      qemu_dbus_daemon_path = '/usr/bin/dbus-daemon'
+    endif
+    conf.set_quoted('QEMU_DBUS_DAEMON', qemu_dbus_daemon_path)
+  endif
+endif
+
 
 # define top include directory
 
@@ -1709,6 +1824,7 @@ configure_file(output: 'meson-config.h', configuration: conf)
 # print configuration summary
 
 driver_summary = {
+  'QEMU': conf.has('WITH_QEMU'),
   'OpenVZ': conf.has('WITH_OPENVZ'),
   'libxl': conf.has('WITH_LIBXL'),
   'LXC': conf.has('WITH_LXC'),
@@ -1783,3 +1899,14 @@ devtools_summary = {
   'wireshark_dissector': wireshark_dep.found(),
 }
 summary(devtools_summary, section: 'Developer Tools', bool_yn: true)
+
+if conf.has('WITH_QEMU')
+  qemu_warn = ''
+  if qemu_user == 'root'
+    qemu_warn = ' !!! running QEMU as root is strongly discouraged !!!'
+  endif
+  priv_summary = {
+    'QEMU': '@0@:@1@@2@'.format(qemu_user, qemu_group, qemu_warn),
+  }
+  summary(priv_summary, section: 'Privileges')
+endif
diff --git a/meson_options.txt b/meson_options.txt
index dbe56561752..4f8cddd0aee 100644
--- a/meson_options.txt
+++ b/meson_options.txt
@@ -54,5 +54,8 @@ option('driver_libvirtd', type: 'feature', value: 'auto', description: 'libvirtd
 option('driver_libxl', type: 'feature', value: 'auto', description: 'libxenlight driver')
 option('driver_lxc', type: 'feature', value: 'auto', description: 'Linux Container driver')
 option('driver_openvz', type: 'feature', value: 'auto', description: 'OpenVZ driver')
+option('driver_qemu', type: 'feature', value: 'auto', description: 'QEMU/KVM driver')
+option('qemu_user', type: 'string', value: '', description: 'username to run QEMU system instance as')
+option('qemu_group', type: 'string', value: '', description: 'groupname to run QEMU system instance as')
 option('driver_remote', type: 'feature', value: 'enabled', description: 'remote driver')
 option('remote_default_mode', type: 'combo', choices: ['legacy', 'direct'], value: 'legacy', description: 'remote driver default mode')
-- 
2.26.2




More information about the libvir-list mailing list