[libvirt] [PATCH] Refactor libvirt.spec to allow client-only builds

Daniel P. Berrange berrange at redhat.com
Thu Sep 17 12:14:22 UTC 2009


Some architectures in certain RHEL versions do not include any
hypervisors. Update the specfile to allow those to easily build
a remote client only version of libvirt. ie no libvirtd related
bits at all.

* qemud/Makefile.am: Always instal SASL config since its needed
  by client too
* libvirt.spec.in: Re-factor specfile conditionals to allow entire
  server side build to be disabled easily, eg a remote client only
  build. Make RHEL-5 do client only build for s390/ppc. Enable LXC
  on RHEL-6. Enable all Fedora >= 6 features on RHEL-6 too. Add some
  more conditionals around dnsmasq/iptables/hal Requires tags.
  Add missing e2fsprogs-devel BR for RHEL-5 as workaround for broken
  parted. Fix the device mapper BR for RHEL-5. Add conditional rules
  for ESX build. Add conditional rules for SELinux + HAL builds.
  Fix a mistaken %{with_qemu} to be %{with_network} when setting
  up default network XML
---
 libvirt.spec.in   |  214 ++++++++++++++++++++++++++++++++++++++++-------------
 qemud/Makefile.am |   31 ++++----
 2 files changed, 180 insertions(+), 65 deletions(-)

diff --git a/libvirt.spec.in b/libvirt.spec.in
index f4cfbf1..0ab3b4e 100644
--- a/libvirt.spec.in
+++ b/libvirt.spec.in
@@ -1,60 +1,133 @@
 # -*- rpm-spec -*-
 
-%define with_xen           0%{!?_without_xen:1}
-%define with_xen_proxy     0%{!?_without_xen_proxy:1}
-%define with_qemu          0%{!?_without_qemu:1}
-%define with_openvz        0%{!?_without_openvz:1}
-%define with_lxc           0%{!?_without_lxc:1}
-%define with_vbox          0%{!?_without_vbox:1}
-%define with_sasl          0%{!?_without_sasl:1}
-%define with_avahi         0%{!?_without_avahi:1}
-%define with_python        0%{!?_without_python:1}
-%define with_libvirtd      0%{!?_without_libvirtd:1}
-%define with_uml           0%{!?_without_uml:1}
-%define with_one           0%{!?_without_one:1}
-%define with_phyp          0%{!?_without_phyp:1}
-%define with_network       0%{!?_without_network:1}
-%define with_storage_fs    0%{!?_without_storage_fs:1}
-%define with_storage_lvm   0%{!?_without_storage_lvm:1}
-%define with_storage_iscsi 0%{!?_without_storage_iscsi:1}
-%define with_storage_disk  0%{!?_without_storage_disk:1}
-%define with_storage_mpath 0%{!?_without_storage_mpath:1}
-%define with_numactl       0%{!?_without_numactl:1}
-
-# default to off - selectively enabled below
+# A client only build will create a libvirt.so only containing
+# the generic RPC driver, and test driver and no libvirtd
+# Default to a full server + client build
+%define client_only        0
+
+# Now turn off server build in certain cases
+
+# RHEL-5 builds are client-only for s390, ppc
+%if 0%{?rhel} == 5
+%ifnarch i386 i586 i686 x86_64 ia64
+%define client_only        1
+%endif
+%endif
+
+# Disable all server side drivers if client only build requested
+%if %{client_only}
+%define server_drivers     0
+%else
+%define server_drivers     1
+%endif
+
+
+# Now set the defaults for all the important features, independant
+# of any particular OS
+
+# First the daemon itself
+%define with_libvirtd      0%{!?_without_libvirtd:%{server_drivers}}
+%define with_avahi         0%{!?_without_avahi:%{server_drivers}}
+
+# Then the hypervisor drivers
+%define with_xen           0%{!?_without_xen:%{server_drivers}}
+%define with_xen_proxy     0%{!?_without_xen_proxy:%{server_drivers}}
+%define with_qemu          0%{!?_without_qemu:%{server_drivers}}
+%define with_openvz        0%{!?_without_openvz:%{server_drivers}}
+%define with_lxc           0%{!?_without_lxc:%{server_drivers}}
+%define with_vbox          0%{!?_without_vbox:%{server_drivers}}
+%define with_uml           0%{!?_without_uml:%{server_drivers}}
+%define with_one           0%{!?_without_one:%{server_drivers}}
+%define with_phyp          0%{!?_without_phyp:%{server_drivers}}
+%define with_esx           0%{!?_without_esx:%{server_drivers}}
+
+# Then the secondary host drivers
+%define with_network       0%{!?_without_network:%{server_drivers}}
+%define with_storage_fs    0%{!?_without_storage_fs:%{server_drivers}}
+%define with_storage_lvm   0%{!?_without_storage_lvm:%{server_drivers}}
+%define with_storage_iscsi 0%{!?_without_storage_iscsi:%{server_drivers}}
+%define with_storage_disk  0%{!?_without_storage_disk:%{server_drivers}}
+%define with_storage_mpath 0%{!?_without_storage_mpath:%{server_drivers}}
+%define with_numactl       0%{!?_without_numactl:%{server_drivers}}
+%define with_selinux       0%{!?_without_selinux:%{server_drivers}}
+%define with_hal           0%{!?_without_hal:%{server_drivers}}
+
+# A few optional bits off by default, we enable later
 %define with_polkit        0%{!?_without_polkit:0}
 %define with_capng         0%{!?_without_capng:0}
 %define with_netcf         0%{!?_without_netcf:0}
 
