#!/usr/bin/make -f
#
# Copyright (C) 2004,2005,2006 Lemur Consulting Ltd
# Copyright (C) 2006,2007,2008,2009,2010,2011,2012,2013,2014,2015,2016,2017 Olly Betts
#
# Permission is hereby granted, free of charge, to any person obtaining a copy
# of this software and associated documentation files (the "Software"), to
# deal in the Software without restriction, including without limitation the
# rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
# sell copies of the Software, and to permit persons to whom the Software is
# furnished to do so, subject to the following conditions:
#
# The above copyright notice and this permission notice shall be included in
# all copies or substantial portions of the Software.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
# IN THE SOFTWARE.

# Codename we're building packages for.  For backported packages, put the
# codename (e.g. wheezy or precise) in debian/codename.  If that file doesn't
# exist, the default is sid.
CODENAME := $(shell cat debian/codename 2>/dev/null||echo sid)

# Version without the "-N" suffix.
XAPIAN_VERSION := $(shell sed 's/.*(\([^-+]*\)\([-+].*\)*).*/\1/;q' debian/changelog)

# The next incompatible version - i.e. the first release of the next release
# branch.  So for XAPIAN_VERSION "1.0.<n>", this should be "1.1.0".
XAPIAN_VERSION_CEILING := $(shell echo '$(XAPIAN_VERSION)'|awk -F. '{print $$1"."$$2+1".0"}')

# `--exclude=.EXT' arguments to pass dh_install
DH_INSTALL_EXCLUDE := --exclude=.pyc --exclude=.pyo

BUILD_DEPS := debhelper (>= $(shell cat debian/compat)),

dh_with := --with autotools-dev

# PHP is disabled by default due to incompatibility of GPL and PHP licence.
DEFAULT_LANGUAGES := java python python3 ruby tcl
LANGUAGES := $(shell cat debian/bindings-to-package 2>/dev/null || echo '$(DEFAULT_LANGUAGES)')

ifneq ($(findstring java, $(LANGUAGES)), )
export JAVA_HOME=/usr/lib/jvm/default-java
BUILD_DEPS += javahelper, default-jdk, fastjar,
dh_with += --with javahelper
endif

# Use filter instead of findstring so we only match against whole words
# (in particular, we don't want to match "php7").  Allow "php" or "php5"
# - "php" is the documented name, but we used to check with "findstring"
# here, so "php5" will always have worked too.
ifneq ($(filter php php5, $(LANGUAGES)), )
BUILD_PHP5 := 1
# Build depends for PHP5.  We need the -cli package so we can run "make check"
# on the bindings and to get the phpapi version we need to depend on.
BUILD_DEPS += php5-dev, php5-cli,
endif

ifneq ($(filter php7, $(LANGUAGES)), )
BUILD_PHP7 := 1
PHP7_VERSIONS ?= $(shell /usr/sbin/phpquery -V)
# Build depends for PHP7.  We need the -cli package so we can run "make check"
# on the bindings and to get the phpapi version we need to depend on.
#
# Only the first % in the replacement part is substituted, so we need to do
# this in two goes.  It might seem that php-all-dev makes the versioned
# phpN-dev dependencies unnecessary, but sadly the description is misleading
# and it apparently deliberately only pulls a single phpN-dev.  We could just
# build for that single version, but there appears to be no way to pull in the
# corresponding php-cli version, so given we have to mess with versions here
# it's actually simpler to do this.
BUILD_DEPS += $(PHP7_VERSIONS:%=php%-dev,) $(PHP7_VERSIONS:%=php%-cli,)
endif

XS_RUBY_VERSIONS := X-Dummy-Ruby: Ruby bindings not being packaged
ifneq ($(findstring ruby, $(LANGUAGES)), )
# xapian-bindings 1.3.6 dropped support for Ruby < 2.1, so skip packaging the
# ruby bindings for codenames which didn't have Ruby >= 2.1.
ifeq ($(findstring .$(CODENAME)., .precise.trusty.squeeze.wheezy.), )
XS_RUBY_VERSIONS := XS-Ruby-Versions: all
rubylibdir := vendorlibdir
rubyarchdir := vendorarchdir
# More recent versions all have the ruby-all-dev and ruby packages.
BUILD_DEPS += ruby-all-dev, ruby,
# Ruby 2.2 unbundled unit/test.
BUILD_DEPS += ruby-test-unit,
RUBY_VERSIONS := $(shell ruby -rruby_debian_dev -e 'print RubyDebianDev::RUBY_CONFIG_VERSION.values.grep(/^2\.[1-9]/).join(" ")')
RUBY_LATEST_VERSION := $(shell ruby -rruby_debian_dev -e 'print RubyDebianDev::RUBY_CONFIG_VERSION.values[-1]')
endif
endif

