#!/usr/bin/make -f

# Uncomment this to turn on verbose mode. 
#export DH_VERBOSE=1

DEB_HOST_ARCH       ?= $(shell dpkg-architecture -qDEB_HOST_ARCH)
DEB_HOST_GNU_TYPE   ?= $(shell dpkg-architecture -qDEB_HOST_GNU_TYPE)
DEB_HOST_MULTIARCH  ?= $(shell dpkg-architecture -qDEB_HOST_MULTIARCH)
DEB_BUILD_GNU_TYPE  ?= $(shell dpkg-architecture -qDEB_BUILD_GNU_TYPE)

DEB_CFLAGS_MAINT_STRIP = -O2
include /usr/share/dpkg/buildflags.mk

SOURCE := $(shell dpkg-parsechangelog | sed -ne 's,^Source: *\(.*\)$$,\1,p')
VERSION_COMPLETE := $(shell dpkg-parsechangelog | sed -ne 's,^Version: *\(.*\)$$,\1,p')
VERSION_UPSTREAM := $(shell echo "$(VERSION_COMPLETE)" | sed -e 's,^[0-9]*:,,' -e 's,-[^-]*$$,,')
VERSION_DEBIAN := $(shell echo "$(VERSION_COMPLETE)" | sed -e 's,^[^-]*-,,')

DEVMAPPER_ABINAME = 1.02.1
DEVMAPPER_VERSION_PLAIN = $(shell awk '{print $$1}' VERSION_DM)
DEVMAPPER_VERSION = 2:$(DEVMAPPER_VERSION_PLAIN)
DEVMAPPER_VERSION_DEBIAN = $(DEVMAPPER_VERSION)-$(VERSION_DEBIAN)
DEVMAPPER_VERSION_FILE = $(DEVMAPPER_VERSION_PLAIN)-$(VERSION_DEBIAN)

LVM2APP_ABINAME = 2.2
LVM2CMD_ABINAME = 2.02

MAKE_REAL := $(MAKE) -j1
MAKE_SELF := $(MAKE) -f debian/rules

BUILD_DIR = debian/build
STAMPS_DIR = debian/stamps

ifeq (,$(findstring noopt,$(DEB_BUILD_OPTIONS)))
CFLAGS_OPT_DEB = -O2
CFLAGS_OPT_UDEB = -Os
endif

CONFIGURE = ./configure \
		CC=gcc CFLAGS="$(CPPFLAGS) $(CFLAGS)" LDFLAGS="$(LDFLAGS)" CLDFLAGS="$(LDFLAGS)" \
		--build $(DEB_BUILD_GNU_TYPE)
ifneq ($(DEB_HOST_GNU_TYPE),$(DEB_BUILD_GNU_TYPE))
CONFIGURE += --host $(DEB_HOST_GNU_TYPE)
endif

CONFIGURE += \
	--prefix=/usr \
	--exec-prefix= \
	--sbindir=/sbin \
	--mandir=\$${prefix}/share/man \
	--infodir=\$${prefix}/share/info \
	--with-confdir=\$${exec_prefix}/etc

source: $(STAMPS_DIR)/source

$(STAMPS_DIR)/source: SOURCE_FILES = $(filter-out debian .svn, $(wildcard * .[^.]*))
$(STAMPS_DIR)/source: DIR = $(BUILD_DIR)/source
$(STAMPS_DIR)/source:
	@mkdir -p $(STAMPS_DIR)
	rm -rf $(DIR)
	mkdir -p '$(DIR)'
	cp -al $(SOURCE_FILES) '$(DIR)'
	cd $(DIR); autoreconf
	touch $@

setup: $(STAMPS_DIR)/setup_deb $(STAMPS_DIR)/setup_udeb

