#!/usr/bin/make -f

#export DH_VERBOSE=1
DEB_HOST_ARCH := $(shell dpkg-architecture -qDEB_HOST_ARCH)
DEB_HOST_GNU_TYPE := $(shell dpkg-architecture -qDEB_HOST_GNU_TYPE)
DEB_BUILD_GNU_TYPE := $(shell dpkg-architecture -qDEB_BUILD_GNU_TYPE)
export QUILT_PATCHES := debian/patches

ROOT_DIR=$(shell pwd)

export HOME := $(ROOT_DIR)/debian

-include ${ROOT_DIR}/erts/vsn.mk
-include ${ROOT_DIR}/lib/erl_interface/vsn.mk
-include ${ROOT_DIR}/lib/ic/vsn.mk
-include ${ROOT_DIR}/lib/tools/vsn.mk
-include ${ROOT_DIR}/lib/webtool/vsn.mk
SOURCE_VERSION=$(shell dpkg-parsechangelog | sed -ne's!^Version: \(.*\)-.*!\1!p')
ABI_VERSION=$(shell cat debian/control | sed -ne's!^Provides: erlang-abi-\(.*\)!\1!p' | head -1)
HIPE_ARCHES=$(shell cat debian/control | grep '^Architecture:' | egrep -v '(all|any)' | sed -e 's/^Architecture: *//')

ifeq ($(findstring debug,$(DEB_BUILD_OPTIONS)),debug)
BUILD_HIPE := no
else
BUILD_HIPE := $(shell echo ' $(HIPE_ARCHES) ' | grep -c ' ${DEB_HOST_ARCH} ' | sed -es/1/yes/ -es/0/no/)
endif
ifeq ($(BUILD_HIPE), no)
BINARY_TARGETS=binary-erlang-base
INSTALL_RULE=install-stnd-stamp
TMPINSTALL_DIR=debian/erlang-stnd
ERLANGBASE=erlang-base=erlang-base (= $${binary:Version})
else
BINARY_TARGETS=binary-erlang-base binary-erlang-base-hipe
INSTALL_RULE=install-stnd-stamp install-hipe-stamp
TMPINSTALL_DIR=debian/erlang-hipe
ERLANGBASE=erlang-base=erlang-base (= $${binary:Version}) | erlang-base-hipe (= $${binary:Version})
endif

USE_KERNEL_POLL := $(shell echo ${DEB_HOST_ARCH} | egrep -c "hurd" | sed -es/1/no/ -es/0/yes/)
ifeq ($(USE_KERNEL_POLL), no)
KERNEL_POLL_OPT=--disable-kernel-poll
else
KERNEL_POLL_OPT=--enable-kernel-poll
endif

USE_CLOCK_GETTIME := $(shell echo ${DEB_HOST_ARCH} | egrep -c "bsd|hurd" | sed -es/1/no/ -es/0/yes/)
ifeq ($(USE_CLOCK_GETTIME), no)
CLOCK_GETTIME_OPT=
else
CLOCK_GETTIME_OPT=--enable-clock-gettime
endif

# Temporary (until #475459 is fixed) disabling threads for sparc architecture
ifeq ($(DEB_HOST_ARCH), sparc)
THREAD_OPTS=--disable-threads --disable-smp-support
else
ifeq ($(DEB_HOST_ARCH), hurd-i386)
THREAD_OPTS=--enable-threads --disable-smp-support
else
THREAD_OPTS=--enable-threads --enable-smp-support
endif
endif

LIBSCTP=libsctp1

ifeq ($(findstring debug,$(DEB_BUILD_OPTIONS)),debug)
CFLAGS=-g -O2 -fno-strict-aliasing
GEN_OPT_FLGS=-O2 -fno-strict-aliasing
TYPE=debug
else
CFLAGS=-g -O2 -fno-strict-aliasing
GEN_OPT_FLGS=-O2 -fno-strict-aliasing
TYPE=
endif

unpatch: patch-stamp
	dh_testdir
	quilt pop -a || test $$? = 2
	rm -rf .pc
	rm -f patch-stamp

patch: patch-stamp
patch-stamp:
	dh_testdir
	quilt push -a || test $$? = 2
	touch patch-stamp

