#!/usr/bin/make -f

# DEB_BUILD_OPTIONS supported:
#   noopt       Compile with gcc -O0 rather than -O2
#   nostrip     Do not strip binaries and libraries
#   debug       Enable additional debug support
#   nocheck     Skip test suites (synonym 'notest')
#   with-javahl, no-javahl |
#   with-apache, no-apache | enable/disable certain packages
#   with-ruby, no-ruby     |

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

# Disable test suite
export DEB_OPT_NOCHECK=yes

# Fully functional Java support is still a bit spotty on some Debian
# architectures.  DISABLE_JAVAHL_ARCHS overrides ENABLE_JAVAHL=yes.
# Note: the Build-Depends line in /control must be kept in sync
# with DISABLE_JAVAHL_ARCHS.

ENABLE_JAVAHL        := yes
DISABLE_JAVAHL_ARCHS := alpha arm hppa m68k mips mipsel hurd-i386
ifneq (,$(filter $(DEB_HOST_ARCH), $(DISABLE_JAVAHL_ARCHS)))
  ENABLE_JAVAHL :=
endif

# We may need to disable libapache2-svn and/or libsvn-ruby*.
ENABLE_APACHE        := yes
ENABLE_RUBY          := yes

DEB_BUILDDIR     := BUILD
MAKE_B           := $(MAKE) -C $(DEB_BUILDDIR)

export LANG := C
export HOME := $(DEB_BUILDDIR)/dummy_home

include /usr/share/quilt/quilt.make

# ENABLE_FOO -> DEB_OPT_WITH_FOO=1
# DEB_BUILD_OPTIONS='foo bar' -> DEB_OPT_FOO=1, DEB_OPT_BAR=1
# DEB_BUILD_OPTIONS='no-foo' -> DEB_OPT_WITH_FOO=""
$(foreach o, JAVAHL APACHE RUBY, $(if $(filter y yes 1,$(ENABLE_$o)), \
    $(eval DEB_OPT_WITH_$o := 1),$(eval DEB_OPT_WITH_$o :=)))
d_b_o:=$(shell echo "$$DEB_BUILD_OPTIONS" | tr 'a-z-,' 'A-Z_ ')
$(foreach o, $(d_b_o), \
  $(if $(findstring =,$o), $(eval DEB_OPT_$o), $(eval DEB_OPT_$o := 1)))
$(foreach o, $(filter NO_%,$(d_b_o)), $(eval DEB_OPT_$(subst NO_,WITH_,$o) :=))
$(if $(DEB_OPT_PARALLEL),$(eval MAKEFLAGS += -j$(DEB_OPT_PARALLEL)))

# How to fix "#!/usr/bin/env " lines:  $(call fix_shebangs_in, /your/dir)
fix_shebangs_in = \
	find $1 -type f | xargs -r egrep -m1 -c '^\#! ?/' | sed -n 's/:1//p' |\
	xargs -r sed -i -e 's:^\#! */usr/bin/env perl.*:\#!/usr/bin/perl -w:' \
			-e 's:^\#! */usr/bin/env pyth.*:\#!/usr/bin/python:' \
			-e 's:^\#! */usr/bin/env ruby.*:\#!/usr/bin/$(RUBY):'

PERL_DIR := $(DEB_BUILDDIR)/subversion/bindings/swig/perl/native
PY_DIR := $(DEB_BUILDDIR)/subversion/bindings/swig/python
PYVERSIONS := $(shell pyversions -vi)

allpy = \
	set -e; for v in $(PYVERSIONS); do \
		$(RM) $(PY_DIR); \
		ln -fs python$$v $(PY_DIR); \
		pylib=$$(python$$v -c 'from distutils import sysconfig; print sysconfig.get_python_lib()'); \
		$1; \
	done

confflags := \
		--prefix=/usr \
		--mandir=\$${prefix}/share/man \
		--with-custom-libtool=libtool \
		--with-apr=/usr \
		--with-apr-util=/usr \
		--with-neon=/usr \
		--with-serf=/usr \
		--with-berkeley-db=:::db \
		--with-sasl=/usr \
		--with-editor=/usr/bin/editor \
		--with-ruby-sitedir=/usr/lib/ruby \
		--with-swig=/usr \
		--with-kwallet \
		--with-gnome-keyring

ifdef DEB_OPT_DEBUG
  confflags+= --enable-debug 
endif
export EXTRA_CFLAGS := -O2
ifdef DEB_OPT_NOOPT
  EXTRA_CFLAGS := -O0
endif

