#!/usr/bin/make -f

include /usr/share/dpkg/architecture.mk

# Export dpkg build flags
DEB_BUILD_MAINT_OPTIONS = hardening=+bindnow,+pie
DEB_CFLAGS_MAINT_APPEND = -Wall
DPKG_EXPORT_BUILDFLAGS  = 1
include /usr/share/dpkg/default.mk

# Turn on verbose mode.
export V=1

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

-include /usr/share/dpkg/pkg-info.mk

# These are used for cross-compiling and for saving the configure script
# from having to guess our platform (since we know it already)
export DEB_HOST_GNU_TYPE  ?= $(shell dpkg-architecture -qDEB_HOST_GNU_TYPE)
export DEB_BUILD_GNU_TYPE ?= $(shell dpkg-architecture -qDEB_BUILD_GNU_TYPE)

DEB_DATE := $(strip $(shell LC_ALL=C date -u +%F -d@$(SOURCE_DATE_EPOCH)))

ifeq ($(DEB_BUILD_GNU_TYPE), $(DEB_HOST_GNU_TYPE))
  confflags += --build $(DEB_HOST_GNU_TYPE)
else
  confflags += --build $(DEB_BUILD_GNU_TYPE) --host $(DEB_HOST_GNU_TYPE)
endif
ifeq ($(origin CC),default)
  CC := $(DEB_HOST_GNU_TYPE)-gcc
endif

ifeq (,$(findstring nostrip,$(DEB_BUILD_OPTIONS)))
	INSTALL_PROGRAM += -s
endif
ifneq (,$(filter parallel=%,$(DEB_BUILD_OPTIONS)))
	NUMJOBS = $(patsubst parallel=%,%,$(filter parallel=%,$(DEB_BUILD_OPTIONS)))
	MAKEFLAGS += -j$(NUMJOBS)
endif

configure: configure-stamp
configure-stamp:
	dh_testdir
	find -xtype f ! -name manifest >manifest
	dh_autoreconf
	./configure $(confflags)  \
		--prefix=/usr \
		--libdir=/lib \
		--sbindir=/sbin \
		--mandir=/usr/share/man \
		--enable-libargon2 \
		--enable-shared \
		--enable-cryptsetup-reencrypt
	find -xtype f >manifest.new
	diff manifest manifest.new | grep '>' | cut -b3- >config.mess
	touch $@

build-stamp: configure-stamp
	touch $@


build-indep: build-stamp
	dh_testdir
	# generate manpages
	sed 's/VERSION/$(DEB_VERSION)/;s/DATE/$(DEB_DATE)/' \
		debian/doc/variables.xml.in >debian/doc/variables.xml
	xsltproc --nonet --xinclude -o debian/doc/ \
		/usr/share/xml/docbook/stylesheet/docbook-xsl/manpages/docbook.xsl \
		debian/doc/manpages.xml
	pod2man --section=8 --center="Administrative commands" \
		--release="$(DEB_VERSION)" debian/scripts/luksformat \
		debian/luksformat.8
	# generate gettext po files (for luksformat)
	$(MAKE) -C debian/scripts/po all luksformat.pot

build-arch: build-stamp
	dh_testdir
	# build upstream cryptsetup
	$(MAKE)
	# build askpass and passdev keyscripts
	$(CC) $(CFLAGS) $(CPPFLAGS) $(LDFLAGS) -pedantic debian/askpass.c -o debian/askpass
	$(CC) $(CFLAGS) $(CPPFLAGS) $(LDFLAGS) -pedantic debian/passdev.c -o debian/scripts/passdev

build: build-indep build-arch