clean: clean-patched unpatch
	dh_testdir
	dh_testroot
	dh_clean

clean-patched: patch-stamp
	dh_testdir
	dh_testroot

	[ ! -f Makefile ] || ${MAKE} clean
	rm -f lib/dialyzer/SKIP

	# Remove installed erlang from debian/
	rm -rf debian/erlang-stnd
	rm -rf debian/erlang-hipe

	# Restore replaced configure, config.guess, and config.sub files
	for i in `find ${ROOT_DIR} -name 'configure.backup'` ; do \
	    mv $$i $${i%%.backup} ; \
	done
	for i in `find ${ROOT_DIR} -name 'config.guess~'` ; do \
	    mv $$i $${i%%\~} ; \
	done
	for i in `find ${ROOT_DIR} -name 'config.sub~'` ; do \
	    mv $$i $${i%%\~} ; \
	done

	# Remove files, which were generated from templates
	for i in debian/*.in ; do \
	     rm -f $${i%%.in} ; \
	done

	# *.install were also generated on-the-fly
	rm -f debian/*.install

	rm -f debian/AUTHORS

	# Don't remove patch-stamp
	rm -f [^p]*-stamp

automake: automake-stamp
automake-stamp: patch-stamp
	dh_testdir

	# Return error if there are known nonfree docs in upstream tarball
	# Return error if there are prebuilt binaries in upstream tarball
	err=0 ; \
	for fn in `find lib/*/doc -name standard -or -name archive` ; do \
	    err=1 ; \
	    echo Found directory $$fn with non-free docs in upstream. Please remove it. ; \
	done ; \
	if [ -f prebuilt.files ] ; then \
	    err=1 ; \
	    echo Found prebuilt binaries in upstream. Please remove them. ; \
	fi ; \
	if [ $$err = 1 ] ; then \
	    echo ; \
	    echo Use get-orig-source target to get upstream tarball. ; \
	    echo ; \
	    false ; \
	fi

	# Preserve configure scripts
	for i in `find ${ROOT_DIR} -not \( -wholename '*/.pc' -prune \) \
				    -a -name 'configure'` ; do \
	    cp -f $$i $$i.backup ; \
	done

	# Replace config.guess and config.sub by installed in /usr/share/misc.
	# Also add suffix -gnu to ibm-linux in config.guess to fix FTBFS
	# on s390 architecture
	for i in `find ${ROOT_DIR} -not \( -wholename '*/.pc' -prune \) \
				    -a -name 'config.guess'` ; do \
	    cp -fb /usr/share/misc/config.guess $$i ; \
	    sed -i 's/-ibm-linux$$/-ibm-linux-gnu/g' $$i ; \
	done
	for i in `find ${ROOT_DIR} -not \( -wholename '*/.pc' -prune \) \
				    -a -name 'config.sub'` ; do \
	    cp -fb /usr/share/misc/config.sub $$i ; \
	done

	# Regenerate configure scripts using autoconf
	for i in `find ${ROOT_DIR} -not \( -wholename '*/.pc' -prune \) \
				    -a -name 'configure.in' -printf "%h\n"`; do \
	    echo "autoconf'ing $${i}"; \
	    (cd $${i} && autoconf) \
	done
	touch automake-stamp

configure-hipe: configure-hipe-stamp
configure-hipe-stamp: automake-stamp
	dh_testdir

	echo "BUILDING HIPE VERSION (BUILD_HIPE: $(BUILD_HIPE))"

	[ ! -f Makefile ] || ${MAKE} clean
	rm -f lib/dialyzer/SKIP

	CFLAGS="$(CFLAGS)" \
	./configure --host=$(DEB_HOST_GNU_TYPE) \
		    --build=$(DEB_BUILD_GNU_TYPE) \
		    --prefix=/usr \
		    --libexecdir=/usr/bin \
		    --infodir=/usr/share/info \
		    --mandir=/usr/share/man \
		    --enable-hybrid-heap \
		    $(THREAD_OPTS) \
		    --enable-hipe \
		    $(KERNEL_POLL_OPT) \
		    --enable-sctp \
		    $(CLOCK_GETTIME_OPT) \
		    --enable-dynamic-ssl-lib \
		    --without-ssl-zlib

	touch configure-hipe-stamp

configure-stnd: configure-stnd-stamp
configure-stnd-stamp: automake-stamp
	dh_testdir

	echo "BUILDING STANDARD VERSION (BUILD_HIPE: $(BUILD_HIPE))"

	[ ! -f Makefile ] || ${MAKE} clean
	rm -f lib/dialyzer/SKIP

	CFLAGS="$(CFLAGS)" \
	./configure --host=$(DEB_HOST_GNU_TYPE) \
		    --build=$(DEB_BUILD_GNU_TYPE) \
		    --prefix=/usr \
		    --libexecdir=/usr/bin \
		    --infodir=/usr/share/info \
		    --mandir=/usr/share/man \
		    --enable-hybrid-heap \
		    $(THREAD_OPTS) \
		    --disable-hipe \
		    $(KERNEL_POLL_OPT) \
		    --enable-sctp \
		    $(CLOCK_GETTIME_OPT) \
		    --enable-dynamic-ssl-lib \
		    --without-ssl-zlib

	touch configure-stnd-stamp

define do-install
	echo "*** do-install called for $(INSTALL_DIR)."

# Calls make install.
	 ${MAKE} INSTALL_PREFIX=$(INSTALL_DIR) TYPE=$(TYPE) install

# Replace ROOTDIR in "erl" and "start" scripts for real rootdir
# If there's no erl or start then it's better to fail than silently continue
	for dir in $(INSTALL_DIR)/usr/lib/erlang/erts-$(VSN)/bin		\
		   $(INSTALL_DIR)/usr/lib/erlang/bin; do			\
	    for val in erl start; do						\
		sed -i 's!ROOTDIR=.*!ROOTDIR=/usr/lib/erlang!' $${dir}/$${val}; \
	    done;								\
	done

# Correct ERL_ROOT in RELEASES file
	sed 's!%ERL_ROOT%!/usr/lib/erlang!' \
	    $(INSTALL_DIR)/usr/lib/erlang/releases/RELEASES.src \
	    >$(INSTALL_DIR)/usr/lib/erlang/releases/RELEASES

# Get rid of windows cruft
	-find $(INSTALL_DIR) -name *.bat -exec rm {} \;

# Fix permissions
	-cp $(INSTALL_DIR)/usr/lib/erlang/erts-$(VSN)/bin/start_erl.src \
	    $(INSTALL_DIR)/usr/lib/erlang/erts-$(VSN)/bin/start_erl
	-chmod 755 $(INSTALL_DIR)/usr/lib/erlang/erts-$(VSN)/bin/start_erl
	-chmod 755 $(INSTALL_DIR)/usr/lib/erlang/erts-$(VSN)/bin/*.src
	-chmod 644 $(INSTALL_DIR)/usr/lib/erlang/bin/start.script
	-chmod 644 $(INSTALL_DIR)/usr/lib/erlang/lib/wx-*/examples/*/*.beam
	-chmod 644 $(INSTALL_DIR)/usr/lib/erlang/lib/wx-*/examples/*/*.xpm

# Remove useless ssl and crypto object files
	-rm -rf $(INSTALL_DIR)/usr/lib/erlang/lib/crypto-*/priv/obj
	-rm -rf $(INSTALL_DIR)/usr/lib/erlang/lib/ssl-*/priv/obj

# Remove some files which should be rather in erlang-doc-html package
	-find $(INSTALL_DIR)/usr/lib/erlang/lib -name info -exec rm {} \;
	-rm -rf $(INSTALL_DIR)/usr/lib/erlang/erts-$(VSN)/doc

# Remove useless Install and manpage formatting scripts
	-rm -f $(INSTALL_DIR)/usr/lib/erlang/Install
	-rm -rf $(INSTALL_DIR)/usr/lib/erlang/misc

# Remove dialyzer_init_plt from sources directory
	-rm -f $(INSTALL_DIR)/usr/lib/erlang/lib/dialyzer-*/src/dialyzer_init_plt

# Fix run_test script in common_test application
	(cd $(INSTALL_DIR)/usr/lib/erlang/lib/common_test-* && \
	 ./install.sh $(INSTALL_DIR)/usr/lib/erlang/lib && \
	 sed -i -e 's:$(INSTALL_DIR)::g' priv/bin/run_test && \
	 rm install.sh priv/run_test.in)
endef

# CC_R_FLAG and LD_R_FLAG are empty because Debian doesn't recommend
# RPATH definition in binaries
# CC_R_OPT is used in percept
build-hipe: build-hipe-stamp
build-hipe-stamp: configure-hipe-stamp
	dh_testdir
	touch build-hipe-stamp
ifeq ($(findstring debug,$(DEB_BUILD_OPTIONS)),debug)
	${MAKE} TYPE=$(TYPE) FLAVOR=smp GEN_OPT_FLGS="$(GEN_OPT_FLGS)" emulator
	${MAKE} TYPE=$(TYPE) FLAVOR=plain GEN_OPT_FLGS="$(GEN_OPT_FLGS)" emulator
endif
	${MAKE} TYPE=$(TYPE) GEN_OPT_FLGS="$(GEN_OPT_FLGS)" CC_R_FLAG= LD_R_FLAG= CC_R_OPT=

build-stnd: build-stnd-stamp
build-stnd-stamp: configure-stnd-stamp
	dh_testdir
ifeq ($(findstring debug,$(DEB_BUILD_OPTIONS)),debug)
	${MAKE} TYPE=$(TYPE) FLAVOR=smp GEN_OPT_FLGS="$(GEN_OPT_FLGS)" emulator
	${MAKE} TYPE=$(TYPE) FLAVOR=plain GEN_OPT_FLGS="$(GEN_OPT_FLGS)" emulator
endif
	${MAKE} TYPE=$(TYPE) GEN_OPT_FLGS="$(GEN_OPT_FLGS)" CC_R_FLAG= LD_R_FLAG= CC_R_OPT=
	touch build-stnd-stamp

install-hipe: install-hipe-stamp
install-hipe-stamp: INSTALL_DIR=$(shell pwd)/debian/erlang-hipe
install-hipe-stamp: build-hipe-stamp
	dh_testdir
	$(do-install)
	touch install-hipe-stamp

install-stnd: install-stnd-stamp
install-stnd-stamp: INSTALL_DIR=$(shell pwd)/debian/erlang-stnd
install-stnd-stamp: build-stnd-stamp
	dh_testdir
	$(do-install)
	touch install-stnd-stamp

# Very accurately place each installed file into the proper package
# See this script and the debian/patterns/*.patterns files for more informations.
build-arch: build-stamp
build-indep: build-stamp
build: build-stamp
build-stamp: $(INSTALL_RULE)
	dh_testdir
	#
	for i in debian/*.in ; do \
	    sed -e's/@VERSION@/$(VSN)/g' \
	     	-e's/@SOURCE_VERSION@/$(SOURCE_VERSION)/g' \
	     	-e's/@HIPE_ARCHES@/$(HIPE_ARCHES)/g' \
	     	-e's/@ABI_VERSION@/$(ABI_VERSION)/g' \
	     	-e's/@EI_VSN@/$(EI_VSN)/g' \
	     	-e's/@IC_VSN@/$(IC_VSN)/g' \
		-e's/@WEBTOOL_VSN@/$(WEBTOOL_VSN)/g' \
		-e's/@TOOLS_VSN@/$(TOOLS_VSN)/g' <$$i >$${i%%.in} ; \
	done
	sh debian/analyse.sh $(TMPINSTALL_DIR)
	#
	# Add all author lists to debian/AUTHORS
	f=1 ; \
	for i in `find $(ROOT_DIR) -name AUTHORS | sort` ; do \
	    echo $$i ; \
	    if [ $$f = 1 ] ; then \
	    	f=0 ; \
	    else \
	    	echo >>debian/AUTHORS ; \
		echo "------------------------------------------------------------------------" >>debian/AUTHORS ; \
	        dirname=`dirname $$i` ; \
	        echo `basename $$dirname` >>debian/AUTHORS ; \
		echo >>debian/AUTHORS ; \
	    fi ; \
	    cat $$i >>debian/AUTHORS ; \
	done
	#
	touch build-stamp

binary-indep: build-stamp
	dh_testdir
	dh_testroot
	dh_installdirs -i
	dh_install -i --sourcedir=$(TMPINSTALL_DIR)
	#
	for pkg in examples ; do \
	    install -D -m 644 debian/lintian/erlang-$$pkg.lintian-override \
		$(ROOT_DIR)/debian/erlang-$$pkg/usr/share/lintian/overrides/erlang-$$pkg ; \
	done
	#
	dh_installdocs -i -A debian/README.Debian debian/TODO.Debian debian/AUTHORS
	dh_installemacsen -i
	dh_installexamples -i
	dh_installchangelogs -i
	dh_installman -i
	dh_installmenu -i
	dh_link -i
	dh_strip -i
	dh_compress -i
	dh_fixperms -i
	dh_makeshlibs -i
	dh_installdeb -i
	echo 'erlang-base=erlang-base | erlang-base-hipe' >>debian/erlang.substvars
	#echo 'erlang-base=erlang-base | erlang-base-hipe' >>debian/erlang-nox.substvars
	#echo 'erlang-base=erlang-base | erlang-base-hipe' >>debian/erlang-x11.substvars
	echo 'erlang-base=erlang-base (>= $${binary:Version}) | erlang-base-hipe (>= $${binary:Version}), erlang-base (<< $${binary:Version}.0) | erlang-base-hipe (<< $${binary:Version}.0)' \
	     >>debian/erlang-src.substvars
	echo 'erlang-base=erlang-base (>= $${binary:Version}) | erlang-base-hipe (>= $${binary:Version}), erlang-base (<< $${binary:Version}.0) | erlang-base-hipe (<< $${binary:Version}.0)' \
	     >>debian/erlang-examples.substvars
	dh_shlibdeps -i
	dh_gencontrol -i
	dh_md5sums -i
	dh_builddeb -i

binary-arch: $(BINARY_TARGETS)

binary-erlang-base: build-stamp
	dh_testdir
	dh_testroot
	dh_installdirs -a -Nerlang-base-hipe
	dh_install -perlang-base --sourcedir=debian/erlang-stnd
	dh_install -a -Nerlang-base -Nerlang-base-hipe --sourcedir=$(TMPINSTALL_DIR)
	#
	install -D -m 755 $(ROOT_DIR)/debian/erlang-depends \
		$(ROOT_DIR)/debian/erlang-dev/usr/bin/erlang-depends
	install -D -m 644 $(ROOT_DIR)/debian/erlang.xpm \
		$(ROOT_DIR)/debian/erlang-base/usr/share/pixmaps/erlang.xpm
	install -D -m 644 $(ROOT_DIR)/debian/erlang-base.desktop \
		$(ROOT_DIR)/debian/erlang-base/usr/share/apps/konsole/erlang.desktop
	#
	for pkg in base appmon debugger docbuilder edoc gs observer percept pman tv wx ; do \
	    install -D -m 644 debian/lintian/erlang-$$pkg.lintian-override \
		$(ROOT_DIR)/debian/erlang-$$pkg/usr/share/lintian/overrides/erlang-$$pkg ; \
	done
	#
	dh_installdocs -a -Nerlang-base-hipe -A debian/README.Debian debian/TODO.Debian debian/AUTHORS
	dh_installchangelogs -a -Nerlang-base-hipe
	dh_installemacsen -a -Nerlang-base-hipe
	dh_installexamples -a -Nerlang-base-hipe
	dh_installman -a -Nerlang-base-hipe
	dh_installmenu -a -Nerlang-base-hipe
	dh_link -a -Nerlang-base-hipe
	dh_strip -a -Nerlang-base-hipe
	dh_compress -a -Nerlang-base-hipe
	dh_fixperms -a -Nerlang-base-hipe
	dh_makeshlibs -a -Nerlang-base-hipe
	dh_installdeb -a -Nerlang-base-hipe
ifneq ($(DEB_HOST_ARCH), hurd-i386)
	echo 'procps:Depends=procps' >>debian/erlang-base.substvars
endif
	echo 'erlang-base=erlang-base | erlang-base-hipe' >>debian/erlang-nox.substvars
	echo 'erlang-base=erlang-base | erlang-base-hipe' >>debian/erlang-x11.substvars
	for pkg in \
		dev appmon asn1 common-test corba crypto debugger dialyzer \
		docbuilder edoc et eunit gs ic inets inviso megaco \
		mnesia observer odbc os-mon parsetools percept pman public-key \
		reltool runtime-tools snmp ssh ssl syntax-tools test-server toolbar \
		tools tv typer webtool wx xmerl ; do \
	    echo '$(ERLANGBASE)' >>debian/erlang-$$pkg.substvars ; \
	done
	dh_shlibdeps -a -Nerlang-base-hipe
	grep-status -s Version -PX $(LIBSCTP) | \
	    sed -e's!^Version: \(.*\)-[^-]*!libsctp:Version=$(LIBSCTP) (>= \1)!' \
	    >> debian/erlang-base.substvars
	dh_gencontrol -a -Nerlang-base-hipe
	dh_md5sums -a -Nerlang-base-hipe
	dh_builddeb -a -Nerlang-base-hipe

binary-erlang-base-hipe: build-stamp
	dh_testdir
	dh_testroot
	dh_installdirs -perlang-base-hipe
	dh_install -perlang-base-hipe --sourcedir=debian/erlang-hipe
	install -D -m 644 $(ROOT_DIR)/debian/erlang.xpm \
		$(ROOT_DIR)/debian/erlang-base-hipe/usr/share/pixmaps/erlang.xpm
	install -D -m 644 $(ROOT_DIR)/debian/erlang-base-hipe.desktop \
		$(ROOT_DIR)/debian/erlang-base-hipe/usr/share/apps/konsole/erlang.desktop
	#
	for pkg in base-hipe ; do \
	    install -D -m 644 debian/lintian/erlang-$$pkg.lintian-override \
		$(ROOT_DIR)/debian/erlang-$$pkg/usr/share/lintian/overrides/erlang-$$pkg ; \
	done
	#
	dh_installdocs -perlang-base-hipe debian/README.Debian debian/TODO.Debian debian/AUTHORS
	dh_installchangelogs -perlang-base-hipe
	dh_installemacsen -perlang-base-hipe
	dh_installexamples -perlang-base-hipe
	dh_installman -perlang-base-hipe
	dh_installmenu -perlang-base-hipe
	dh_link -perlang-base-hipe
	dh_strip -perlang-base-hipe
	dh_compress -perlang-base-hipe
	dh_fixperms -perlang-base-hipe
	dh_makeshlibs -perlang-base-hipe
	dh_installdeb -perlang-base-hipe
ifneq ($(DEB_HOST_ARCH), hurd-i386)
	echo 'procps:Depends=procps' >>debian/erlang-base-hipe.substvars
endif
	dh_shlibdeps -perlang-base-hipe
	grep-status -s Version -PX $(LIBSCTP) | \
	    sed -e's!^Version: \(.*\)-[^-]*!libsctp:Version=$(LIBSCTP) (>= \1)!' \
	    >> debian/erlang-base-hipe.substvars
	dh_gencontrol -perlang-base-hipe
	dh_md5sums -perlang-base-hipe
	dh_builddeb -perlang-base-hipe

source diff:
	@echo >&2 'source and diff are obsolete - use dpkg-source -b'; false

binary: binary-indep binary-arch

REL=R13B02-1
DEB_REL=13.b.2.1-dfsg

get-orig-source:
	CURDIR=`pwd` && TMPDIR=`mktemp -d /tmp/erlang.XXXXXX` && \
	cd $$TMPDIR && \
	wget -O - http://www.erlang.org/download/otp_src_$(REL).tar.gz | tar -zx && \
	(cd otp_src_$(REL) && \
	 ./otp_build save_bootstrap && \
	 for f in `cat prebuilt.files` ; do rm -f $$f ; done) && \
	rm -rvf otp_src_$(REL)/lib/*/doc/standard/ && \
	rm -rvf otp_src_$(REL)/lib/*/doc/archive/ && \
	tar -zcf $$CURDIR/erlang_$(DEB_REL).orig.tar.gz otp_src_$(REL) && \
	rm -rf $$TMPDIR

.PHONY: patch unpatch clean-patched clean automake install build build-arch build-indep
.PHONY: binary binary-arch binary-indep get-orig-source
.PHONY: configure-stnd build-stnd install-stnd
.PHONY: configure-hipe build-hipe install-hipe
.PHONY: binary-erlang-base binary-erlang-base-hipe