export DH_OPTIONS
ifdef DEB_OPT_WITH_JAVAHL
  confflags += --enable-javahl --with-jdk=/opt/jdk --without-jikes \
               --with-junit=/usr/share/java/junit.jar
else
  DH_OPTIONS += -Nlibsvn-java
  confflags += --disable-javahl
endif

ifdef DEB_OPT_WITH_APACHE
  confflags += --with-apxs=/usr/bin/apxs2 --disable-mod-activation
else
  confflags += --without-apxs
  DH_OPTIONS += -Nlibapache2-svn
endif

RUBY := $(shell dh_listpackages | sed -ne '/libsvn-ruby1/s//ruby1/p')
ifndef DEB_OPT_WITH_RUBY
  DH_OPTIONS += -Nlibsvn-ruby -Nlibsvn-$(RUBY)
  RUBY := fooby
endif


# Set autoconf cross-compile mode correctly.
# Also disable testsuite if cross-compiling.
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)
  DEB_OPT_NOCHECK := 1
endif


# I'm not trying to be difficult: this check exists because building as
# root really _does_ fail.  The failure mode as of 1.4.0 is test 17
# from switch_tests.py.  Upstream response is "so don't build as root".
# (fakeroot does not fail, as it does not wrap the access(2) syscall.)
#
# We run this code from build-arch, since that's what actually fails as
# root, but also from autogen, since that will halt the build earlier.
define DONT_BE_ROOT
	@if [ $$(id -u) = 0 ] && [ -z "$(FAKEROOTKEY)" ]; then \
		echo >&2 "***"; \
		echo >&2 "*** Building as root is not supported ***"; \
		false; \
	fi
endef

debian/stamp-autogen: $(QUILT_STAMPFN)
	$(DONT_BE_ROOT)
	./autogen.sh
	touch $@