install: install-stamp
install-stamp: build-stamp
	dh_testdir
	dh_testroot
	dh_clean
	dh_installdirs
	mkdir -p $(CURDIR)/debian/cryptsetup-udeb
	mkdir -p $(CURDIR)/debian/libcryptsetup12-udeb
	$(MAKE) DESTDIR=$(CURDIR)/debian/cryptsetup-bin install

	# Copy library files to library packages
	mkdir -p $(CURDIR)/debian/libcryptsetup12/lib/$(DEB_HOST_MULTIARCH)/
	mkdir -p $(CURDIR)/debian/libcryptsetup-dev/usr/lib/$(DEB_HOST_MULTIARCH)/pkgconfig
	#mkdir -p $(CURDIR)/debian/libcryptsetup12/usr/lib/$(DEB_HOST_MULTIARCH)/

	cp -a $(CURDIR)/debian/cryptsetup-bin/lib/libcryptsetup.so.* \
		$(CURDIR)/debian/libcryptsetup12/lib/$(DEB_HOST_MULTIARCH)/
	#cp -a $(CURDIR)/debian/cryptsetup-bin/lib/libcryptsetup.la \
	#	$(CURDIR)/debian/libcryptsetup-dev/usr/lib/$(DEB_HOST_MULTIARCH)/
	#cp -a $(CURDIR)/debian/cryptsetup-bin/lib/libcryptsetup.a \
	#	$(CURDIR)/debian/libcryptsetup-dev/usr/lib/$(DEB_HOST_MULTIARCH)/
	cp -a $(CURDIR)/debian/cryptsetup-bin/lib/pkgconfig/libcryptsetup.pc \
		$(CURDIR)/debian/libcryptsetup-dev/usr/lib/$(DEB_HOST_MULTIARCH)/pkgconfig/
	cp -a $(CURDIR)/debian/cryptsetup-bin/usr/include/libcryptsetup.h \
		$(CURDIR)/debian/libcryptsetup-dev/usr/include/
	#cp -a $(CURDIR)/debian/cryptsetup-bin/lib/libcryptsetup.so \
	#	$(CURDIR)/debian/libcryptsetup-dev/usr/lib/$(DEB_HOST_MULTIARCH)/
	mkdir -p $(CURDIR)/debian/cryptsetup-bin/usr/lib/tmpfiles.d
	install -m0644 ./scripts/cryptsetup.conf $(CURDIR)/debian/cryptsetup-bin/usr/lib/tmpfiles.d
	dh_link -plibcryptsetup-dev lib/$(DEB_HOST_MULTIARCH)/$$(basename $$(readlink debian/libcryptsetup12/lib/$(DEB_HOST_MULTIARCH)/libcryptsetup.so.12)) usr/lib/$(DEB_HOST_MULTIARCH)/libcryptsetup.so

	# Remove libraries from cryptsetup package, they're shiped in seperate library packages
	rm -rf $(CURDIR)/debian/cryptsetup-bin/lib
	rm -rf $(CURDIR)/debian/cryptsetup-bin/usr/include

	install -m 0644 debian/cryptdisks.functions $(CURDIR)/debian/cryptsetup/lib/cryptsetup/
	install -m 0755 debian/checks/* $(CURDIR)/debian/cryptsetup/lib/cryptsetup/checks/
	install -m 0755 debian/scripts/luksformat $(CURDIR)/debian/cryptsetup-bin/usr/sbin/
	install -m 0755 debian/scripts/cryptdisks_start $(CURDIR)/debian/cryptsetup/sbin/
	install -m 0755 debian/scripts/cryptdisks_stop $(CURDIR)/debian/cryptsetup/sbin/
	install -m 0755 debian/scripts/decrypt_* $(CURDIR)/debian/cryptsetup/lib/cryptsetup/scripts/
	install -m 0755 debian/scripts/passdev $(CURDIR)/debian/cryptsetup/lib/cryptsetup/scripts/
	install -m 0755 debian/askpass $(CURDIR)/debian/cryptsetup/lib/cryptsetup/
	install -m 0755 debian/initramfs/cryptgnupg-hook \
		$(CURDIR)/debian/cryptsetup/usr/share/initramfs-tools/hooks/cryptgnupg
	install -m 0755 debian/initramfs/cryptkeyctl-hook \
		$(CURDIR)/debian/cryptsetup/usr/share/initramfs-tools/hooks/cryptkeyctl
	install -m 0755 debian/initramfs/cryptopenct-hook \
		$(CURDIR)/debian/cryptsetup/usr/share/initramfs-tools/hooks/cryptopenct
	install -m 0755 debian/initramfs/cryptopensc-hook \
		$(CURDIR)/debian/cryptsetup/usr/share/initramfs-tools/hooks/cryptopensc
	install -m 0755 debian/initramfs/cryptopensc-script-local-bottom \
		$(CURDIR)/debian/cryptsetup/usr/share/initramfs-tools/scripts/local-bottom/cryptopensc
	install -m 0755 debian/initramfs/cryptopensc-script-local-top \
		$(CURDIR)/debian/cryptsetup/usr/share/initramfs-tools/scripts/local-top/cryptopensc
	install -m 0755 debian/initramfs/cryptpassdev-hook \
		$(CURDIR)/debian/cryptsetup/usr/share/initramfs-tools/hooks/cryptpassdev
	install -m 0644 debian/initramfs/cryptroot-initramfs.conf \
		$(CURDIR)/debian/cryptsetup/usr/share/initramfs-tools/conf-hooks.d/cryptsetup
	install -m 0644 debian/initramfs/cryptroot-conf \
		$(CURDIR)/debian/cryptsetup/etc/cryptsetup-initramfs/conf-hook
	install -m 0755 debian/initramfs/cryptroot-hook \
		$(CURDIR)/debian/cryptsetup/usr/share/initramfs-tools/hooks/cryptroot
	install -m 0755 debian/initramfs/cryptroot-unlock \
		$(CURDIR)/debian/cryptsetup/usr/share/cryptsetup/initramfs/bin/cryptroot-unlock
	install -m 0755 debian/initramfs/cryptroot-unlock-hook \
		$(CURDIR)/debian/cryptsetup/usr/share/initramfs-tools/hooks/cryptroot-unlock
	install -m 0755 debian/initramfs/cryptroot-script \
		$(CURDIR)/debian/cryptsetup/usr/share/initramfs-tools/scripts/local-top/cryptroot
	install -m 0755 debian/initramfs/cryptroot-script-block \
		$(CURDIR)/debian/cryptsetup/usr/share/initramfs-tools/scripts/local-block/cryptroot
	install -m 0755 debian/initramfs/cryptroot-script-bottom \
		$(CURDIR)/debian/cryptsetup/usr/share/initramfs-tools/scripts/local-bottom/cryptroot
	install -m 0644 debian/cryptdisks.bash_completion \
		$(CURDIR)/debian/cryptsetup/usr/share/bash-completion/completions/cryptdisks
	install -m 0755 debian/cryptsetup.bug-script \
		$(CURDIR)/debian/cryptsetup/usr/share/bug/cryptsetup
ifeq ($(shell dpkg-vendor --is Ubuntu && echo yes),yes)
	mkdir -p $(CURDIR)/debian/cryptsetup/usr/share/apport/package-hooks
	install -m 0644 debian/cryptsetup.apport \
		$(CURDIR)/debian/cryptsetup/usr/share/apport/package-hooks/cryptsetup.py
endif

	$(MAKE) -C debian/scripts/po DESTDIR=$(CURDIR)/debian/cryptsetup-bin install
	touch $@

binary-indep: build install
# We have nothing to do by default.

binary-arch: build install
	dh_testdir
	dh_testroot
	dh_installdebconf -a
	dh_installchangelogs -a
	dh_installdocs -a
	dh_installexamples -a debian/scripts/gen-ssl-key
	dh_installinit -a --no-start --name=cryptdisks-early
	dh_installinit -a --no-start --name=cryptdisks-udev
	dh_installinit -a --no-start --name=cryptdisks
	dh_installman -a debian/doc/crypttab.5 debian/doc/cryptdisks_start.8 debian/doc/cryptdisks_stop.8
	dh_installman -p cryptsetup-bin debian/luksformat.8
	# Copy relevant parts to cryptsetup-udeb package
	cp -a $(CURDIR)/debian/cryptsetup/etc $(CURDIR)/debian/cryptsetup-udeb/
	cp -a $(CURDIR)/debian/cryptsetup/lib $(CURDIR)/debian/cryptsetup-udeb/
	mkdir $(CURDIR)/debian/cryptsetup-udeb/sbin
	cp -a $(CURDIR)/debian/cryptsetup-bin/sbin/cryptsetup $(CURDIR)/debian/cryptsetup-udeb/sbin/
	# Copy relevant parts to libcryptsetup12-udeb package
	cp -a $(CURDIR)/debian/libcryptsetup12/lib $(CURDIR)/debian/libcryptsetup12-udeb/
	dh_lintian -a
	dh_strip_nondeterminism
	dh_compress -a
	dh_fixperms -a
	dh_strip -a
	# Check for new/changed symbols in libcryptsetup
	#dpkg-gensymbols -plibcryptsetup12 -Pdebian/libcryptsetup12 -Odebian/libcrypsetup4.symbols
	dh_makeshlibs -a -V --add-udeb=libcryptsetup12-udeb
	dh_shlibdeps -a
	dh_gencontrol -a
	dh_installdeb -a
	dh_md5sums -a
	dh_builddeb -a

binary: binary-indep binary-arch

clean:
	dh_testdir
	dh_testroot
	# clean up the source directory
	dh_autoreconf_clean
	if test -f Makefile; then $(MAKE) distclean; fi
	rm -f manifest manifest.new
	rm -f debian/doc/*.[0-9] debian/doc/variables.xml
	rm -f debian/luksformat.8
	$(MAKE) -C debian/scripts/po update clean
	rm -f debian/scripts/passdev
	rm -f debian/askpass
	# clean up leftovers which where forgotten
	if test -f config.mess; then rm -f `cat config.mess`; fi
	rm -f config.mess
	dh_clean configure-stamp build-stamp install-stamp
	# update debconf po files
	debconf-updatepo

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