# Use filter instead of findstring so we only match against whole words
# (in particular, we don't want to match "python3").
ifneq ($(filter python, $(LANGUAGES)), )
# The python versions to build for:
PYTHON_VERSIONS := $(shell pyversions -r debian/control)

BUILD_DEPS += dh-python, python-all-dev (>= 2.6.6-3~), python-sphinx,
dh_with += --with python2
endif

ifneq ($(filter python3, $(LANGUAGES)), )
# The python3 versions to build for:
PYTHON3_VERSIONS := $(shell py3versions -r debian/control)
ifeq ($(filter python, $(LANGUAGES)), )
# Need dh-python for python and python3 bindings, but only list it once when
# building both.
BUILD_DEPS += dh-python,
endif
BUILD_DEPS += python3-all-dev, python3-sphinx,
dh_with += --with python3
endif

ifneq ($(findstring tcl, $(LANGUAGES)), )
# Build depends for Tcl.  We use Tcl's stubs mechanism, so the built
# bindings will work with any Tcl version from 8.0.6 upwards, whichever
# version they were built against.
#
# The "tcl-dev" dependency package pulls in the package for the current
# preferred version.
BUILD_DEPS += tcl-dev,# NB Trailing ',' required here!
BUILD_TCL := 1
endif

confflags := $(shell dpkg-buildflags --export=configure)

export DEB_HOST_GNU_TYPE  ?= $(shell dpkg-architecture -qDEB_HOST_GNU_TYPE)
export DEB_BUILD_GNU_TYPE ?= $(shell dpkg-architecture -qDEB_BUILD_GNU_TYPE)

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

# Handle DEB_BUILD_OPTIONS.  Note that dh_strip handles "nostrip" for us,
# dpkg-buildflags handles "noopt", and dh_auto_test handles "nocheck".
ifneq (,$(filter parallel=%,$(DEB_BUILD_OPTIONS)))
    NUMJOBS = $(patsubst parallel=%,%,$(filter parallel=%,$(DEB_BUILD_OPTIONS)))
    MAKEFLAGS += -j$(NUMJOBS)
endif

# We need a versioned build dependency on libxapian-dev.
# NB Trailing ',' required here!
BUILD_DEPS += \
	libxapian-dev (>= $(XAPIAN_VERSION)), \
	libxapian-dev (<< $(XAPIAN_VERSION_CEILING)),

commonconfflags := \
	$(confflags) \
	--prefix=/usr \
	--sysconfdir=/etc

# With GCC3 and later this won't make a huge difference, but it'll save
# a bit of time and diskspace while building.
commonconfflags += --disable-dependency-tracking

%:
	dh $@ $(dh_with)

debian/control: maint

maintclean: clean
	rm -f debian/control

maint:
	rm -f debian/control.tmp
	sed -e 's/@BUILD_DEPS@/$(BUILD_DEPS)/g' \
	    -e 's/@XS_RUBY_VERSIONS@/$(XS_RUBY_VERSIONS)/g' \
	    < debian/control.in > debian/control.tmp
ifneq ($(findstring java, $(LANGUAGES)), )
	cat debian/control-java.in >> debian/control.tmp
endif
ifeq ($(BUILD_TCL), 1)
	cat debian/control-tcl.in >> debian/control.tmp
endif
ifneq ($(PYTHON_VERSIONS), )
	cat debian/control-python.in >> debian/control.tmp
endif
ifneq ($(PYTHON3_VERSIONS), )
	cat debian/control-python3.in >> debian/control.tmp
endif
ifeq ($(BUILD_PHP5), 1)
	sed "s/@PHP_VERSION@/5/g" debian/control-php.in >> debian/control.tmp
endif
ifeq ($(BUILD_PHP7), 1)
	sed "s/@PHP_VERSION@/7/g" debian/control-php.in >> debian/control.tmp
endif
ifneq ($(RUBY_VERSIONS), )
	cat debian/control-ruby.in >> debian/control.tmp
endif
	mv debian/control.tmp debian/control

override_dh_auto_configure:
	for python in $(PYTHON_VERSIONS); do \
	    set -e; \
	    mkdir -p debian/build/$$python; \
	    cd debian/build/$$python; \
	    ../../../configure $(commonconfflags) --with-python \
		PYTHON=/usr/bin/$$python; \
	    cd ../../..; \
	done

	for python in $(PYTHON3_VERSIONS); do \
	    set -e; \
	    mkdir -p debian/build/$$python; \
	    cd debian/build/$$python; \
	    ../../../configure $(commonconfflags) --with-python3 \
		PYTHON3=/usr/bin/$$python; \
	    cd ../../..; \
	done

ifeq ($(BUILD_PHP5), 1)
	mkdir -p debian/build/php5
	cd debian/build/php5 && ../../../configure $(commonconfflags) \
	    --with-php PHP_CONFIG=/usr/bin/php-config5
