#!/usr/bin/make -f

DEB_RELEASE = $(shell dpkg-parsechangelog -SVersion | sed 's/[^-]\+-//')
DEB_BUILDDATE = $(shell dpkg-parsechangelog -SDate)
DEB_BUILDUSER = $(shell dpkg-parsechangelog -SMaintainer)
NULL =

DEB_BUILD_MAINT_OPTIONS = hardening=+bindnow

# If the build environment sets -Bsymbolic-functions, which is often used as
# hardening option, that would break libvirt build time self-testing.
# Therefore let dpkg-buildflag strip that option if present.
DEB_LDFLAGS_MAINT_STRIP = -Wl,-Bsymbolic-functions

DPKG_EXPORT_BUILDFLAGS = 1
include /usr/share/dpkg/buildflags.mk

ifneq (,$(findstring $(DEB_HOST_ARCH_OS), linux))
    ifneq (,$(findstring $(DEB_HOST_ARCH), i386 amd64))
        WITH_VBOX        = --with-vbox
    else
        WITH_VBOX        = --without-vbox
    endif
    ifneq (,$(findstring $(DEB_HOST_ARCH), i386 amd64 armhf arm64))
        WITH_LIBXL       = --with-libxl
        XEN_ENABLED      = 1
    else
        WITH_LIBXL       = --without-libxl
    endif
    WITH_STORAGE_LVM     = --with-storage-lvm
    WITH_STORAGE_ISCSI   = --with-storage-iscsi
    WITH_STORAGE_DISK    = --with-storage-disk
    WITH_STORAGE_RBD     = --with-storage-rbd
    WITH_STORAGE_GLUSTER = --with-storage-gluster
    WITH_UDEV            = --with-udev
    WITH_CAPNG           = --with-capng
    WITH_MACVTAP         = --with-macvtap
    WITH_NETWORK         = --with-network
    WITH_OPENVZ          = --with-openvz
    WITH_NETCF           = --without-netcf
    WITH_POLKIT          = --with-polkit
    WITH_SANLOCK         = --with-sanlock
    WITH_INIT_SCRIPT     = --with-init-script=systemd
    WITH_FIREWALLD       = --without-firewalld
    WITH_ATTR            = --with-attr
    WITH_AUDIT           = --with-audit
    WITH_SELINUX         = --with-selinux --with-secdriver-selinux --with-selinux-mount=/sys/fs/selinux
    WITH_APPARMOR        = --with-apparmor --with-secdriver-apparmor --with-apparmor-profiles
    WITH_NSS_PLUGIN      = --with-nss-plugin
    WITH_DTRACE          = --with-dtrace
    WITH_NUMA            = --with-numactl --with-numad
    ifneq (,$(findstring $(DEB_HOST_ARCH), ia64))
        WITH_LXC         = --without-lxc
    else
        WITH_LXC         = --with-lxc
    endif
else
    WITH_STORAGE_LVM     = --without-storage-lvm
    WITH_STORAGE_ISCSI   = --without-storage-iscsi
    WITH_STORAGE_DISK    = --without-storage-disk
    WITH_STORAGE_RBD     = --without-storage-rbd
    WITH_STORAGE_GLUSTER = --without-storage-gluster
    WITH_UDEV            = --without-udev
    WITH_CAPNG           = --without-capng
    WITH_MACVTAP         = --without-macvtap
    WITH_NETWORK         = --without-network
    WITH_OPENVZ          = --without-openvz
    WITH_LXC             = --without-lxc
    WITH_NUMA            = --without-numactl --without-numad
    WITH_NETCF           = --without-netcf
    WITH_INIT_SCRIPT     = --with-init-script=none
    WITH_POLKIT          = --without-polkit
    WITH_SANLOCK         = --without-sanlock
    WITH_FIREWALLD       = --without-firewalld
    WITH_ATTR            = --without-attr
    WITH_AUDIT           = --without-audit
    WITH_SELINUX         = --without-selinux
    WITH_APPARMOR        = --without-apparmor
    WITH_NSS_PLUGIN      = --without-nss-plugin
    WITH_DTRACE          = --without-dtrace
    WITH_LIBXL           = --without-libxl
    WITH_VBOX            = --without-vbox
endif

