################################################################################
#
# libvirt
#
################################################################################

LIBVIRT_VERSION = 7.10.0
LIBVIRT_SITE = https://libvirt.org/sources
LIBVIRT_SOURCE = libvirt-$(LIBVIRT_VERSION).tar.xz
LIBVIRT_LICENSE = LGPL-2.1+
LIBVIRT_LICENSE_FILES = COPYING
LIBVIRT_CPE_ID_VENDOR = redhat
LIBVIRT_INSTALL_STAGING = YES
LIBVIRT_DEPENDENCIES = \
	host-libxslt \
	host-nfs-utils \
	host-pkgconf \
	host-python-docutils \
	gnutls \
	libglib2 \
	libpciaccess \
	libtirpc \
	libxml2 \
	udev \
	zlib \
	$(TARGET_NLS_DEPENDENCIES)

LIBVIRT_LDFLAGS = $(TARGET_LDFLAGS) $(TARGET_NLS_LIBS)

LIBVIRT_CONF_ENV += \
	CFLAGS="$(TARGET_CFLAGS) `$(PKG_CONFIG_HOST_BINARY) --cflags libtirpc`" \
	LIBS="`$(PKG_CONFIG_HOST_BINARY) --libs libtirpc`"

LIBVIRT_CONF_OPTS = \
	-Drpath=disabled \
	-Dapparmor=disabled \
	-Ddocs=disabled \
	-Ddriver_bhyve=disabled \
	-Ddriver_ch=disabled \
	-Ddriver_esx=disabled \
	-Ddriver_hyperv=disabled \
	-Ddriver_libxl=disabled \
	-Ddriver_openvz=disabled \
	-Ddriver_remote=enabled \
	-Ddriver_secrets=enabled \
	-Ddriver_test=disabled \
	-Ddriver_vbox=disabled \
	-Ddriver_vmware=disabled \
	-Ddriver_vz=disabled \
	-Ddtrace=disabled \
	-Dexpensive_tests=disabled \
	-Dfirewalld=disabled \
	-Dfirewalld_zone=disabled \
	-Dglusterfs=disabled \
	-Dhost_validate=enabled \
	-Dinit_script=$(if $(BR2_INIT_SYSTEMD),systemd,none) \
	-Dlogin_shell=disabled \
	-Dnetcf=disabled \
	-Dnls=$(if $(BR2_SYSTEM_ENABLE_NLS),enabled,disabled) \
	-Dnumad=disabled \
	-Dopenwsman=disabled \
	-Dpciaccess=enabled \
	-Dpm_utils=disabled \
	-Dsanlock=disabled \
	-Dsasl=disabled \
	-Dsecdriver_apparmor=disabled \
	-Dstorage_iscsi=disabled \
	-Dstorage_iscsi_direct=disabled \
	-Dstorage_mpath=disabled \
	-Dsysctl_config=enabled \
	-Dtest_coverage=false \
	-Dtests=disabled \
	-Dudev=enabled \
	-Dwireshark_dissector=disabled

# warning_level should only drive the level of warnings during the
# compilation of C code. However, libvirt misuses that to also
# enable SSP when warning_level == 2
# Force warning_level=1 to disable SSP, and let our toolchain wrapper
# handle it.
LIBVIRT_CONF_OPTS += -Dwarning_level=1

ifeq ($(BR2_PACKAGE_ATTR),y)
LIBVIRT_CONF_OPTS += -Dattr=enabled
LIBVIRT_DEPENDENCIES += attr
else
LIBVIRT_CONF_OPTS += -Dattr=disabled
endif

ifeq ($(BR2_PACKAGE_AUDIT),y)
LIBVIRT_CONF_OPTS += -Daudit=enabled
LIBVIRT_DEPENDENCIES += audit
else
LIBVIRT_CONF_OPTS += -Daudit=disabled
endif

