#!/usr/bin/make -f

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

export DEB_CFLAGS_MAINT_APPEND := -Wall -D_FILE_OFFSET_BITS=64 -D_GNU_SOURCE
export DEB_BUILD_MAINT_OPTIONS := hardening=+all

# 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

# 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 ($(filter pkg.openldap.noslapd,$(DEB_BUILD_PROFILES)),)
	CONFIG += --disable-slapd
endif

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

# Ensure CC is set correctly for cross builds, unless it has already
# been set explicitly.
ifeq ($(origin CC),default)
	export CC := $(DEB_HOST_GNU_TYPE)-gcc
endif

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:
	dh_auto_build
ifeq ($(filter pkg.openldap.noslapd,$(DEB_BUILD_PROFILES)),)
	# 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:
	# 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:
	dh_auto_install -- STRIP_OPTS=
ifeq ($(filter pkg.openldap.noslapd,$(DEB_BUILD_PROFILES)),)
	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
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#'

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

ifeq ($(filter pkg.openldap.noslapd,$(DEB_BUILD_PROFILES)),)
override_dh_fixperms-arch:
	dh_fixperms
	chmod +x $(CURDIR)/debian/slapd/usr/share/slapd/ldiftopasswd
endif

override_dh_strip:
	dh_strip -pslapd --dbgsym-migration='slapd-dbg (<< 2.4.45+dfsg-1~)'
	dh_strip --remaining-packages
ifeq ($(filter pkg.openldap.noslapd,$(DEB_BUILD_PROFILES)),)
	# 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_link:
	sed -e"s/\$${DEB_HOST_MULTIARCH}/$(DEB_HOST_MULTIARCH)/g" < debian/libldap-dev.links.in > debian/libldap-dev.links
	dh_link

ifeq ($(filter pkg.openldap.noslapd,$(DEB_BUILD_PROFILES)),)
override_dh_makeshlibs:
	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)"
	dh_makeshlibs --remaining-packages
endif

ifeq ($(filter pkg.openldap.noslapd,$(DEB_BUILD_PROFILES)),)
override_dh_installdeb:
	dh_installdeb
	perl -w debian/dh_installscripts-common -p slapd
endif

override_dh_missing:
	dh_missing --fail-missing

override_dh_auto_clean:
	dh_auto_clean
	# Update translation templates for debconf
	debconf-updatepo
ifeq ($(filter pkg.openldap.noslapd,$(DEB_BUILD_PROFILES)),)
	# 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