#!/usr/bin/make -f
#
# Copyright (C) 2004,2005,2006 Lemur Consulting Ltd
# Copyright (C) 2006,2007,2008,2009,2010,2011,2012,2013,2014 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

# >= 7.0.50~ needed for Ruby packaging.
BUILD_DEPS := debhelper (>= 7.0.50~),

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

ifneq ($(findstring php, $(LANGUAGES)), )
PHP_VERSIONS := 5
# Build depends for PHP.  We need phpN-cli so we can run "make check" on
# the bindings and to get the phpapi version we need to depend on.
#
# Note that we check for /usr/bin/php-configN before trying to build PHP
# bindings below.
#
# Only the first % in the replacement part is substituted, so we need to do
# this in two goes.
BUILD_DEPS += $(PHP_VERSIONS:%=php%-dev,)
BUILD_DEPS += $(PHP_VERSIONS:%=php%-cli,)
endif

XS_RUBY_VERSIONS := X-Dummy: Ruby bindings not being packaged
ifneq ($(findstring ruby, $(LANGUAGES)), )
# Be conservative for now and leave backported versions on old ruby policy.
ifeq ($(findstring .$(CODENAME)., .lucid.precise.quantal.raring.squeeze.wheezy.), )
# For new ruby policy:
XB_RUBY_VERSIONS := XB-Ruby-Versions: $${ruby:Versions}
XS_RUBY_VERSIONS := XS-Ruby-Versions: all
rubylibdir := vendorlibdir
rubyarchdir := vendorarchdir
# Ruby 2.0 will debut in jessie and was in Ubuntu saucy, which neatly matches
# the versions on new ruby policy.
ifeq ($(findstring .$(CODENAME)., .saucy.), )
# More recent versions all have the ruby-all-dev and ruby packages.
BUILD_DEPS += ruby-all-dev, ruby,
RUBY_VERSIONS := $(shell ruby -rruby_debian_dev -e 'print RubyDebianDev::RUBY_CONFIG_VERSION.values.join(" ")')
RUBY_PROVIDES := $(shell ruby -rruby_debian_dev -e 'p = RubyDebianDev::RUBY_CONFIG_VERSION.values.grep(/^1\./).map {|v| "libxapian-ruby"+v }.join(", "); print p.size() ? "Provides: "+p : "X-Dummy: No provides"')
RUBY_LATEST_VERSION := $(shell ruby -rruby_debian_dev -e 'print RubyDebianDev::RUBY_CONFIG_VERSION.values[-1]')
else
# Ubuntu saucy didn't have the ruby-all-dev and ruby packages.
RUBY_VERSIONS := 1.8 1.9.1 2.0
RUBY_PROVIDES := Provides: libxapian-ruby1.8, libxapian-ruby1.9.1
RUBY_LATEST_VERSION := 2.0
endif
else
# For old ruby policy:
XS_RUBY_VERSIONS := X-Dummy: Remove me once old ruby policy support is dropped
rubylibdir := rubylibdir
rubyarchdir := archdir
RUBY_VERSIONS := 1.8 1.9.1
endif
ifeq ($(findstring ruby-all-dev, $(BUILD_DEPS)), )
# Build depends for Ruby when ruby-all-dev isn't available.
#
# Only the first % in the replacement part is substituted, so we need to do
# this in two goes.
BUILD_DEPS += $(RUBY_VERSIONS:%=ruby%-dev,)
BUILD_DEPS += $(RUBY_VERSIONS:%=ruby%,)
endif
endif

X_PYTHON_VERSION := X-Dummy: Python bindings not being packaged
ifneq ($(findstring python, $(LANGUAGES)), )
# The python versions to build for:
PYTHON_VERSIONS := $(shell pyversions -r debian/control)

ifeq ($(findstring .$(CODENAME)., .lucid.), )
USING_PYCENTRAL := 0
BUILD_DEPS += python, python-all-dev (>= 2.6.6-3~),
XB_PYTHON_VERSION := X-Dummy: Remove me once python-central support is dropped
X_PYTHON_VERSION := X-Python-Version: >= 2.3
else
USING_PYCENTRAL := 1
BUILD_DEPS += python, python-central (>= 0.4.10), python-all-dev,
XB_PYTHON_VERSION := XB-Python-Version: $${python:Versions}
X_PYTHON_VERSION := XS-Python-Version: all
endif
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.
#
# lenny/hardy onwards have a "tcl-dev" dummy package which pulls in the package
# for the current preferred version.
BUILD_DEPS += tcl-dev,# NB Trailing ',' required here!
ifeq ($(findstring .$(CODENAME)., .lucid.precise.quantal.raring.saucy.trusty.squeeze.wheezy.), )
# /usr/bin/tclsh-default is going to be dropped.
TCLSH=/usr/bin/tclsh
# tclsh8.6 requires us to link to libtclstub.a - upstream doesn't yet do this
# automatically.
TCL_MAKE_OPTS = TCL_LIBS=-ltclstub
else
TCLSH=/usr/bin/tclsh-default
TCL_MAKE_OPTS =
endif
BUILD_TCL := 1
endif