endif

ifeq ($(BUILD_PHP7), 1)
	for v in $(PHP7_VERSIONS); do \
	    set -e; \
	    mkdir -p debian/build/php$$v; \
	    cd debian/build/php$$v; \
	    ../../../configure $(commonconfflags) \
		--with-php7 PHP_CONFIG7=/usr/bin/php-config$$v; \
	    cd ../../..; \
	done
endif

	for v in $(RUBY_VERSIONS); do \
	    set -e; \
	    mkdir -p debian/build/ruby$$v; \
	    cd debian/build/ruby$$v; \
	    RUBY=/usr/bin/ruby$$v; \
	    ../../../configure $(commonconfflags) --with-ruby \
		--docdir=/usr/share/doc/xapian-bindings-ruby$$v \
		RUBY=$$RUBY \
		RUBY_LIB=`$$RUBY -rrbconfig -e 'puts RbConfig::CONFIG["$(rubylibdir)"]'` \
		RUBY_LIB_ARCH=`$$RUBY -rrbconfig -e 'puts RbConfig::CONFIG["$(rubyarchdir)"]'`; \
	    cd ../../..; \
	done

ifeq ($(BUILD_TCL), 1)
	mkdir -p debian/build/tcl
	cd debian/build/tcl && ../../../configure $(commonconfflags) \
	    --with-tcl TCL_LIB=/usr/lib/tcltk
endif

ifneq ($(findstring java, $(LANGUAGES)), )
	mkdir -p debian/build/java
	cd debian/build/java && ../../../configure $(commonconfflags) --with-java
endif

override_dh_auto_build:
	for python in $(PYTHON_VERSIONS) $(PYTHON3_VERSIONS); do \
	    set -e; \
	    $(MAKE) -C debian/build/$$python ; \
	done
ifeq ($(BUILD_PHP5), 1)
	$(MAKE) -C debian/build/php5
endif
ifeq ($(BUILD_PHP7), 1)
	for v in $(PHP7_VERSIONS); do \
	    set -e; \
	    $(MAKE) -C debian/build/php$$v; \
	done
endif
	for v in $(RUBY_VERSIONS); do \
	    set -e; \
	    $(MAKE) -C debian/build/ruby$$v ; \
	done
ifeq ($(BUILD_TCL), 1)
	$(MAKE) -C debian/build/tcl
endif
ifneq ($(findstring java, $(LANGUAGES)), )
	$(MAKE) -C debian/build/java
endif

MAKE_CHECK := $(MAKE) check VERBOSE=1