DEB_CONFIGURE_EXTRA_ARGS := \
    --libexecdir=/usr/lib/libvirt \
    --with-packager="$(DEB_BUILDUSER) $(DEB_BUILDDATE)" \
    --with-packager-version="$(DEB_RELEASE)" \
    --with-default-editor="sensible-editor" \
    --enable-dependency-tracking \
    --disable-silent-rules \
    --disable-rpath \
    --with-qemu \
    --with-qemu-user=libvirt-qemu \
    --with-qemu-group=kvm \
    $(WITH_OPENVZ) \
    --with-sasl \
    --with-yajl \
    --without-ssh2 \
    $(WITH_POLKIT) \
    $(WITH_SANLOCK) \
    $(WITH_UDEV) \
    --with-storage-fs \
    --with-storage-dir \
    $(WITH_STORAGE_LVM) \
    $(WITH_STORAGE_ISCSI) \
    $(WITH_STORAGE_DISK) \
    --without-storage-sheepdog \
    $(WITH_STORAGE_RBD) \
    $(WITH_STORAGE_GLUSTER) \
    --with-storage-zfs \
    $(WITH_INIT_SCRIPT) \
    $(WITH_NUMA) \
    $(WITH_SELINUX) \
    $(WITH_APPARMOR) \
    --with-esx \
    $(WITH_CAPNG) \
    --enable-debug \
    $(WITH_MACVTAP) \
    $(WITH_NETWORK) \
    $(WITH_NETCF) \
    $(WITH_LIBXL) \
    $(WITH_VBOX) \
    $(WITH_LXC) \
    $(WITH_DTRACE) \
    $(WITH_AUDIT) \
    --without-hal \
    $(WITH_FIREWALLD) \
    $(WITH_ATTR) \
    $(WITH_NSS_PLUGIN) \
    --with-wireshark-dissector \
    $(NULL)

LIBVIRT_SYSTEM_SERVICES = \
    virtlogd.service \
    virtlockd.service \
    $(NULL)

LIBVIRT_NOSTART_UNITS = \
    libvirt-guests.service \
    libvirtd.socket \
    libvirtd-ro.socket \
    libvirtd-admin.socket \
    virtlogd.socket \
    virtlogd-admin.socket \
    virtlockd.socket \
    virtlockd-admin.socket \
    $(NULL)

DEB_BUILDDIR := $(CURDIR)/debian/build
DEB_DESTDIR := $(CURDIR)/debian/tmp
SRV_MONOLITHIC = libvirt-guests virtlogd virtlockd libvirtd libvirtd-tcp libvirtd-tls virt-guest-shutdown
# For split daemons later, as of 6.0 the remaining elments are
#SRV_SPLIT = virtnwfilterd virtinterfaced virtlxcd virtnetworkd virtnodedevd virtproxyd virtqemud virtsecretd virtstoraged virtvboxd virtxend virtproxyd-tcp virtproxyd-tls

%:
	dh $@ --builddirectory=$(DEB_BUILDDIR)

override_dh_auto_configure:
	IPTABLES_PATH=/usr/sbin/iptables \
	IP6TABLES_PATH=/usr/sbin/ip6tables \
	EBTABLES_PATH=/usr/sbin/ebtables \
	dh_auto_configure -- $(DEB_CONFIGURE_EXTRA_ARGS)

override_dh_auto_test:
	export LD_PRELOAD=""; \
	export VIR_TEST_DEBUG=1; \
	if ! dh_auto_test; then \
	    cat $(DEB_BUILDDIR)/tests/test-suite.log; \
	    exit 1; \
	fi