ifeq ($(BR2_PACKAGE_BASH_COMPLETION),y)
LIBVIRT_CONF_OPTS += -Dbash_completion=enabled
LIBVIRT_DEPENDENCIES += bash-completion
else
LIBVIRT_CONF_OPTS += -Dbash_completion=disabled
endif

ifeq ($(BR2_PACKAGE_UTIL_LINUX_LIBBLKID),y)
LIBVIRT_CONF_OPTS += -Dblkid=enabled
LIBVIRT_DEPENDENCIES += util-linux
else
LIBVIRT_CONF_OPTS += -Dblkid=disabled
endif

ifeq ($(BR2_PACKAGE_LIBCAP_NG),y)
LIBVIRT_CONF_OPTS += -Dcapng=enabled
LIBVIRT_DEPENDENCIES += libcap-ng
else
LIBVIRT_CONF_OPTS += -Dcapng=disabled
endif

ifeq ($(BR2_PACKAGE_LIBCURL),y)
LIBVIRT_CONF_OPTS += -Dcurl=enabled
LIBVIRT_DEPENDENCIES += libcurl
else
LIBVIRT_CONF_OPTS += -Dcurl=disabled
endif

ifeq ($(BR2_PACKAGE_LIBFUSE),y)
LIBVIRT_CONF_OPTS += -Dfuse=enabled
LIBVIRT_DEPENDENCIES += libfuse
else
LIBVIRT_CONF_OPTS += -Dfuse=disabled
endif

ifeq ($(BR2_PACKAGE_LIBISCSI),y)
LIBVIRT_CONF_OPTS += -Dlibiscsi=enabled
LIBVIRT_DEPENDENCIES += libiscsi
else
LIBVIRT_CONF_OPTS += -Dlibiscsi=disabled
endif

ifeq ($(BR2_PACKAGE_LIBNL),y)
LIBVIRT_CONF_OPTS += -Dlibnl=enabled
LIBVIRT_DEPENDENCIES += libnl
else
LIBVIRT_CONF_OPTS += -Dlibnl=disabled
endif

ifeq ($(BR2_PACKAGE_LIBPCAP),y)
LIBVIRT_CONF_OPTS += -Dlibpcap=enabled
LIBVIRT_DEPENDENCIES += libpcap
else
LIBVIRT_CONF_OPTS += -Dlibpcap=disabled
endif

ifeq ($(BR2_PACKAGE_NUMACTL),y)
LIBVIRT_CONF_OPTS += -Dnumactl=enabled
LIBVIRT_DEPENDENCIES += numactl
else
LIBVIRT_CONF_OPTS += -Dnumactl=disabled
endif

ifeq ($(BR2_PACKAGE_POLKIT),y)
LIBVIRT_CONF_OPTS += -Dpolkit=enabled
LIBVIRT_DEPENDENCIES += polkit
else
LIBVIRT_CONF_OPTS += -Dpolkit=disabled
endif

ifeq ($(BR2_PACKAGE_READLINE),y)
LIBVIRT_CONF_OPTS += -Dreadline=enabled
LIBVIRT_DEPENDENCIES += readline
else
LIBVIRT_CONF_OPTS += -Dreadline=disabled
endif

ifeq ($(BR2_PACKAGE_LIBSELINUX),y)
LIBVIRT_CONF_OPTS += -Dselinux=enabled -Dsecdriver_selinux=enabled \
	-Dselinux_mount=/sys/fs/selinux
LIBVIRT_DEPENDENCIES += libselinux
else
LIBVIRT_CONF_OPTS += -Dselinux=disabled -Dsecdriver_selinux=disabled
endif

ifeq ($(BR2_PACKAGE_LVM2_STANDARD_INSTALL),y)
LIBVIRT_CONF_OPTS += -Dstorage_lvm=enabled
LIBVIRT_DEPENDENCIES += host-lvm2 lvm2
else
LIBVIRT_CONF_OPTS += -Dstorage_lvm=disabled
endif

