#!/usr/bin/make -f
# debian/rules for exim4
# This file is public domain software, originally written by Joey Hess.
#
# Uncomment this to turn on verbose mode.
# export DH_VERBOSE=1

buildname := $(shell scripts/os-type)-$(shell scripts/arch-type)
DEBIAN := $(shell pwd)/debian

export DEB_BUILD_MAINT_OPTIONS := hardening=+bindnow,+pie
DPKG_EXPORT_BUILDFLAGS := 1
include /usr/share/dpkg/buildflags.mk
include /usr/share/dpkg/pkg-info.mk
# SOURCE_DATE_EPOCH is exported by pkg-info.mk since dpkg 1.18.8/July 2016
# fall back to current date otherwise.
SOURCE_DATE_EPOCH ?= $(shell date '+%s')


# The build system ignores CPPFLAGS, append them to CFLAGS
CFLAGS := $(CFLAGS) $(shell getconf LFS_CFLAGS) -D_LARGEFILE_SOURCE -fno-strict-aliasing -Wall $(CPPFLAGS)
export CFLAGS
# LFLAGS is used where GNU would use LDFLAGS
export LFLAGS += $(LDFLAGS)

LC_ALL=C
export LC_ALL

# Which packages should we build?
ifndef buildbasepackages
buildbasepackages=yes
endif

ifndef extradaemonpackages
extradaemonpackages=exim4-daemon-heavy
endif
# If you want to build a daemon with a configuration tailored to YOUR special
# needs, uncomment the two custom packages in debian/control
# call "fakeroot debian/rules unpack-configs", copy EDITME.exim4-light
# to EDITME.exim4-custom and modify it.
#
# If you want to create multiple custom packages with different names, use
# the script debian/create-custom-package [suffix].
#
# Afterwards EITHER change the definition of extradaemonpackages above OR
# simply set extradaemonpackages to the desired value via the environment.
# e.g run:
# env extradaemonpackages=exim4-daemon-custom dpkg-buildpackage -uc -us

# If you want your changes to survive a debian/rules clean, call
# "fakeroot debian/rules pack-configs" after customizing EDITME.exim4-custom

# If you remove exim4-daemon-light from basedaemonpackages to prevent
# exim4-daemon-light from being built, you need to modify the build
# process to pull the helper binaries from the daemon package that you
# actually build. If you simply remove exim4-daemon-light here, you will
# end up with exim4-base sans binaries, which is most probably not what
# you intend to have.

ifeq ($(buildbasepackages),yes)
basedaemonpackages=exim4-daemon-light
else
basedaemonpackages=
endif

# If you want to build with OpenSSL instead of GnuTLS, uncomment this
# OPENSSL:=1
# Please note that building exim4-daemon-heavy with OpenSSL is a GPL
# violation.


# exim4-daemon-heavy --> b-exim4-daemon-heavy/build-Linux-x86_64/exim
daemonbinaries=$(addprefix b-,$(addsuffix /build-$(buildname)/exim,$(extradaemonpackages)))
debiandaemonbinaries=$(addprefix $(DEBIAN)/,$(addsuffix /usr/sbin/exim4,$(extradaemonpackages)))
BDIRS=$(addprefix b-,$(extradaemonpackages) $(basedaemonpackages))


PROVIDE_DEFAULT_MTA := $(shell if dpkg-vendor --is Ubuntu || \
	dpkg-vendor --derives-from Ubuntu ; then : ; else \
	echo "default-mta" ; fi)
# for reproducible build. If set exim would use $TZ as default value for
# TIMEZONE_DEFAULT
undefine TZ
unexport TZ