$(STAMPS_DIR)/setup_deb: SOURCE_DIR = $(BUILD_DIR)/source
$(STAMPS_DIR)/setup_deb: DIR = $(BUILD_DIR)/build_deb
$(STAMPS_DIR)/setup_deb: $(STAMPS_DIR)/source
	rm -rf $(DIR)
	cp -al '$(SOURCE_DIR)' '$(DIR)'
	cd $(DIR); \
	$(CONFIGURE) \
		--libdir=\$${exec_prefix}/lib/$(DEB_HOST_MULTIARCH) \
		--with-usrlibdir=\$${prefix}/lib/$(DEB_HOST_MULTIARCH) \
		--with-optimisation="$(CFLAGS_OPT_DEB)" \
		--with-cache=internal \
		--with-clvmd=cman,corosync,openais \
		--with-cluster=internal \
		--with-device-uid=0 \
		--with-device-gid=6 \
		--with-device-mode=0660 \
		--with-default-run-dir=/run/lvm \
		--with-default-locking-dir=/run/lock/lvm \
		--with-thin=internal \
		--with-thin-check=/usr/sbin/thin_check \
		--with-thin-dump=/usr/sbin/thin_dump \
		--with-thin-repair=/usr/sbin/thin_repair \
		--enable-applib \
		--enable-cmdlib \
		--enable-dmeventd \
		--enable-lvmetad \
		--enable-pkgconfig \
		--enable-readline \
		--enable-udev_rules \
		--enable-udev_sync
	touch $@

$(STAMPS_DIR)/setup_udeb: SOURCE_DIR = $(BUILD_DIR)/source
$(STAMPS_DIR)/setup_udeb: DIR = $(BUILD_DIR)/build_udeb
$(STAMPS_DIR)/setup_udeb: $(STAMPS_DIR)/source
	rm -rf $(DIR)
	cp -al '$(SOURCE_DIR)' '$(DIR)'
	cd $(DIR); \
	$(CONFIGURE) \
		--with-optimisation="$(CFLAGS_OPT_UDEB)" \
		--with-cluster=none \
		--with-lvm1=none \
		--with-pool=none \
		--disable-readline \
		--disable-selinux
	touch $@

build: build-arch build-indep
build-arch: $(STAMPS_DIR)/build_deb $(STAMPS_DIR)/build_udeb
build-indep:

build_deb: $(STAMPS_DIR)/build_deb
build_udeb: $(STAMPS_DIR)/build_udeb

$(STAMPS_DIR)/build_%: DIR = $(BUILD_DIR)/build_$*
$(STAMPS_DIR)/build_%: $(STAMPS_DIR)/setup_%
	dh_testdir
	+$(MAKE_REAL) -C $(DIR) LIB_VERSION_DM=$(DEVMAPPER_ABINAME)
	touch $@

$(BUILD_DIR) $(STAMPS_DIR):
	@[ -d $@ ] || mkdir $@

maintainerclean:
	rm -rf $(filter-out .svn .svk debian, $(wildcard * .[^.]*))

clean:
	dh_testdir
	rm -rf $(BUILD_DIR) $(STAMPS_DIR)
	dh_clean

$(STAMPS_DIR)/install_%: DIR = $(BUILD_DIR)/build_$*
$(STAMPS_DIR)/install_%: INSTALL_DIR = $(BUILD_DIR)/install_$*
$(STAMPS_DIR)/install_%: $(STAMPS_DIR)/build_%
	dh_testdir
	dh_testroot
	rm -rf $(INSTALL_DIR)
	+$(MAKE_REAL) -C $(DIR) install DESTDIR=$(CURDIR)/$(INSTALL_DIR) LIB_VERSION_DM=$(DEVMAPPER_ABINAME)
	+$(MAKE_REAL) -C $(DIR)/scripts install_systemd_units install_tmpfiles_configuration DESTDIR=$(CURDIR)/$(INSTALL_DIR)
	touch $@

install-base-prep:
	dh_testdir
	dh_testroot
	dh_prep
	dh_install -X .svn --sourcedir=$(INSTALL_DIR)

install-base:
	dh_installchangelogs $(if $(CHANGELOG),$(CHANGELOG),WHATS_NEW)
	dh_installdebconf
	dh_installdocs
	dh_installexamples
	dh_link
	dh_strip
	dh_compress
	dh_fixperms
	dh_installdeb
	dh_shlibdeps
	dh_gencontrol -- $(GENCONTROL_ARGS)
	dh_md5sums
	dh_builddeb $(BUILDDEB_ARGS)

