#!/usr/bin/make -f

export DEB_CFLAGS_MAINT_APPEND := -Wall -D_GNU_SOURCE -Wno-unused-const-variable
export DEB_BUILD_MAINT_OPTIONS := hardening=+all future=+lfs

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

# Set this variable if you're building packages outside of Debian and don't
# want the checks for DFSG-freeness.
#DFSG_NONFREE = 1

# Expose maintainer address to build/mkversion (see debian/patches/set-maintainer-name)
export DEB_MAINTAINER ?= $(shell sed -ne 's/^Maintainer:\s\+//p' debian/control)

# Expose DEB_VERSION to build/version.sh (see debian/patches/debian-version)
export DEB_VERSION

# noslapd: empty (false) or non-empty (true)
noslapd := $(filter pkg.openldap.noslapd, ${DEB_BUILD_PROFILES})

# Workaround for bad glibc behavior when resolving localhost
export RESOLV_MULTI = off

CONFIG		= $(shell grep -v "^\#" debian/configure.options)
ifeq ($(DEB_HOST_ARCH_OS),hurd)
	CONFIG += --disable-mdb
endif
ifneq (${noslapd},)
	CONFIG += --disable-slapd
endif
ifneq ($(filter cross,$(DEB_BUILD_PROFILES)),)
	CONFIG += --with-yielding-select=yes ac_cv_func_memcmp_working=yes
endif

CONTRIB_MODULES = autogroup lastbind passwd passwd/pbkdf2 passwd/sha2 ppm smbk5pwd

installdir	:= $(CURDIR)/debian/tmp
builddir	:= $(CURDIR)/debian/build
slapddir	:= $(CURDIR)/debian/slapd/usr/sbin

# Standard variables used in contrib Makefiles.
# We override these in make invocations rather than patch every one.
CONTRIB_MAKEVARS := \
	LDAP_BUILD='$(builddir)' \
	OPT= \
	prefix=/usr \
	ldap_subdir=/ldap \
	moduledir='$$(libdir)$$(ldap_subdir)'

DH = dh $@ --builddirectory=$(builddir)
.PHONY: build
build:
	$(DH)
%:
	$(DH)

override_dh_auto_configure:
	# Check if we include the RFCs, Internet-Drafts, or upstream schemas
	# with RFC text (which are non DFSG-free).  You can set DFSG_NONFREE
	# to build the packages from the unchanged upstream sources but Debian
	# can not ship the RFCs in main so this test is here to make sure it
	# does not get in by accident again. -- Torsten
	if [ -z "$(DFSG_NONFREE)" ]; then \
	    if [ -e doc/drafts ] || [ -e doc/rfc ]; then exit 1; fi; \
	    if [ -e servers/slapd/schema/core.schema ] \
	       && grep -q 'RFC 4519 definition' servers/slapd/schema/core.schema; \
	    then \
		exit 1; \
	    fi; \
	fi

	# Copy our stripped schema versions into where upstream expects them.
	if [ -z "$(DFSG_NONFREE)" ]; then \
		cp debian/schema/*.schema debian/schema/*.ldif \
			servers/slapd/schema/; \
	fi

	dh_auto_configure -- $(CONFIG)

override_dh_auto_build-arch:
# slapdS.c is generated by libtool without using ${CPPFLAGS}
	@echo 'blhc: ignore-line-regexp: .*"slapdS\.c".*'
# servers/slapd/Makefile.in uses `$(AR) ruv libbackends.a *.o' construct,
# and *.o sort is locale-dependent. LC_ALL=C makes the build reproducible.
	LC_ALL=C \
		dh_auto_build
ifeq (${noslapd},)
	# passwd/sha2 needs special handling, see #1030716 and LP: #2000817
	for mod in $(CONTRIB_MODULES); do \
		if [ "$$mod" = "passwd/sha2" ]; then \
			EXTRA_OPT="-fno-strict-aliasing"; \
		else \
			EXTRA_OPT=""; \
		fi; \
		dh_auto_build -Dcontrib/slapd-modules/$$mod -Bcontrib/slapd-modules/$$mod -- $(CONTRIB_MAKEVARS) OPT+=$$EXTRA_OPT || exit $$?; \
	done
endif

override_dh_auto_test-arch:
	# Disable certain timing-sensitive tests which can be flaky on buildds (#1010608)
	rm -f tests/scripts/test063-delta-multiprovider tests/scripts/test069-delta-multiprovider-starttls
	dh_auto_test

override_dh_auto_install-arch:
# systemdsystemunitdir: we ship our own systemd unit
	dh_auto_install -- STRIP_OPTS= systemdsystemunitdir=
ifeq (${noslapd},)
	for mod in $(CONTRIB_MODULES); do \
		dh_auto_install -Dcontrib/slapd-modules/$$mod -Bcontrib/slapd-modules/$$mod -- $(CONTRIB_MAKEVARS) || exit $$?; \
	done

	# Empty the dependency_libs file in the .la files.
	for F in $(installdir)/usr/lib/ldap/*.la; do \
		sed -i "s/^dependency_libs=.*/dependency_libs=''/" $$F; \
	done

	# install AppArmor profile
	install -D -m 644 $(CURDIR)/debian/apparmor-profile \
	    $(CURDIR)/debian/slapd/etc/apparmor.d/usr.sbin.slapd
	dh_apparmor -pslapd --profile-name=usr.sbin.slapd