debian/stamp-configure: $(QUILT_STAMPFN) debian/stamp-autogen
	dh_testdir

	test -e patches || ln -s debian/patches patches
	mkdir -p $(DEB_BUILDDIR) $(HOME)
	cd $(DEB_BUILDDIR) && \
		PYTHON=/usr/bin/python RUBY=/usr/bin/$(RUBY) \
		$(CURDIR)/configure $(confflags)

	# Copy swig bindings over
	cp -R subversion/bindings/* BUILD/subversion/bindings/
	# Subversion upstream ships with Swig 1.3.25 pregenerated
	# files, which may interact badly with the build if Debian swig
	# is not version 1.3.25 - particularly with swig 1.3.24.
	# Thus we unconditionally delete the pregenerated files.
	+$(MAKE_B) extraclean-swig
	for v in $(PYVERSIONS); do \
		cp -la $(PY_DIR) $(PY_DIR)$$v; \
	done
	$(RM) -r $(PY_DIR)

	touch $@

build: debian/stamp-build-arch debian/stamp-build-indep

check_defs := CLEANUP=1 LC_ALL=C
check_swig := check-swig-py check-swig-pl $(if $(DEB_OPT_WITH_RUBY),check-swig-rb)
check_all := $(check_swig) $(if $(DEB_OPT_WITH_JAVAHL),check-javahl) check
check-help:
	@echo "$(MAKE) $(check_all)"

check check-swig-rb check-javahl: debian/stamp-build-arch
	+$(MAKE_B) $@ $(check_defs)

check-swig-pl: debian/stamp-build-arch
	+$(MAKE_B) $@ $(check_defs)
	$(MAKE) -C $(PERL_DIR) test LC_ALL=C

check-swig-py: debian/stamp-build-arch
	$(call allpy, \
	  $(MAKE_B) $@ PYTHON=python$$v PYVER=$$v $(check_defs))

build-arch: debian/stamp-build-arch
debian/stamp-build-arch: debian/stamp-configure
	dh_testdir
	$(DONT_BE_ROOT)

	# note: autogen-swig does not support -jN
	$(call allpy, $(MAKE_B) -j1 autogen-swig)
	+$(MAKE_B) all tools
	# Run svn once, to make sure it populates $(HOME)/.subversion/*
	$(DEB_BUILDDIR)/subversion/svn/svn --version > /dev/null
	$(call allpy, \
	  $(MAKE_B) swig-py PYTHON=python$$v PYVER=$$v \
	            PYTHON_INCLUDES=-I/usr/include/python$$v \
	            swig_pydir=$$pylib/libsvn swig_pydir_extra=$$pylib/svn)
	# note: swig-pl seems to have trouble with -jN
	+$(MAKE_B) -j1 swig-pl
	$(MAKE) -C $(PERL_DIR) all \
		OPTIMIZE="-g -Wall $(EXTRA_CFLAGS)"
ifdef DEB_OPT_WITH_RUBY
	+$(MAKE_B) swig-rb
endif
ifdef DEB_OPT_WITH_JAVAHL
	+$(MAKE_B) -j1 javahl
endif
	touch $@

ifndef DEB_OPT_NOCHECK
	@echo "###################################################"
	@echo "Running testsuite - may take a while.  To disable,"
	@echo "use DEB_BUILD_OPTIONS=nocheck or edit debian/rules."
	@echo
	$(MAKE) -f debian/rules $(check_swig)

  ifdef DEB_OPT_WITH_JAVAHL
	# This fails on current free JVMs, according to Blair Zajac.
	# Thus the "-" prefix, to ignore failure, for now.
	-$(MAKE) -f debian/rules check-javahl
  endif

	# Run 'check' last, as it takes longest.  'cat tests.log' is for
	# obtaining diagnostics from buildd logs.
	@if ! $(MAKE) -f debian/rules check; then \
	  echo "###################################################"; \
	  echo "Testsuite failed, 'tests.log' follows:"; echo; \
	  cat $(DEB_BUILDDIR)/tests.log; \
	  exit 1; \
	fi
endif
	touch $@

build-indep: debian/stamp-build-indep
debian/stamp-build-indep: debian/stamp-configure
	+$(MAKE_B) doc-api
	touch $@

clean: unpatch
	dh_testdir
	dh_clean
	$(RM) patches
	! [ -f $(DEB_BUILDDIR)/Makefile ] || $(MAKE_B) extraclean-swig distclean
	$(RM) -r $(DEB_BUILDDIR)
	$(RM) build-outputs.mk gen-make.opts subversion/svn_private_config.h.in
	find * -name \*.pyc -print0 | xargs -0 $(RM)
	# these are (re)generated by autogen.sh
	$(RM) subversion/bindings/swig/proxy/*.swg
	$(RM) configure build/libtool.m4 build/ltmain.sh
	$(RM) debian/stamp-*

debian/stamp-install-common:
	dh_testdir
	dh_testroot
	dh_clean -k
	for package in `dh_listpackages` ; do \
		lintiandir=debian/$$package/usr/share/lintian/overrides; \
		if grep -q ^$$package: debian/lintian-overrides; then \
			mkdir -p $$lintiandir; \
			grep -B1 ^$$package: debian/lintian-overrides \
			    > $$lintiandir/$$package; \
		fi; \
	done
	touch $@

debian/stamp-install-indep: debian/stamp-build-indep debian/stamp-install-common
	dh_installdirs -i
	dh_install -i

	mkdir -p debian/libsvn-doc/usr/share/doc/libsvn1
	mkdir -p debian/libsvn-doc/usr/share/doc/libsvn-doc
	cp -a $(DEB_BUILDDIR)/doc/doxygen/html \
		debian/libsvn-doc/usr/share/doc/libsvn1/
	ln -s ../libsvn1/html debian/libsvn-doc/usr/share/doc/libsvn-doc/
	mkdir debian/libsvn-doc/usr/share/doc/libsvn1/examples
	ln -s ../libsvn1/examples debian/libsvn-doc/usr/share/doc/libsvn-doc/

	#  don't Install files for 'subversion-tools' package.
	#install $(DEB_BUILDDIR)/tools/backup/hot-backup.py \
        #	debian/subversion-tools/usr/bin/svn-hot-backup

	#rm debian/subversion-tools/usr/share/subversion/hook-scripts/*.in
	#rm -r debian/subversion-tools/usr/share/subversion/hook-scripts/mailer/tests
ifndef DEB_OPT_WITH_RUBY
	#rm debian/subversion-tools/usr/share/subversion/hook-scripts/*.rb
endif

	# Fix some scripts not to use #!/usr/bin/env.
	#$(call fix_shebangs_in, debian/*/usr/bin \
	#	debian/subversion-tools/usr/share/subversion/hook-scripts)
	#cd debian/subversion-tools/usr/share/subversion/hook-scripts; \
#		chmod 0755 commit-email.pl commit-access-control.pl \
#			   mailer/mailer.py verify-po.py svnperms.py;

	# Remove suffixes from binaries in /usr/bin
#	prename 's/\.(sh|pl|rb|py)$$//' debian/*/usr/bin/*

	# pod2man -c 'User Commands' -r "" debian/bin/svn-clean \
	#	$(DEB_BUILDDIR)/svn-clean.1

	touch $@