override_dh_auto_test:
	for python in $(PYTHON_VERSIONS); do \
	    set -e; \
	    cp python/*test*.py debian/build/$$python/python ; \
	    $(MAKE_CHECK) -C debian/build/$$python ; \
	done
	for python in $(PYTHON3_VERSIONS); do \
	    set -e; \
	    cp python3/*test*.py debian/build/$$python/python3 ; \
	    $(MAKE_CHECK) -C debian/build/$$python ; \
	done
ifeq ($(BUILD_PHP5), 1)
	$(MAKE_CHECK) -C debian/build/php5
endif
ifeq ($(BUILD_PHP7), 1)
	# Specify PHP_PATH_SEPARATOR here to work around bug in xapian-bindings
	# 1.4.4 (and earlier).  Can be dropped once 1.4.5 is released and
	# packaged.
	for v in $(PHP7_VERSIONS); do \
	    set -e; \
	    $(MAKE_CHECK) -C debian/build/php$$v PHP_PATH_SEPARATOR=: ; \
	done
endif
	for v in $(RUBY_VERSIONS); do \
	    set -e; \
	    $(MAKE_CHECK) -C debian/build/ruby$$v ; \
	done
ifeq ($(BUILD_TCL), 1)
	$(MAKE_CHECK) -C debian/build/tcl
endif
ifneq ($(findstring java, $(LANGUAGES)), )
	$(MAKE_CHECK) -C debian/build/java
endif

override_dh_auto_install:
	# Install the files under 'debian/tmp'.
	for python in $(PYTHON_VERSIONS) $(PYTHON3_VERSIONS); do \
	    set -e; \
	    $(MAKE) -C debian/build/$$python DESTDIR=$(CURDIR)/debian/tmp install; \
	done

ifeq ($(BUILD_PHP5), 1)
	# Install xapian.php in /usr/share/php as that's on the default
	# include path.
	$(MAKE) -C debian/build/php5 DESTDIR=$(CURDIR)/debian/tmp \
	    phpincdir=/usr/share/php install
	# Install upstream xapian.php as /usr/share/php/_xapian-5.php, and
	# install a wrapper script as xapian.php which will include the wrapper
	# for the appropriate PHP version.  PHP7's xapian.php is renamed via
	# dpkg-divert by our preinst maintainer script if both bindings are
	# installed together (unhelpfully /usr/share/php is used by both major
	# versions).
	mv debian/tmp/usr/share/php/xapian.php debian/tmp/usr/share/php/_xapian-5.php
	install -m 644 debian/xapian-wrapper.php debian/tmp/usr/share/php/xapian.php
	install -d -m 755 debian/tmp/etc/php5/conf.d
	install -m 644 debian/php-xapian.ini debian/tmp/etc/php5/conf.d/xapian.ini
endif

ifeq ($(BUILD_PHP7), 1)
	# If we're building for multiple PHP7 minor versions, xapian.php will
	# be the same for all of them so it doesn't matter that the loop below
	# will install them over the top of each other.
	for v in $(PHP7_VERSIONS); do \
	    set -e; \
	    $(MAKE) -C debian/build/php$$v DESTDIR=$(CURDIR)/debian/tmp \
		phpincdir=/usr/share/php install ; \
		install -d -m 755 debian/tmp/etc/php/$$v/mods-available ; \
	    install -m 644 debian/php-xapian.ini \
		debian/tmp/etc/php/$$v/mods-available/xapian.ini ; \
	done
endif

ifneq ($(RUBY_VERSIONS), )
	for v in $(RUBY_VERSIONS); do \
	    set -e; \
	    $(MAKE) -C debian/build/ruby$$v DESTDIR=$(CURDIR)/debian/tmp install; \
	done
	# `created.rid` contains a timestamp making the build non-reproducible.
	# It doesn't seem to be useful to install, so just delete it.
	rm -f debian/tmp/usr/share/doc/xapian-bindings-ruby*/ruby/rdocs/created.rid
	# We only need one xapian.rb for ruby-xapian, and it should be the same
	# for all versions, so if present, check that the older versions are
	# the same as the latest, then throw them away.  Also, delete the older
	# versions of the docs - the latest docs are installed by
	# ruby-xapian.install.
	rb=debian/tmp`/usr/bin/ruby$(RUBY_LATEST_VERSION) -rrbconfig -e 'puts RbConfig::CONFIG["$(rubylibdir)"]'`/xapian.rb; \
	for v in $(RUBY_VERSIONS); do \
	    if [ "$$v" != "$(RUBY_LATEST_VERSION)" ] ; then \
		set -e; \
		rb_old=debian/tmp`/usr/bin/ruby$$v -rrbconfig -e 'puts RbConfig::CONFIG["$(rubylibdir)"]'`/xapian.rb; \
		diff "$$rb_old" "$$rb"; \
		rm -rf "$$rb_old" debian/tmp/usr/share/doc/xapian-bindings-ruby$$v; \
	    fi; \
	done; \
	mv "$$rb" debian/tmp/usr/lib/ruby/vendor_ruby
endif

ifeq ($(BUILD_TCL), 1)
	$(MAKE) -C debian/build/tcl DESTDIR=$(CURDIR)/debian/tmp install
endif

ifneq ($(findstring java, $(LANGUAGES)), )
	$(MAKE) -C debian/build/java DESTDIR=$(CURDIR)/debian/tmp install \
	    jnidir='/usr/lib/$(shell dpkg-architecture -qDEB_HOST_MULTIARCH)/jni'
endif

	# Reads the '*.install' files to decide where to install everything.
	dh_install --sourcedir=debian/tmp --fail-missing $(DH_INSTALL_EXCLUDE)

override_dh_gencontrol:
ifeq ($(BUILD_PHP5), 1)
	echo "php5:Depends=phpapi-`/usr/bin/php-config5 --phpapi`, php5-common" >> debian/php5-xapian.substvars
endif

ifeq ($(BUILD_PHP7), 1)
	perl -E 'say "php7:Depends=".join("|", map{ chomp($$x=`/usr/bin/php-config$$_ --phpapi`); "phpapi-$$x" } @ARGV).", ".join("|", map{ "php$$_-common" } @ARGV)' \
	    $(PHP7_VERSIONS) >> debian/php7-xapian.substvars
endif

ifneq ($(RUBY_VERSIONS), )
	# The module(s) are linked against libruby2.x but use none of its
	# symbols, so there's no dependency generated.  That's unhelpful for
	# users and for transitions (https://bugs.debian.org/816775) so
	# generate a suitable dependency.
	#
	# If RUBY_VERSIONS is 2.1 2.2 2.3, Depends: libruby2.3|libruby2.1 |libruby2.2
	echo "ruby:Depends=libruby$(lastword $(RUBY_VERSIONS))$(wordlist 1, $(shell expr $(words $(RUBY_VERSIONS)) - 1), $(RUBY_VERSIONS:%=|libruby%))" \
	    >> debian/ruby-xapian.substvars
endif

	dh_gencontrol

.PHONY: maint maintclean