install_clvm: export DH_OPTIONS = -pclvm
install_clvm: DIR = $(BUILD_DIR)/install_deb
install_clvm: $(STAMPS_DIR)/install_deb
	+$(MAKE_SELF) install-base-prep INSTALL_DIR='$(DIR)'
	dh_installinit --no-start -- start 63 S . start 51 0 6 .
	+$(MAKE_SELF) install-base

install_dmeventd: export DH_OPTIONS = -pdmeventd
install_dmeventd: DIR = $(BUILD_DIR)/install_deb
install_dmeventd: $(STAMPS_DIR)/install_deb install_liblvm2
	+$(MAKE_SELF) install-base-prep INSTALL_DIR='$(DIR)'
	dh_systemd_enable --no-enable dm-event.service
	dh_systemd_enable dm-event.socket
	dh_systemd_start --restart-after-upgrade dm-event.socket
	+$(MAKE_SELF) install-base CHANGELOG=WHATS_NEW_DM GENCONTROL_ARGS="-v$(DEVMAPPER_VERSION_DEBIAN)"

install_dmsetup: export DH_OPTIONS = -pdmsetup
install_dmsetup: DIR = $(BUILD_DIR)/install_deb
install_dmsetup: $(STAMPS_DIR)/install_deb install_libdevmapper
	+$(MAKE_SELF) install-base-prep INSTALL_DIR='$(DIR)'
	+$(MAKE_SELF) install-base CHANGELOG=WHATS_NEW_DM GENCONTROL_ARGS="-v$(DEVMAPPER_VERSION_DEBIAN)"

install_dmsetup-udeb: PACKAGE_NAME = dmsetup-udeb
install_dmsetup-udeb: export DH_OPTIONS = -p$(PACKAGE_NAME)
install_dmsetup-udeb: PACKAGE_FILE = $(PACKAGE_NAME)_$(DEVMAPPER_VERSION_FILE)_$(DEB_HOST_ARCH).udeb
install_dmsetup-udeb: DIR = $(BUILD_DIR)/install_udeb
install_dmsetup-udeb: $(STAMPS_DIR)/install_udeb install_libdevmapper
	+$(MAKE_SELF) install-base-prep INSTALL_DIR='$(DIR)'
	+$(MAKE_SELF) install-base \
		BUILDDEB_ARGS="--filename=$(PACKAGE_FILE)" \
		GENCONTROL_ARGS="-v$(DEVMAPPER_VERSION_DEBIAN)"

install_libdevmapper: export DH_OPTIONS = -plibdevmapper$(DEVMAPPER_ABINAME)
install_libdevmapper: DIR = $(BUILD_DIR)/install_deb
install_libdevmapper: $(STAMPS_DIR)/install_deb
	+$(MAKE_SELF) install-base-prep INSTALL_DIR='$(DIR)'
	dh_makeshlibs \
		--add-udeb 'libdevmapper$(DEVMAPPER_ABINAME)-udeb' \
	       	"-Vlibdevmapper$(DEVMAPPER_ABINAME) (>= $(DEVMAPPER_VERSION))" \
		-- "-v$(DEVMAPPER_VERSION_DEBIAN)" -c2
	+$(MAKE_SELF) install-base CHANGELOG=WHATS_NEW_DM GENCONTROL_ARGS="-v$(DEVMAPPER_VERSION_DEBIAN)"

install_libdevmapper-event: export DH_OPTIONS = -plibdevmapper-event$(DEVMAPPER_ABINAME)
install_libdevmapper-event: DIR = $(BUILD_DIR)/install_deb
install_libdevmapper-event: $(STAMPS_DIR)/install_deb
	+$(MAKE_SELF) install-base-prep INSTALL_DIR='$(DIR)'
	dh_makeshlibs \
		"-Vlibdevmapper-event$(DEVMAPPER_ABINAME) (>= $(DEVMAPPER_VERSION))" \
		-- "-v$(DEVMAPPER_VERSION_DEBIAN)" -c2
	+$(MAKE_SELF) install-base CHANGELOG=WHATS_NEW_DM GENCONTROL_ARGS="-v$(DEVMAPPER_VERSION_DEBIAN)"