+# Non-server/HV driver defaults which are always enabled
+%define with_python        0%{!?_without_python:1}
+%define with_sasl          0%{!?_without_sasl:1}
+
+
+# Finally set the OS / architecture specific special cases
+
 # Xen is available only on i386 x86_64 ia64
 %ifnarch i386 i586 i686 x86_64 ia64
 %define with_xen 0
 %endif
 
+
+# RHEL doesn't ship OpenVZ, VBox, UML, OpenNebula, PowerHypervisor or ESX
+%if 0%{?rhel}
+%define with_openvz 0
+%define with_vbox 0
+%define with_uml 0
+%define with_one 0
+%define with_phyp 0
+%define with_esx 0
+%endif
+
+# RHEL-5 has restricted QEMU to x86_64 only and is too old for LXC
+%if 0%{?rhel} == 5
+%ifnarch x86_64
+%define with_qemu 0
+%endif
+%define with_lxc 0
+%endif
+
+# RHEL-6 has restricted QEMU to x86_64 only, stopped including Xen
+# on all archs. Other archs all have LXC available though
+%if 0%{?rhel} >= 6
+%ifnarch x86_64
+%define with_qemu 0
+%endif
+%define with_xen 0
+%endif
+
+# If Xen isn't turned on, we shouldn't build the xen proxy either
 %if ! %{with_xen}
 %define with_xen_proxy 0
 %endif
 
+# Fedora doesn't have any QEMU on ppc64 - only ppc
 %if 0%{?fedora}
 %ifarch ppc64
 %define with_qemu 0
 %endif
 %endif
 
-%if 0%{?fedora} >= 8
+# PolicyKit was introduced in Fedora 8 / RHEL-6 or newer, allowing
+# the setuid Xen proxy to be killed off
+%if 0%{?fedora} >= 8 || 0%{?rhel} >= 6
 %define with_polkit    0%{!?_without_polkit:1}
 %define with_xen_proxy 0
 %endif
 
-%if 0%{?fedora} >= 12
+# libcapng is used to manage capabilities in Fedora 12 / RHEL-6 or newer
+%if 0%{?fedora} >= 12 || 0%{?rhel} >= 6
 %define with_capng     0%{!?_without_capng:1}
 %endif
 
-%if 0%{?fedora} >= 12
-%define with_netcf     0%{!?_without_netcf:1}
+# netcf is used to manage network interfaces in Fedora 12 / RHEL-6 or newer
+%if 0%{?fedora} >= 12 || 0%{?rhel} >= 6
+%define with_netcf     0%{!?_without_netcf:%{server_drivers}}
 %endif
 
-%if 0%{?fedora} >= 12
+# Force QEMU to run as non-root
+%if 0%{?fedora} >= 12 || 0%{?rhel} >= 6
 %define qemu_user  qemu
 %define qemu_group  qemu
 %else
@@ -62,15 +135,13 @@
 %define qemu_group  root
 %endif
 