# set up build directory b-exim4-daemon-heavy/
$(addsuffix /Makefile,$(BDIRS)): %/Makefile:
	mkdir $*
	find . -mindepth 1 -maxdepth 1 \
		-name debian -prune -o \
		-name 'b-*' -o -print0 | \
		xargs --no-run-if-empty --null \
		cp -a --target-directory=$*
	printf '#define REPBUILDDATE "%s"\n' \
		"$(shell env LC_ALL=C TZ=UTC date --date="@$(SOURCE_DATE_EPOCH)" '+%b %e %Y')" \
		> $*/src/repbuildtime.h && \
		printf '#define REPBUILDTIME "%s"\n' \
			"$(shell env LC_ALL=C TZ=UTC date --date="@$(SOURCE_DATE_EPOCH)" '+%H:%M:%S')" \
		>> $*/src/repbuildtime.h


unpack-configs: unpack-configs-stamp
unpack-configs-stamp: src/EDITME exim_monitor/EDITME
	patch -o EDITME.eximon exim_monitor/EDITME \
		$(DEBIAN)/EDITME.eximon.diff
	patch -o EDITME.exim4-light src/EDITME \
		$(DEBIAN)/EDITME.exim4-light.diff
ifdef OPENSSL
	patch EDITME.exim4-light $(DEBIAN)/EDITME.openssl.exim4-light.diff
endif
	for editme in $(DEBIAN)/EDITME.exim4-*.diff; do \
	  if [ "$$editme" != "$(DEBIAN)/EDITME.exim4-light.diff" ]; then \
	    TARGETNAME=`basename $$editme .diff`; \
	    echo patch -o $$TARGETNAME EDITME.exim4-light $$editme; \
	    patch -o $$TARGETNAME EDITME.exim4-light $$editme || \
	    exit $$? ;\
	  fi; \
	done
	touch unpack-configs-stamp

pack-configs:
	-diff -u src/EDITME EDITME.exim4-light \
		> $(DEBIAN)/EDITME.exim4-light.diff
	-for editme in EDITME.exim4-*; do \
	  if [ "$$editme" != "EDITME.exim4-light" ]; then \
	    echo diff -u EDITME.exim4-light $$editme; \
	    diff -u EDITME.exim4-light $$editme > $(DEBIAN)/$${editme}.diff; \
	  fi; \
	done
	-diff -u exim_monitor/EDITME EDITME.eximon \
		> $(DEBIAN)/EDITME.eximon.diff

# only called manually by maintainer before upload.
update-mtaconflicts:
	which grep-aptavail > /dev/null && \
		grep-aptavail --show-field=Package --field=Provides \
		mail-transport-agent --no-field-names \
		| grep -v exim | sort -u | \
		tr '\n' ',' | sed -e 's/,/, /g;s/, $$//' > $(DEBIAN)/mtalist

# Generate README.Debian as text/html ...
debian/README.Debian.html: debian/README.Debian.xml
	xsltproc --nonet --stringparam section.autolabel 1 \
		-o $@ \
		/usr/share/xml/docbook/stylesheet/nwalsh/html/docbook.xsl \
		$<
# ... and text/plain
debian/README.Debian: debian/README.Debian.html
	chmod 755 $(DEBIAN)/lynx-dump-postprocess
	lynx -force_html -dump $< | $(DEBIAN)/lynx-dump-postprocess > $@.tmp
	mv $@.tmp $@

configure: configure-stamp

configure-stamp: $(addsuffix /Makefile,$(BDIRS)) unpack-configs-stamp
	dh_testdir
	# Add here commands to configure the package.
	touch $@

# Build binaries for the base package, the eximon4 package, and the
# exim4-daemon-light package.
b-exim4-daemon-light/build-$(buildname)/exim: b-exim4-daemon-light/Makefile configure-stamp
	@echo build $(<D)
	dh_testdir

	rm -rf $(@D)
	mkdir -p $(<D)/Local
	cp EDITME.exim4-light $(<D)/Local/Makefile
	cp EDITME.eximon $(<D)/Local/eximon.conf
	cd $(<D) && $(MAKE) FULLECHO=''