install_libdevmapper-dev: export DH_OPTIONS = -plibdevmapper-dev
install_libdevmapper-dev: DIR = $(BUILD_DIR)/install_deb
install_libdevmapper-dev: $(STAMPS_DIR)/install_deb
	+$(MAKE_SELF) install-base-prep INSTALL_DIR='$(DIR)'
	+$(MAKE_SELF) install-base CHANGELOG=WHATS_NEW_DM GENCONTROL_ARGS="-v$(DEVMAPPER_VERSION_DEBIAN)"

install_libdevmapper-udeb: PACKAGE_NAME = libdevmapper$(DEVMAPPER_ABINAME)-udeb
install_libdevmapper-udeb: export DH_OPTIONS = -p$(PACKAGE_NAME)
install_libdevmapper-udeb: PACKAGE_FILE = $(PACKAGE_NAME)_$(DEVMAPPER_VERSION_FILE)_$(DEB_HOST_ARCH).udeb
install_libdevmapper-udeb: DIR = $(BUILD_DIR)/install_udeb
install_libdevmapper-udeb: $(STAMPS_DIR)/install_udeb
	+$(MAKE_SELF) install-base-prep INSTALL_DIR='$(DIR)'
	+$(MAKE_SELF) install-base \
		BUILDDEB_ARGS="--filename=$(PACKAGE_FILE)" \
		GENCONTROL_ARGS="-v$(DEVMAPPER_VERSION_DEBIAN)"

install_liblvm2: export DH_OPTIONS = -pliblvm2app$(LVM2APP_ABINAME) -pliblvm2cmd$(LVM2CMD_ABINAME) -pliblvm2-dev
install_liblvm2: DIR = $(BUILD_DIR)/install_deb
install_liblvm2: $(STAMPS_DIR)/install_deb install_libdevmapper
	+$(MAKE_SELF) install-base-prep INSTALL_DIR='$(DIR)'
	dh_makeshlibs -V -- -c2
	+$(MAKE_SELF) install-base

install_lvm2: export DH_OPTIONS = -plvm2
install_lvm2: DIR = $(BUILD_DIR)/install_deb
install_lvm2: $(STAMPS_DIR)/install_deb
	+$(MAKE_SELF) install-base-prep INSTALL_DIR='$(DIR)'
	dh_systemd_enable --no-enable lvm2-lvmetad.service
	dh_systemd_enable lvm2-activation.service lvm2-activation-early.service lvm2-lvmetad.socket lvm2-monitor.service
	dh_systemd_start --restart-after-upgrade lvm2-lvmetad.socket
	dh_installinit --no-start -- start 26 S .
	+$(MAKE_SELF) install-base

install_lvm2-udeb: export DH_OPTIONS = -plvm2-udeb
install_lvm2-udeb: DIR = $(BUILD_DIR)/install_udeb
install_lvm2-udeb: $(STAMPS_DIR)/install_udeb
	+$(MAKE_SELF) install-base-prep INSTALL_DIR='$(DIR)'
	+$(MAKE_SELF) install-base

binary-indep:
binary-arch: $(addprefix install_,libdevmapper libdevmapper-udeb libdevmapper-event libdevmapper-dev dmsetup dmsetup-udeb dmeventd liblvm2 lvm2 lvm2-udeb clvm)

binary: binary-indep binary-arch

DIR_ORIG = ../orig/$(SOURCE)-$(VERSION_UPSTREAM)
TAR_ORIG_NAME = $(SOURCE)_$(VERSION_UPSTREAM).orig.tar.gz
TAR_ORIG = $(firstword $(wildcard ../$(TAR_ORIG_NAME)) $(wildcard ../orig/$(TAR_ORIG_NAME)))

orig: $(DIR_ORIG)
	rsync --delete --exclude debian --exclude .svk --exclude .svn -a $(DIR_ORIG)/ .

$(DIR_ORIG):
ifeq ($(TAR_ORIG),)
	$(error Cannot find orig tarball $(TAR_ORIG_NAME))
else
	mkdir -p ../orig
	tar -C ../orig -xzf $(TAR_ORIG)
endif

.PHONY: build clean binary-indep binary-arch binary install configure