-#
-# If building on RHEL switch on the specific support
-#
-%if 0%{?fedora}
-%define with_rhel5  0
-%else
+
+# The RHEL-5 Xen package has some feature backports. This
+# flag is set to enable use of those special bits on RHEL-5
+%if 0%{?rhel} == 5
 %define with_rhel5  1
-%define with_polkit 0
-%define with_one    0
+%else
+%define with_rhel5  0
 %endif
 
 
@@ -88,13 +159,21 @@ BuildRequires: python-devel
 # The client side, i.e. shared libs and virsh are in a subpackage
 Requires: libvirt-client = %{version}-%{release}
 
-Requires: dnsmasq
+# Used by many of the drivers, so turn it on whenever the
+# daemon is present
+%if %{with_libvirtd}
 Requires: bridge-utils
+%endif
+%if %{with_network}
+Requires: dnsmasq
 Requires: iptables
+%endif
 # needed for device enumeration
+%if %{with_hal}
 Requires: hal
+%endif
 %if %{with_polkit}
-%if 0%{?fedora} >= 12
+%if 0%{?fedora} >= 12 || 0%{?rhel} >=6
 Requires: polkit >= 0.93
 %else
 Requires: PolicyKit >= 0.6
@@ -153,18 +232,24 @@ BuildRequires: readline-devel
 BuildRequires: ncurses-devel
 BuildRequires: gettext
 BuildRequires: gnutls-devel
+%if %{with_hal}
 BuildRequires: hal-devel
+%endif
 %if %{with_avahi}
 BuildRequires: avahi-devel
 %endif
+%if %{with_selinux}
 BuildRequires: libselinux-devel
+%endif
+%if %{with_network}
 BuildRequires: dnsmasq
+%endif
 BuildRequires: bridge-utils
 %if %{with_sasl}
 BuildRequires: cyrus-sasl-devel
 %endif
 %if %{with_polkit}
-%if 0%{?fedora} >= 12
+%if 0%{?fedora} >= 12 || 0%{?rhel} >= 6
 # Only need the binary, not -devel
 BuildRequires: polkit >= 0.93
 %else
@@ -195,11 +280,20 @@ BuildRequires: iscsi-initiator-utils
 %if %{with_storage_disk}
 # For disk driver
 BuildRequires: parted-devel
+%if 0%{?rhel} == 5
+# Broken RHEL-5 parted RPM is missing a dep
+BuildRequires: e2fsprogs-devel
+%endif
 %endif
 %if %{with_storage_mpath}
 # For Multipath support
+%if 0%{?rhel} == 5
+# Broken RHEL-5 packaging has header files in main RPM :-(
+BuildRequires: device-mapper
+%else
 BuildRequires: device-mapper-devel
 %endif
+%endif
 %if %{with_numactl}
 # For QEMU/LXC numa info
 BuildRequires: numactl-devel
@@ -303,6 +397,10 @@ of recent versions of Linux (and other OSes).
 %define _without_phyp --without-phyp
 %endif
 
+%if ! %{with_esx}
+%define _without_esx --without-esx
+%endif
+
 %if ! %{with_polkit}
 %define _without_polkit --without-polkit
 %endif
@@ -363,6 +461,14 @@ of recent versions of Linux (and other OSes).
 %define _without_netcf --without-netcf
 %endif
 
+%if ! %{with_selinux}
+%define _without_selinux --without-selinux
+%endif
+
+%if ! %{with_hal}
+%define _without_hal --without-hal
+%endif
+
 %configure %{?_without_xen} \
            %{?_without_qemu} \
            %{?_without_openvz} \
@@ -376,6 +482,7 @@ of recent versions of Linux (and other OSes).
            %{?_without_uml} \
            %{?_without_one} \
            %{?_without_phyp} \
+           %{?_without_esx} \
            %{?_without_network} \
            %{?_with_rhel5_api} \
            %{?_without_storage_fs} \
@@ -386,6 +493,8 @@ of recent versions of Linux (and other OSes).
            %{?_without_numactl} \
            %{?_without_capng} \
            %{?_without_netcf} \
+           %{?_without_selinux} \
+           %{?_without_hal} \
            --with-qemu-user=%{qemu_user} \
            --with-qemu-group=%{qemu_group} \
            --with-init-script=redhat \