b-exim4-daemon-heavy/build-$(buildname)/exim: b-exim4-daemon-heavy/Makefile configure-stamp
	@echo build $(<D)
	dh_testdir

	rm -rf $(@D)
	mkdir -p $(<D)/Local
	cp EDITME.exim4-heavy $(<D)/Local/Makefile
	cd $(<D) && $(MAKE) FULLECHO=''

b-exim4-daemon-custom/build-$(buildname)/exim: b-exim4-daemon-custom/Makefile configure-stamp
	@echo build $(<D)
	dh_testdir

	rm -rf $(@D)
	mkdir -p $(<D)/Local
	cp EDITME.exim4-custom $(<D)/Local/Makefile
	cp EDITME.eximon $(<D)/Local/eximon.conf
	cd $(<D) && $(MAKE) FULLECHO=''

build-indep: build-indep-stamp
build-indep-stamp: debian/README.Debian
	dh_testdir
	touch $@

build-arch: build-arch-stamp test-stamp

ifeq ($(buildbasepackages),yes)
build-arch-stamp: b-exim4-daemon-light/build-$(buildname)/exim $(daemonbinaries)
else
build-arch-stamp: $(daemonbinaries)
endif
	dh_testdir
	# Which version of Berkeley DB are we building against?
	printf '#include <db.h>\ninstdbversionis DB_VERSION_MAJOR DB_VERSION_MINOR\n' | \
		cpp -P | grep instdbversionis |\
		sed -e 's/[[:space:]]*instdbversionis[[:space:]]//' \
		-e 's/[[:space:]][[:space:]]*/./' \
		-e 's_^_s/^BDBVERSION=.*/BDBVERSION=_' \
		-e 's_$$_/_' \
		> $(DEBIAN)/berkeleydb.sed
	# Store Berkeley DB version in postinst script.
	sed -i -f $(DEBIAN)/berkeleydb.sed \
		$(DEBIAN)/exim4-base.postinst
	touch build-arch-stamp

test-stamp: build-arch-stamp
	# it is not possible to run exim unless the compile-time specified
	# user exists.
	if id -u Debian-exim ; then \
		echo Debian-exim user found, running minimal testsuite ; \
		chmod +x debian/minimaltest ; \
		rm -rf $(CURDIR)/test ; \
		for i in b-exim4-daemon-light/build-$(buildname)/exim \
			$(daemonbinaries) ;\
			do mkdir $(CURDIR)/test && \
			debian/minimaltest $(CURDIR)/test $$i || \
			{ echo testsuite error  ; exit 1 ; } ; \
			rm -rf $(CURDIR)/test ; \
		done \
	fi
	touch $@

build: build-arch build-indep

clean: cleanfiles

cleanfiles:
	dh_testdir
	dh_testroot

	debconf-updatepo

	rm -f build-stamp configure-stamp installbase-stamp test-stamp

	# Add here commands to clean up after the build process.
	[ ! -f Makefile ] || $(MAKE) distclean
	-rm -rf build-* doc/tmp test/
	-rm -f EDITME.* unpack-configs-stamp
	-rm -f $(DEBIAN)/debconf/exim4.conf.template $(DEBIAN)/files \
		$(DEBIAN)/README.Debian $(DEBIAN)/README.Debian.html \
		$(DEBIAN)/berkeleydb.sed

	#these are identical for all daemon-* and therefore symlinked
	@cd $(DEBIAN) && find . -maxdepth 1 \
		-regex '^\./exim4-daemon-.*\.\(postinst\|prerm\)$$' \
		-and -not -name 'exim4-daemon-light.*' -print0 \
		| xargs -0r rm -v

	#pwd
	chmod 755 $(DEBIAN)/exim-gencert \
		$(DEBIAN)/lynx-dump-postprocess $(DEBIAN)/script \
		$(DEBIAN)/exim-adduser $(DEBIAN)/exim4_refresh_gnutls-params
	dh_clean
	rm -rf $(BDIRS)