debian/stamp-install-arch: debian/stamp-build-arch debian/stamp-install-common
	dh_installdirs -s

	$(MAKE_B) local-install install-tools \
		DESTDIR=$(CURDIR)/debian/tmp toolsdir=/usr/bin
	sed -i 's:/usr/lib/lib\([^ ]*\).la:-l\1:g' debian/tmp/usr/lib/*.la

	$(call allpy, \
	  $(MAKE_B) install-swig-py DESTDIR=$(CURDIR)/debian/tmp \
	            PYTHON=python$$v PYVER=$$v \
	            swig_pydir=$$pylib/libsvn swig_pydir_extra=$$pylib/svn)
	$(RM) debian/tmp/usr/lib/python*/*-packages/libsvn/*.la
	$(RM) debian/tmp/usr/lib/python*/*-packages/libsvn/*.a

ifdef DEB_OPT_WITH_JAVAHL
	$(MAKE_B) install-javahl \
		DESTDIR=$(CURDIR)/debian/tmp \
		javahl_javadir=/usr/share/java \
		javahl_libdir=/usr/lib \
		javahl_javahdir=/usr/include/svn-javahl
endif

	$(MAKE_B) install-swig-pl-lib \
		DESTDIR=$(CURDIR)/debian/tmp
	$(MAKE) -C $(PERL_DIR) install \
		MAN3EXT=3perl DESTDIR=$(CURDIR)/debian/tmp

ifdef DEB_OPT_WITH_RUBY
	$(MAKE_B) install-swig-rb \
		DESTDIR=$(CURDIR)/debian/tmp
	find debian/tmp/usr/lib/ruby \( -name \*.a -o -name \*.la \) -print0 | \
		xargs -0 $(RM)
endif

	# Intermediate hack, until we can remove the .la files entirely.
	find debian/tmp/usr/lib -name \*.la -print0 |\
		xargs -0 sed -i "/dependency_libs/s/=.*/=''/"

	dh_install -s

	install -m644 tools/client-side/bash_completion \
		debian/subversion/etc/bash_completion.d/subversion

ifdef DEB_OPT_WITH_JAVAHL
	install subversion/mod_authz_svn/INSTALL \
		debian/libapache2-svn/usr/share/doc/libapache2-svn/INSTALL.authz
endif

	# Commented out as we no longer package svnshell
	#cp tools/examples/svnshell.py debian/python-subversion/usr/bin/svnshell
	#$(call fix_shebangs_in, debian/python-subversion/usr/bin/svnshell)

	touch $@

binary-indep: debian/stamp-install-indep
	dh_testdir
	dh_testroot
	dh_link -i
	dh_installdocs -i
	dh_installexamples -i
	$(call fix_shebangs_in, debian/*/usr/share/doc/*/examples)
	dh_installman -i
	dh_installchangelogs -i CHANGES
	dh_compress -i
	dh_fixperms -i
	dh_perl -i
	dh_installdeb -i
	dh_gencontrol -i
	dh_md5sums -i
	dh_builddeb -i

binary-arch: debian/stamp-install-arch
	dh_testdir
	dh_testroot
	dh_link -s
	dh_installdocs -s
	dh_installexamples -s
	$(call fix_shebangs_in, debian/*/usr/share/doc/*/examples)
	dh_installchangelogs -s CHANGES
	dh_fixperms -s
	dh_strip -s
	dh_compress -s

	# dh_makeshlibs (1) creates shlibs/symbols files and (2) generates
	# calls to 'ldconfig' in postinst/postrm.  We want (1) only for
	# libsvn1, but (2) for the swig packages too.
	dpkg-gensymbols -d -psubversion
	dh_makeshlibs -s -Xjava -X_auth_ -X_ra_neon -X_ra_serf -X_ra_local -X_fs_
	$(RM) debian/*.symbols
	#$(RM) debian/libsvn-*/DEBIAN/symbols debian/python-subversion/DEBIAN/symbols
	#sed -i '/svn_.*__/d' debian/libsvn1/DEBIAN/symbols
	dh_perl -s
	dh_pysupport -s
	dh_installdeb -s
	dh_shlibdeps -s -X_auth_
	dh_gencontrol -s
	dh_md5sums -s
	dh_builddeb -s

binary: binary-indep binary-arch

.PHONY: build build-arch build-indep binary binary-arch binary-indep
.PHONY: clean check-help $(check_all)