ifeq ($(BR2_PACKAGE_YAJL),y)
LIBVIRT_CONF_OPTS += -Dyajl=enabled
LIBVIRT_DEPENDENCIES += yajl
else
LIBVIRT_CONF_OPTS += -Dyajl=disabled
endif

ifeq ($(BR2_PACKAGE_LIBVIRT_DAEMON),y)
# Network is used by daemon, only
LIBVIRT_CONF_OPTS += \
	-Ddriver_interface=enabled \
	-Ddriver_libvirtd=enabled \
	-Ddriver_network=enabled

ifeq ($(BR2_PACKAGE_LIBSSH),y)
LIBVIRT_CONF_OPTS += -Dlibssh=enabled
LIBVIRT_DEPENDENCIES += libssh
else
LIBVIRT_CONF_OPTS += -Dlibssh=disabled
endif

# Can't build nss plugin without network or yajl
ifeq ($(BR2_PACKAGE_LIBNSS)$(BR2_PACKAGE_YAJL),yy)
LIBVIRT_CONF_OPTS += -Dnss=enabled
LIBVIRT_DEPENDENCIES += libnss
else
LIBVIRT_CONF_OPTS += -Dnss=disabled
endif

ifeq ($(BR2_PACKAGE_LIBSSH2),y)
LIBVIRT_CONF_OPTS += -Dlibssh2=enabled
LIBVIRT_DEPENDENCIES += libssh2
else
LIBVIRT_CONF_OPTS += -Dlibssh2=disabled
endif

ifeq ($(BR2_PACKAGE_LIBVIRT_LXC),y)
LIBVIRT_CONF_OPTS += -Dlogin_shell=enabled -Ddriver_lxc=enabled
LIBVIRT_DEPENDENCIES += lxc
else
LIBVIRT_CONF_OPTS += -Dlogin_shell=disabled -Ddriver_lxc=disabled
endif

ifeq ($(BR2_PACKAGE_LIBVIRT_QEMU),y)
LIBVIRT_CONF_OPTS += -Ddriver_qemu=enabled -Dqemu_user=qemu -Dqemu_group=kvm
else
LIBVIRT_CONF_OPTS += -Ddriver_qemu=disabled -Dqemu_user=no -Dqemu_group=no
endif

else # BR2_PACKAGE_LIBVIRT_DAEMON

LIBVIRT_CONF_OPTS += \
	-Ddriver_interface=disabled \
	-Ddriver_libvirtd=disabled \
	-Ddriver_network=disabled

endif

define LIBVIRT_INSTALL_UDEV_RULES
	$(INSTALL) -D -m 644 package/libvirt/90-kvm.rules \
		$(TARGET_DIR)/etc/udev/rules.d/90-kvm.rules
endef
LIBVIRT_POST_INSTALL_TARGET_HOOKS += LIBVIRT_INSTALL_UDEV_RULES