installbase-stamp: b-exim4-daemon-light/build-$(buildname)/exim debian/README.Debian debian/README.Debian.html
	dh_testdir
	dh_testroot
	dh_prep
	dh_installdirs

	cd b-exim4-daemon-light && \
	  $(MAKE) install FULLECHO='' \
		INSTALL_ARG=-no_symlink \
		inst_conf=$(DEBIAN)/exim4-base/usr/share/doc/exim4-base/examples/example.conf \
		inst_aliases=$(DEBIAN)/exim4-base/usr/share/doc/exim4-base/examples/aliases \
		inst_dest=$(DEBIAN)/exim4-base/usr/sbin
	if [ -e "$(DEBIAN)/example.conf.md5" ] && [ "$$(< $(DEBIAN)/exim4-base/usr/share/doc/exim4-base/examples/example.conf md5sum)" != "$$(cat $(DEBIAN)/example.conf.md5)" ] ; then \
	  echo "upstream example configuration has changed, new md5sum:"; \
	  < $(DEBIAN)/exim4-base/usr/share/doc/exim4-base/examples/example.conf md5sum; \
	  echo "aborting build."; \
	  exit 1; \
	fi
	< $(DEBIAN)/exim4-base/usr/share/doc/exim4-base/examples/example.conf md5sum > $(DEBIAN)/example.conf.md5
	sed -e 's,/[a-zA-Z/0-9.-]*exim4-base/examples/,/etc/,' \
		< $(DEBIAN)/exim4-base/usr/share/doc/exim4-base/examples/example.conf \
		> $(DEBIAN)/exim4-base/usr/share/doc/exim4-base/examples/example.conf.tmp
	mv $(DEBIAN)/exim4-base/usr/share/doc/exim4-base/examples/example.conf.tmp \
		$(DEBIAN)/exim4-base/usr/share/doc/exim4-base/examples/example.conf
	install -m755 b-exim4-daemon-light/build-$(buildname)/convert4r4 \
		$(DEBIAN)/exim4-base/usr/sbin/exim_convert4r4
	install -m755 \
		b-exim4-daemon-light/build-$(buildname)/transport-filter.pl \
		b-exim4-daemon-light/util/ratelimit.pl \
		$(DEBIAN)/exim4-base/usr/share/doc/exim4-base/examples
	mv $(DEBIAN)/exim4-base/usr/sbin/exim \
		$(DEBIAN)/exim4-daemon-light/usr/sbin/exim4
	# fix permissions of /usr/sbin/exim4 if running with restrictive umask,
	# dh_fixperms sanitizes anything else
	chmod 4755 $(DEBIAN)/exim4-daemon-light/usr/sbin/exim4
	mv $(DEBIAN)/exim4-base/usr/sbin/eximon \
		$(DEBIAN)/eximon4/usr/sbin
	mv $(DEBIAN)/exim4-base/usr/sbin/eximon.bin \
		$(DEBIAN)/eximon4/usr/lib/exim4
	pod2man --center=EXIM4 --section=8 \
		$(DEBIAN)/exim4-base/usr/sbin/exipick \
		$(DEBIAN)/exim4-base/usr/share/man/man8/exipick.8
	pod2man --center=EXIM4 --section=8 \
		$(DEBIAN)/exim4-base/usr/sbin/eximstats \
		$(DEBIAN)/exim4-base/usr/share/man/man8/eximstats.8
	install -m755 $(DEBIAN)/syslog2eximlog $(DEBIAN)/exim4-base/usr/sbin/
	pod2man --center=EXIM4 --section=8 \
		$(DEBIAN)/syslog2eximlog \
		$(DEBIAN)/exim4-base/usr/share/man/man8/syslog2eximlog.8
	# if you change anything here, you will have to change
	# config-custom/debian/rules as well
	sed -e \
	"s/^UPEX4C_version=\"\"/UPEX4C_version=\"$(DEB_VERSION)\"/" \
	< $(DEBIAN)/debconf/update-exim4.conf \
	> $(DEBIAN)/exim4-config/usr/sbin/update-exim4.conf
	chmod 755 $(DEBIAN)/exim4-config/usr/sbin/update-exim4.conf
	install -m 755 $(DEBIAN)/update-exim4defaults \
		$(DEBIAN)/exim4-config/usr/sbin

	cd $(DEBIAN)/debconf/conf.d && \
		tar cf - `find \( -path '*/.svn/*' -prune \) -or \
		\( -type f -print \)` | \
		{ cd $(DEBIAN)/exim4-config/etc/exim4/conf.d/ && \
		tar xf - ; }

	install -m644 $(DEBIAN)/email-addresses $(DEBIAN)/exim4-config/etc/
	install -m640 -oroot -groot $(DEBIAN)/passwd.client \
		$(DEBIAN)/exim4-config/etc/exim4/
	chmod 755 $(DEBIAN)/debconf/update-exim4.conf.template
	env CONFDIR=$(DEBIAN)/debconf \
		$(DEBIAN)/debconf/update-exim4.conf.template --nobackup --run
	touch $@