# After the upstream build system has installed libvirt into $(DEB_DESTDIR),
# we need to make some tweaks (add a few extra files, delete some contents
# we're not interested in, move things around) so that later calls to the
# various dh_* tools will work optimally. This target is the perfect place
# to perform such operations
override_dh_auto_install:
	mkdir -p debian/tmp/usr/share/apport/package-hooks
	cp -f debian/libvirt-daemon.apport \
	      debian/tmp/usr/share/apport/package-hooks/source_libvirt.py
	dh_auto_install
	# copy dnsmasq configuration
	mkdir -p debian/tmp/etc/dnsmasq.d-available
	cp debian/libvirt-daemon.dnsmasq \
	   debian/tmp/etc/dnsmasq.d-available/libvirt-daemon
	# Add profile script to automatically set default URI
	mkdir -p debian/tmp/etc/profile.d
	cp -f debian/libvirt-uri.sh debian/tmp/etc/profile.d/

	# Copy upstream files to debian/ so dh_* can find them
	cp $(DEB_DESTDIR)/usr/lib/libvirt/libvirt-guests.sh \
	   debian/libvirt-daemon-system-sysv.libvirt-guests.init
	cp tools/libvirt-guests.sysconf \
	   debian/libvirt-daemon-system.libvirt-guests.default
	cp src/logging/virtlogd.sysconf \
	   debian/libvirt-daemon-system.virtlogd.default
	cp src/locking/virtlockd.sysconf \
	   debian/libvirt-daemon-system.virtlockd.default

	# Copy the release notes where dh_installdocs can find them
	cp NEWS.rst \
	   $(DEB_DESTDIR)/usr/share/doc/libvirt/NEWS

	# Add our backward compat polkit rule
	mkdir -p $(DEB_DESTDIR)/var/lib/polkit-1/localauthority/10-vendor.d/
	cp debian/polkit/60-libvirt.pkla \
	   $(DEB_DESTDIR)/var/lib/polkit-1/localauthority/10-vendor.d/

	# Rename the upstream polkit rule so that it matches the name used
	# historically in Debian, as well as that of the backwards compat
	# rules we just installed
	mv $(DEB_DESTDIR)/usr/share/polkit-1/rules.d/50-libvirt.rules \
	   $(DEB_DESTDIR)/usr/share/polkit-1/rules.d/60-libvirt.rules

	# Don't ship any la files
	rm $(DEB_DESTDIR)/usr/lib/*/wireshark/plugins/*/*/*.la

	# Don't ship any files that are managed by the user only
	rm $(DEB_DESTDIR)/etc/apparmor.d/local/*

	# Don't ship the CI dashboard, which is not useful as documentation
	# triggers the privacy-breach-generic Lintian tag
	rm $(DEB_DESTDIR)/usr/share/doc/libvirt/html/ci.html

	# Don't autostart the default network
	rm $(DEB_DESTDIR)/etc/libvirt/qemu/networks/autostart/default.xml

override_dh_install-arch:
	dh_install

ifneq (,$(findstring $(DEB_HOST_ARCH_OS), linux))
	# Linux supports more nice things:
	set -e; for f in $(SRV_MONOLITHIC); do \
	    dh_install -p libvirt-daemon-system \
	               usr/lib/systemd/system/$${f}* \
	               lib/systemd/system/; \
	done
	dh_install -p libvirt-daemon-system usr/lib/libvirt/virt-aa-helper
	dh_install -p libvirt-daemon-system etc/apparmor.d
	dh_apparmor -p libvirt-daemon-system --profile-name=usr.lib.libvirt.virt-aa-helper
	dh_apparmor -p libvirt-daemon-system --profile-name=usr.sbin.libvirtd
	# Not all linux arches have systemtap yet
	mkdir -p $(DEB_DESTDIR)/usr/share/systemtap
	dh_install -p libvirt-daemon-system usr/share/systemtap
	dh_install -p libvirt-daemon-system etc/libvirt/lxc.conf
	dh_install -p libvirt-daemon-system etc/libvirt/qemu-sanlock.conf
	dh_install -p libvirt-daemon-system etc/libvirt/qemu/networks/
	dh_install -p libvirt-daemon-system etc/libvirt/nwfilter/
	dh_install -p libvirt-clients etc/libvirt/virt-login-shell.conf
	dh_install -p libnss-libvirt \
	           usr/lib/$(DEB_HOST_MULTIARCH)/libnss_libvirt*.so.2 \
	           lib/$(DEB_HOST_MULTIARCH)/
endif
ifeq ($(XEN_ENABLED), 1)
	dh_install -p libvirt-daemon-system etc/libvirt/libxl.conf
	dh_install -p libvirt-daemon-system etc/libvirt/libxl-lockd.conf
	dh_install -p libvirt-daemon-system etc/libvirt/libxl-sanlock.conf
endif

override_dh_installinit:
	dh_installinit -p libvirt-daemon-system-sysv --name=virtlogd --no-stop-on-upgrade
	dh_installinit -p libvirt-daemon-system-sysv --name=virtlockd --no-stop-on-upgrade
	dh_installinit -p libvirt-daemon-system-sysv --name=libvirtd --restart-after-upgrade -- defaults 28 72
	dh_installinit -p libvirt-daemon-system-sysv --name=libvirt-guests --no-start -- defaults 29 71
	# install /etc/default/* files that are shared between sysv and systemd packages
	dh_installinit -p libvirt-daemon-system --name=virtlockd --no-scripts
	dh_installinit -p libvirt-daemon-system --name=virtlogd --no-scripts
	dh_installinit -p libvirt-daemon-system --name=libvirt-guests --no-scripts
	dh_installinit -p libvirt-daemon-system --name=libvirtd --no-scripts

override_dh_installsystemd:
	dh_installsystemd -p libvirt-daemon-system --no-also --restart-after-upgrade libvirtd.service
	dh_installsystemd -p libvirt-daemon-system --no-also --no-stop-on-upgrade $(LIBVIRT_SYSTEM_SERVICES)
	dh_installsystemd -p libvirt-daemon-system --no-also --no-restart-after-upgrade --no-start $(LIBVIRT_NOSTART_UNITS)

override_dh_installdocs:
	dh_installdocs -plibvirt-doc --doc-main-package libvirt-doc
	dh_installdocs -Nlibvirt-doc

override_dh_auto_clean:
	dh_auto_clean

	rm -f $(CURDIR)/debian/libvirt-daemon-system.libvirt-guests.init \
	      $(CURDIR)/debian/libvirt-daemon-system.libvirt-guests.default \
	      $(CURDIR)/debian/libvirt-daemon-system.virtlogd.default \
	      $(CURDIR)/debian/libvirt-daemon-system.virtlockd.default \
	      $(NULL)

# The upstream ChangeLog file doesn't contain any useful information, and we
# already install the release notes elsewhere
override_dh_installchangelogs:
	dh_installchangelogs -XChangeLog