# Adjust directory ownerships and permissions. Notice /var/log is a symlink to
# /tmp in the default sysvinit skeleton, so some directories may disappear at
# run-time. Set the permissions anyway, since they are valid for the default
# systemd skeleton.
define LIBVIRT_PERMISSIONS
	/etc/libvirt                             d  700  root  root  -  -  -  -  -
	/etc/libvirt/nwfilter                    d  700  root  root  -  -  -  -  -
	/var/lib/libvirt                         d  755  root  root  -  -  -  -  -
	/var/lib/libvirt/boot                    d  711  root  root  -  -  -  -  -
	/var/lib/libvirt/dnsmasq                 d  755  root  root  -  -  -  -  -
	/var/lib/libvirt/filesystems             d  711  root  root  -  -  -  -  -
	/var/lib/libvirt/images                  d  711  root  root  -  -  -  -  -
	/var/lib/libvirt/network                 d  700  root  root  -  -  -  -  -
	/var/lib/libvirt/qemu                    d  751  qemu  kvm   -  -  -  -  -
	/var/lib/libvirt/qemu/autostart          d  700  root  root  -  -  -  -  -
	/var/lib/libvirt/qemu/networks           d  700  root  root  -  -  -  -  -
	/var/lib/libvirt/qemu/networks/autostart d  700  root  root  -  -  -  -  -
	/var/lib/libvirt/qemu/channel            d  755  qemu  kvm   -  -  -  -  -
	/var/lib/libvirt/qemu/channel/target     d  755  qemu  kvm   -  -  -  -  -
	/var/lib/libvirt/qemu/dump               d  755  qemu  kvm   -  -  -  -  -
	/var/lib/libvirt/qemu/nvram              d  755  qemu  kvm   -  -  -  -  -
	/var/lib/libvirt/qemu/save               d  755  qemu  kvm   -  -  -  -  -
	/var/lib/libvirt/qemu/snapshot           d  755  qemu  kvm   -  -  -  -  -
	/var/lib/libvirt/secrets                 d  700  root  root  -  -  -  -  -
	/var/lib/libvirt/storage                 d  755  root  root  -  -  -  -  -
	/var/lib/libvirt/storage/autostart       d  755  root  root  -  -  -  -  -
	/var/cache/libvirt                       d  711  root  root  -  -  -  -  -
	/var/cache/libvirt/lxc                   d  750  root  root  -  -  -  -  -
	/var/cache/libvirt/qemu                  d  750  qemu  kvm   -  -  -  -  -
	/var/cache/libvirt/qemu/capabilities     d  755  root  root  -  -  -  -  -
	/var/log/libvirt                         d  700  root  root  -  -  -  -  -
	/var/log/libvirt/lxc                     d  750  root  root  -  -  -  -  -
	/var/log/libvirt/qemu                    d  750  root  root  -  -  -  -  -
	/var/log/swtpm                           d  755  root  root  -  -  -  -  -
	/var/log/swtpm/libvirt                   d  755  root  root  -  -  -  -  -
	/var/log/swtpm/libvirt/qemu              d  711  root  root  -  -  -  -  -
endef

# libvirt may need to create persistent files (e.g. VM definitions) in these
# directories. Move them to /var/lib because /etc may be on a read-only or
# volatile (initramfs) filesystem. We could tweak the code to change these
# paths but the patch would be large and would break compatibility with
# ordinary installations and with the documentation.
define LIBVIRT_CREATE_SYMLINKS
	$(INSTALL) -m 700 -d $(TARGET_DIR)/etc/libvirt
	$(INSTALL) -m 755 -d $(TARGET_DIR)/var/lib/libvirt
	$(INSTALL) -m 751 -d $(TARGET_DIR)/var/lib/libvirt/qemu
	$(INSTALL) -m 700 -d $(TARGET_DIR)/var/lib/libvirt/secrets
	$(INSTALL) -m 755 -d $(TARGET_DIR)/var/lib/libvirt/storage
	ln -s -f ../../var/lib/libvirt/qemu $(TARGET_DIR)/etc/libvirt/
	ln -s -f ../../var/lib/libvirt/secrets $(TARGET_DIR)/etc/libvirt/
	ln -s -f ../../var/lib/libvirt/storage $(TARGET_DIR)/etc/libvirt/
endef

LIBVIRT_PRE_INSTALL_TARGET_HOOKS += LIBVIRT_CREATE_SYMLINKS

ifeq ($(BR2_PACKAGE_LIBVIRT_QEMU),y)
define LIBVIRT_USERS
	qemu -1 kvm -1 * - - - Libvirt qemu/kvm daemon
endef
endif

ifeq ($(BR2_PACKAGE_LIBVIRT_DAEMON),y)
define LIBVIRT_INSTALL_INIT_SYSV
	$(INSTALL) -D -m 0755 package/libvirt/S91virtlogd $(TARGET_DIR)/etc/init.d/S91virtlogd
	$(INSTALL) -D -m 0755 package/libvirt/S92libvirtd $(TARGET_DIR)/etc/init.d/S92libvirtd
endef
endif

$(eval $(meson-package))