export DH_OPTIONS

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

CFLAGS := $(shell dpkg-buildflags --get CFLAGS)
CXXFLAGS := $(shell dpkg-buildflags --get CXXFLAGS)
LDFLAGS := $(shell dpkg-buildflags --get LDFLAGS)
CPPFLAGS := $(shell dpkg-buildflags --get CPPFLAGS)

# Fallback for suites which don't have dpkg-buildflags.
ifeq (,$(CFLAGS))
    # -g needed for armel to workaround unaligned relocations (#576944)
    CFLAGS := -g
    CXXFLAGS := -g
ifeq (,$(filter noopt,$(DEB_BUILD_OPTIONS)))
    CFLAGS += -O2
    CXXFLAGS += -O2
endif
endif

confflags := CFLAGS='$(CFLAGS)' CXXFLAGS='$(CXXFLAGS)'
confflags += LDFLAGS='$(LDFLAGS)' CPPFLAGS='$(CPPFLAGS)'
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)
    # Disable the testsuite when cross-compiling.
    DEB_BUILD_OPTIONS += nocheck
endif

# Handle DEB_BUILD_OPTIONS.  Note that dh_strip handles nostrip for us, and
# dpkg-buildflags handles noopt.
ifneq (,$(filter parallel=%,$(DEB_BUILD_OPTIONS)))
    NUMJOBS = $(patsubst parallel=%,%,$(filter parallel=%,$(DEB_BUILD_OPTIONS)))
    MAKEFLAGS += -j$(NUMJOBS)
endif
ifneq (,$(filter nocheck,$(DEB_BUILD_OPTIONS)))
    MAKE_CHECK := :
else
    MAKE_CHECK := make check
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

debian/control: maint

maintclean: clean
	rm -f debian/control \
	      debian/libxapian-ruby1.8.doc-base \
	      debian/libxapian-ruby1.8.install \
	      debian/libxapian-ruby1.8.postinst \
	      debian/libxapian-ruby1.9.1.doc-base \
	      debian/libxapian-ruby1.9.1.install \
	      debian/libxapian-ruby1.9.1.postinst \
	      debian/ruby-xapian.doc-base \
	      debian/ruby-xapian.install

maint:
	rm -f debian/control.tmp
	sed -e 's/@BUILD_DEPS@/$(BUILD_DEPS)/g' \
	    -e 's/@X_PYTHON_VERSION@/$(X_PYTHON_VERSION)/g' \
	    -e 's/@XS_RUBY_VERSIONS@/$(XS_RUBY_VERSIONS)/g' \
	    < debian/control.in > debian/control.tmp
ifeq ($(BUILD_TCL), 1)
	cat debian/control-tcl.in >> debian/control.tmp
endif
ifneq ($(PYTHON_VERSIONS), )
	sed -e 's/@XB_PYTHON_VERSION@/$(XB_PYTHON_VERSION)/g' \
	    < debian/control-python.in >> debian/control.tmp
endif
ifneq ($(PHP_VERSIONS), )
	for v in $(PHP_VERSIONS); do \
	    sed "s/@PHP_VERSION@/$$v/g" debian/control-php.in ;\
	done >> debian/control.tmp
endif
ifneq ($(RUBY_VERSIONS), )
	# Call the doc-base templates <pkg>.d-b.in, as <pkg>.doc-base.* is
	# special to dh_installdocs. (#722096)
ifdef XB_RUBY_VERSIONS
	sed -e 's/@XB_RUBY_VERSIONS@/$(XB_RUBY_VERSIONS)/g' \
	    -e 's/@RUBY_PROVIDES@/$(RUBY_PROVIDES)/g' \
	    < debian/control-ruby-new.in >> debian/control.tmp
	cp debian/ruby-xapian.d-b.in debian/ruby-xapian.doc-base
	cp debian/ruby-xapian.install.in debian/ruby-xapian.install
	t=x ;\
	for v in $(RUBY_VERSIONS); do \
	    case $$v$$t in \
	    1.*) \
		sed -e "s/@PACKAGE@/libxapian-ruby$$v/" \
		    -e 's/@TARGET@/ruby-xapian/' \
		    < debian/dummy.postinst.in \
		    > debian/libxapian-ruby$$v.postinst ;\
		sed -e "s/@RUBY_VERSION@/$$v/g" \
		    < debian/control-ruby-new-oldlib.in >> debian/control.tmp ;;\
	    *x) \
		t= ;\
		echo 'usr/lib/*/ruby/vendor_ruby/*/_xapian.so' >> debian/ruby-xapian.install ;;\
	    esac ;\
	done
else
	for v in $(RUBY_VERSIONS); do \
	    sed "s/@RUBY_VERSION@/$$v/g" debian/control-ruby-old.in >> debian/control.tmp ;\
	    cp debian/libxapian-ruby$$v.d-b.in debian/libxapian-ruby$$v.doc-base ;\
	    cp debian/libxapian-ruby$$v.install.in debian/libxapian-ruby$$v.install ;\
	done