@@ -406,7 +515,7 @@ rm -f $RPM_BUILD_ROOT%{_libdir}/*.a
 rm -f $RPM_BUILD_ROOT%{_libdir}/python*/site-packages/*.la
 rm -f $RPM_BUILD_ROOT%{_libdir}/python*/site-packages/*.a
 
-%if %{with_qemu}
+%if %{with_network}
 # We don't want to install /etc/libvirt/qemu/networks in the main %files list
 # because if the admin wants to delete the default network completely, we don't
 # want to end up re-incarnating it on every RPM upgrade.
@@ -420,6 +529,8 @@ sed -i -e "/<uuid>/d" $RPM_BUILD_ROOT%{_datadir}/libvirt/networks/default.xml
 %else
 rm -f $RPM_BUILD_ROOT%{_sysconfdir}/libvirt/qemu/networks/default.xml
 rm -f $RPM_BUILD_ROOT%{_sysconfdir}/libvirt/qemu/networks/autostart/default.xml
+%endif
+%if ! %{with_qemu}
 rm -f $RPM_BUILD_ROOT%{_datadir}/augeas/lenses/libvirtd_qemu.aug
 rm -f $RPM_BUILD_ROOT%{_datadir}/augeas/lenses/tests/test_libvirtd_qemu.aug
 %endif
@@ -429,6 +540,10 @@ rm -f $RPM_BUILD_ROOT%{_datadir}/augeas/lenses/tests/test_libvirtd_qemu.aug
 rm -rf $RPM_BUILD_ROOT%{_datadir}/doc/libvirt-python-%{version}
 %endif
 
+%if %{client_only}
+rm -rf $RPM_BUILD_ROOT%{_datadir}/doc/libvirt-%{version}
+%endif
+
 %if ! %{with_qemu}
 rm -rf $RPM_BUILD_ROOT%{_sysconfdir}/libvirt/qemu.conf
 %endif
@@ -441,9 +556,9 @@ chmod 0644 $RPM_BUILD_ROOT%{_sysconfdir}/sysconfig/libvirtd
 rm -fr %{buildroot}
 
 %pre
-%if 0%{?fedora} >= 12
+%if 0%{?fedora} >= 12 || 0%{?rhel} >= 6
 # Normally 'setup' adds this in /etc/passwd, but this is
-# here for case of upgrades from earlier Fedora. This
+# here for case of upgrades from earlier Fedora/RHEL. This
 # UID/GID pair is reserved for qemu:qemu
 getent group kvm >/dev/null || groupadd -g 36 -r kvm
 getent group qemu >/dev/null || groupadd -g 107 -r qemu
@@ -455,7 +570,7 @@ getent passwd qemu >/dev/null || \
 %post
 
 %if %{with_libvirtd}
-%if %{with_qemu}
+%if %{with_network}
 # We want to install the default network for initial RPM installs
 # or on the first upgrade from a non-network aware libvirt only.
 # We check this by looking to see if the daemon is already installed
@@ -488,31 +603,31 @@ fi
 
 %postun client -p /sbin/ldconfig
 
+%if %{with_libvirtd}
 %files
 %defattr(-, root, root)
 
 %doc AUTHORS ChangeLog.gz NEWS README COPYING.LIB TODO
 %dir %attr(0700, root, root) %{_sysconfdir}/libvirt/
 
-%if %{with_qemu}
+%if %{with_network}
 %dir %attr(0700, root, root) %{_sysconfdir}/libvirt/qemu/
 %dir %attr(0700, root, root) %{_sysconfdir}/libvirt/qemu/networks/
 %dir %attr(0700, root, root) %{_sysconfdir}/libvirt/qemu/networks/autostart
 %endif
 
-%if %{with_libvirtd}
 %{_sysconfdir}/rc.d/init.d/libvirtd
 %config(noreplace) %{_sysconfdir}/sysconfig/libvirtd
 %config(noreplace) %{_sysconfdir}/libvirt/libvirtd.conf
 %config(noreplace) %{_sysconfdir}/logrotate.d/libvirtd
-%endif
 
 %if %{with_qemu}
 %config(noreplace) %{_sysconfdir}/libvirt/qemu.conf
 %endif
 
-%if %{with_qemu}
 %dir %{_datadir}/libvirt/
+
+%if %{with_network}
 %dir %{_datadir}/libvirt/networks/
 %{_datadir}/libvirt/networks/default.xml
 %endif
@@ -550,13 +665,11 @@ fi
 %{_datadir}/augeas/lenses/tests/test_libvirtd_qemu.aug
 %endif
 
-%if %{with_libvirtd}
 %{_datadir}/augeas/lenses/libvirtd.aug
 %{_datadir}/augeas/lenses/tests/test_libvirtd.aug
-%endif
 
 %if %{with_polkit}
-%if 0%{?fedora} >= 12
+%if 0%{?fedora} >= 12 || 0%{?rhel} >= 6
 %{_datadir}/polkit-1/actions/org.libvirt.unix.policy
 %else
 %{_datadir}/PolicyKit/policy/org.libvirt.unix.policy
@@ -576,12 +689,11 @@ fi
 %attr(0755, root, root) %{_libexecdir}/libvirt_lxc
 %endif
 
-%if %{with_libvirtd}
 %attr(0755, root, root) %{_libexecdir}/libvirt_parthelper
 %attr(0755, root, root) %{_sbindir}/libvirtd
-%endif
 
 %doc docs/*.xml
+%endif
 
 %files client -f %{name}.lang
 %defattr(-, root, root)
diff --git a/qemud/Makefile.am b/qemud/Makefile.am
index 3d143da..7ebd3ca 100644
--- a/qemud/Makefile.am
+++ b/qemud/Makefile.am
@@ -180,7 +180,7 @@ install-data-local: install-init install-data-sasl install-data-polkit \
 	mkdir -p $(DESTDIR)$(localstatedir)/run/libvirt
 	mkdir -p $(DESTDIR)$(localstatedir)/lib/libvirt
 
-uninstall-local:: uninstall-init uninstall-data-sasl install-data-polkit
+uninstall-local:: uninstall-init install-data-sasl install-data-polkit
 	rm -f $(DESTDIR)$(sysconfdir)/libvirt/qemu/networks/autostart/default.xml
 	rm -f $(DESTDIR)$(sysconfdir)/$(default_xml_dest)
 	rmdir $(DESTDIR)$(sysconfdir)/libvirt/qemu/networks/autostart || :
@@ -188,19 +188,6 @@ uninstall-local:: uninstall-init uninstall-data-sasl install-data-polkit
 	rmdir $(DESTDIR)$(localstatedir)/run/libvirt || :
 	rmdir $(DESTDIR)$(localstatedir)/lib/libvirt || :
 
-if HAVE_SASL
-install-data-sasl:: install-init
-	mkdir -p $(DESTDIR)$(sysconfdir)/sasl2/
-	$(INSTALL_DATA) $(srcdir)/libvirtd.sasl $(DESTDIR)$(sysconfdir)/sasl2/libvirt.conf
-
-uninstall-data-sasl:: install-init
-	rm -f $(DESTDIR)$(sysconfdir)/sasl2/libvirt.conf
-	rmdir $(DESTDIR)$(sysconfdir)/sasl2/
-else
-install-data-sasl:
-uninstall-data-sasl:
-endif
-
 if HAVE_POLKIT
 install-data-polkit:: install-init
 	mkdir -p $(DESTDIR)$(policydir)
@@ -285,7 +272,23 @@ endif # DBUS_INIT_SCRIPTS_RED_HAT
 # are used by nearly every other library.
 libvirtd_LDADD += ../gnulib/lib/libgnu.la $(LIBSOCKET)
 
+else # WITH_LIBVIRTD
+install-data-local: install-data-sasl
+uninstall-local:: uninstall-data-sasl
 endif # WITH_LIBVIRTD
 
+# This is needed for clients too, so can't wrap in
+# the WITH_LIBVIRTD conditional
+if HAVE_SASL
+install-data-sasl:
+	mkdir -p $(DESTDIR)$(sysconfdir)/sasl2/
+	$(INSTALL_DATA) $(srcdir)/libvirtd.sasl $(DESTDIR)$(sysconfdir)/sasl2/libvirt.conf
+
+uninstall-data-sasl:
+	rm -f $(DESTDIR)$(sysconfdir)/sasl2/libvirt.conf
+	rmdir $(DESTDIR)$(sysconfdir)/sasl2/
+endif
+
+
 CLEANFILES = $(BUILT_SOURCES)
 CLEANFILES += *.cov *.gcov .libs/*.gcda .libs/*.gcno *.gcno *.gcda
-- 
1.6.2.5




More information about the libvir-list mailing list