# This dependency expands to
#   debian/exim4-daemon-heavy/usr/sbin/exim4: b-exim4-daemon-heavy/build-Linux-x86_64/exim
$(debiandaemonbinaries): $(DEBIAN)/%/usr/sbin/exim4: b-%/build-$(buildname)/exim
	dh_testdir
	dh_testroot
	dh_installdirs
	install -m4755 -oroot -groot $< $@


ifeq ($(buildbasepackages),yes)
install=installbase-stamp $(debiandaemonbinaries)
else
install=$(debiandaemonbinaries)
endif

override_dh_installchangelogs:
	dh_installchangelogs -pexim4-base doc/ChangeLog
	dh_installchangelogs --no-package=exim4-base \
		-XCHANGES -Xdoc/ChangeLog

override_dh_installppp:
	dh_installppp --name=exim4

override_dh_strip-arch:
	dh_strip --arch --dbgsym-migration='exim4-daemon-heavy-dbg (<< 4.89-4), exim4-daemon-light-dbg (<< 4.89-4), exim4-daemon-custom-dbg (<< 4.89-4), exim4-dbg (<< 4.89-4)'

override_dh_fixperms:
	dh_fixperms -X/etc/exim4/passwd.client -Xusr/sbin/exim4

override_dh_gencontrol:
	dh_gencontrol -- \
		-VUpstream-Version=$(DEB_VERSION_EPOCH_UPSTREAM) \
		-VMTA-Conflicts="$(shell cat $(DEBIAN)/mtalist)" \
		-Vdist:Provides:exim4-daemon-light="$(PROVIDE_DEFAULT_MTA)"

override_dh_installlogrotate:
	dh_installlogrotate
	dh_installlogrotate --name=exim4-paniclog

override_dh_installinit:
	dh_installinit --noscripts --name=exim4

override_dh_install:
	# install config.h from daemon package, but not from exim4-daemon-light
	dh_install -p exim4-dev \
		$(shell ls -1 b-exim4-daemon-*/build-$(buildname)/config.h | grep -v ^b-exim4-daemon-light/) \
		usr/include/exim4
	dh_install

override_dh_link:
	rm -rf debian/exim4/usr/share/doc/exim4
	dh_link

override_dh_auto_install:
	# disabled

# Build architecture-independent files here.
# this is just exim4-config and exim4.
binary-indep: build $(install)
ifeq ($(buildbasepackages),yes)
	dh binary-indep
endif

# Build architecture-dependent files here.
binary-arch: build $(install)
	# symlink identical maintainerscripts
	@for i in $(extradaemonpackages) ; do \
		ln -sfv exim4-daemon-light.prerm \
			"$(DEBIAN)/$$i.prerm" ; \
		ln -sfv exim4-daemon-light.postinst \
			"$(DEBIAN)/$$i.postinst" ; \
	done
	dh binary-arch

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