endif

	# Check all built libraries for unresolved symbols except for the
	# libslapi library.  It is a special case since the SLAPI interface
	# depends on symbols defined in slapd itself.  Those symbols will
	# remain unresolved until the plugin is loaded into slapd.
	for F in $(installdir)/usr/lib/$(DEB_HOST_MULTIARCH)/*.so.*.*.*; do \
	    if echo "$$F" | grep -q libslapi ; then \
	        continue; \
	    fi; \
	    if LD_LIBRARY_PATH=$(installdir)/usr/lib/$(DEB_HOST_MULTIARCH) ldd -d -r $$F 2>&1 | grep '^undefined symbol:'; then \
	        echo; \
	        echo "library $$F has undefined references.  Please fix this before continuing."; \
		exit 1; \
	    fi; \
	done

	# Upstream manpages are section 8C but installed as section 8
	find $(installdir)/usr/share/man -name \*.8 \
		| xargs perl -pi -e 's#(\.TH \w+ 8)C#$$1#'

# for indep, we only need the ldap.conf.5 manpage
override_dh_auto_build-indep:
	$(MAKE) -C ${builddir}/doc/man/man5
override_dh_auto_test-indep:
override_dh_auto_install-indep:
	install -Dm0644 ${builddir}/doc/man/man5/ldap.conf.5.tmp \
	    ${installdir}/usr/share/man/man5/ldap.conf.5

ifeq (${noslapd},)
	# install Apport hook
	install -D -m 644 $(CURDIR)/debian/slapd.py $(CURDIR)/debian/slapd/usr/share/apport/package-hooks/slapd.py

	# install ufw profile
	install -D -m 644 $(CURDIR)/debian/slapd.ufw.profile \
	    $(CURDIR)/debian/slapd/etc/ufw/applications.d/slapd
endif

override_dh_installinit:
	dh_installinit --no-restart-after-upgrade --error-handler=ignore_init_failure -- "defaults 19 80"

override_dh_strip:
	dh_strip
ifeq (${noslapd},)
	# hardlink these so not confined by apparmor; do this here and not
	# in dh_link so that dh_strip doesn't get confused and put the wrong
	# binary in the debug package.
	for f in slapacl slapadd slapauth slapcat slapdn slapindex slapmodify slappasswd slapschema slaptest; do \
	    ln -f $(slapddir)/slapd $(slapddir)/$$f ; \
	done
endif

override_dh_makeshlibs:
ifeq (${noslapd},)
	echo "slapd:Provides=$$(objdump -p debian/slapd/usr/lib/$(DEB_HOST_MULTIARCH)/libslapi-*.so.* \
		| sed -ne '/SONAME/ { s/[[:space:]]*SONAME[[:space:]]*//; \
		                      s/\.so\./-/; p; q }' \
	)" >> debian/slapd.substvars
	dh_makeshlibs -pslapd -X/usr/lib/ldap/ -V "$$(sed -ne's/slapd:Provides=//p' debian/slapd.substvars)"
endif
	dh_makeshlibs --remaining-packages

override_dh_installdeb:
	dh_installdeb
ifeq (${noslapd},)
	perl -w debian/dh_installscripts-common -p slapd
endif

override_dh_auto_clean:
	dh_auto_clean
	# Update translation templates for debconf
	debconf-updatepo
ifeq (${noslapd},)
	# Remove our stripped schema from the upstream source area.
	if [ -z "$(DFSG_NONFREE)" ]; then \
	    set -e; for s in debian/schema/*.schema debian/schema/*.ldif; do \
	        rm -f servers/slapd/schema/`basename $$s`; \
	    done; \
	fi

	# Clean the contrib directory
	for mod in $(CONTRIB_MODULES); do \
		dh_auto_clean -Dcontrib/slapd-modules/$$mod -Bcontrib/slapd-modules/$$mod || exit $$?; \
	done
endif