endif
endif
	mv debian/control.tmp debian/control

configure: configure-stamp
configure-stamp:
	dh_testdir

	# Use the latest config.sub and config.guess from the autotools-dev
	# package.
	dh_autotools-dev_updateconfig

	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 v in $(PHP_VERSIONS); do \
	    c=/usr/bin/php-config$$v; \
	    if test -x $$c ; then \
		set -e; \
		mkdir -p debian/build/php$$v; \
		cd debian/build/php$$v; \
		../../../configure $(commonconfflags) --with-php PHP_CONFIG=$$c; \
		cd ../../..; \
	    fi \
	done

	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 TCLSH=$(TCLSH) TCL_LIB=/usr/lib/tcltk
endif

	touch $@

build: build-arch build-indep
build-arch: build-stamp
build-indep: build-stamp
build-stamp: configure-stamp
	dh_testdir
	for python in $(PYTHON_VERSIONS); do \
	    set -e; \
	    $(MAKE) -C debian/build/$$python ; \
	    $(MAKE_CHECK) -C debian/build/$$python ; \
	done
	for v in $(PHP_VERSIONS); do \
	    if test -x /usr/bin/php-config$$v ; then \
		set -e; \
		$(MAKE) -C debian/build/php$$v ; \
		$(MAKE_CHECK) -C debian/build/php$$v ; \
	    fi \
	done
	for v in $(RUBY_VERSIONS); do \
	    set -e; \
	    $(MAKE) -C debian/build/ruby$$v ; \
	    $(MAKE_CHECK) -C debian/build/ruby$$v ; \
	done
ifeq ($(BUILD_TCL), 1)
	$(MAKE) -C debian/build/tcl $(TCL_MAKE_OPTS)
	$(MAKE_CHECK) -C debian/build/tcl
endif
	touch $@

install: DH_OPTIONS=
install: install-stamp
install-stamp: build-stamp
	dh_testdir
	dh_testroot
	dh_prep
	dh_installdirs

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

	# Install xapian.php in /usr/share/php for PHP5 so that it's in the
	# PHP include_path.
	for v in $(PHP_VERSIONS); do \
	    c=/usr/bin/php-config$$v; \
	    if test -x $$c ; then \
		set -e; \
		$(MAKE) -C debian/build/php$$v DESTDIR=$(CURDIR)/debian/tmp \
		    phpincdir=/usr/share/php`echo $$v|tr -d 5` install; \
		install -d -m 755 debian/tmp/etc/php$$v/conf.d; \
		install -m 644 debian/etc-php-conf.d-xapian.ini debian/tmp/etc/php$$v/conf.d/xapian.ini; \
	    fi \
	done

	for v in $(RUBY_VERSIONS); do \
	    set -e; \
	    $(MAKE) -C debian/build/ruby$$v DESTDIR=$(CURDIR)/debian/tmp install; \
	done
ifdef XB_RUBY_VERSIONS
	# 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

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

binary: binary-arch binary-indep
binary-arch: DH_OPTIONS=-a
binary-arch: build-arch install
	dh_testdir
	dh_testroot
	dh_installdocs
	dh_installexamples
	dh_installmenu
	dh_installman
	dh_installchangelogs ChangeLog
	dh_strip
	dh_link
	dh_compress
	dh_fixperms
	dh_makeshlibs
ifneq ($(PYTHON_VERSIONS), )
ifeq ($(USING_PYCENTRAL), 1)
	DH_PYCENTRAL=include-links dh_pycentral
else
	dh_python2
endif
endif
	dh_installdeb

	dh_shlibdeps
	# Rewrite the dependency on libxapianN to be >= our version, since
	# we may require features added in that version.
	sed -i \
	    's/^shlibs:Depends=.*libxapian[0-9]\+/& (>= $(XAPIAN_VERSION))/' \
	    debian/*.substvars

	for v in $(PHP_VERSIONS); do \
	    c=/usr/bin/php-config$$v; \
	    if test -x $$c ; then \
		set -e; \
		echo "php$$v:Depends=phpapi-`$$c --phpapi`, php$$v-common" >> debian/php$$v-xapian.substvars; \
	    fi \
	done

	dh_gencontrol
	dh_md5sums
	dh_builddeb

binary-indep: DH_OPTIONS=-i
binary-indep: build-indep install
	dh_testdir
	dh_testroot
	for v in $(RUBY_VERSIONS); do \
	    set -e; \
	    d=debian/libxapian-ruby$$v/usr/share/doc; \
	    mkdir -p "$$d"; \
	    ln -s ruby-xapian "$$d/libxapian-ruby$$v"; \
	done
	dh_fixperms
	dh_installdeb
	dh_gencontrol
	dh_md5sums
	dh_builddeb

clean:
	dh_testdir
	dh_testroot
	dh_autotools-dev_restoreconfig
	dh_clean

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