#!/usr/bin/make -f

include /usr/share/dpkg/architecture.mk

SHELL:=/bin/sh

ROOT:=$(CURDIR)/build-dir

CONFIGDIR:=$(ROOT)/config
BS_SML:=$(ROOT)/bootstrap/bin/sml
BS_LINK:=$(ROOT)/bootstrap/bin/.link-sml

SMLNJ_HOME:=/usr/lib/smlnj
BINDIR:=$(SMLNJ_HOME)/bin

VERSION=$(shell cat $(CONFIGDIR)/version)

# word size of the host architecture; selects x86 vs amd64 on x86_64 kernels
SIZE_OPT:=-$(DEB_HOST_ARCH_BITS)

# keep the build directory out of source locations recorded in stable
# libraries (see debian/patches/0004-pathnames-trim-prefix.patch)
export SMLNJ_TRIM_PREFIX:=$(ROOT)/

srcdirs:=ckit cml config doc eXene heap2asm ml-burg ml-lex ml-lpt MLRISC ml-yacc nlffi pgraph smlnj-c smlnj-lib trace-debug-profile
basedirs:=cm compiler old-basis runtime system

%:
	dh $@

vars.sed:
	echo "s,@SHELL@,$(SHELL),g" > vars.sed
	echo "s,@SMLNJ_HOME@,$(SMLNJ_HOME)," >> vars.sed
	echo "s,@BINDIR@,$(BINDIR)," >> vars.sed
	echo "s,@VERSION@,$(VERSION)," >> vars.sed
	echo "s,@SIZE@,$(DEB_HOST_ARCH_BITS)," >> vars.sed

arch-n-opsys: $(CONFIGDIR)/_arch-n-opsys vars.sed
	sed -f vars.sed $< > $@
	chmod 755 $@

# bootstrap compiler from the upstream boot images
$(BS_SML):
	for f in $(srcdirs); do cp -a $$f $(ROOT)/bootstrap; done
	mkdir -p $(ROOT)/bootstrap/base
	for f in $(basedirs); do cp -a base/$$f $(ROOT)/bootstrap/base; done
	cd $(ROOT)/bootstrap && env -u MAKEFLAGS URLGETTER=/bin/false ./config/install.sh $(SIZE_OPT) -default $(DEB_HOST_ARCH_BITS)

# rebuild the boot images from source using the bootstrap compiler
boot.%.tgz: $(BS_SML)
	cd $(ROOT)/base/system && PATH=$(ROOT)/bootstrap/bin:$$PATH \
	   && echo 'OS.Process.exit (if CMB.make () then OS.Process.success else OS.Process.failure);' \
	      | $< $(SIZE_OPT) "\$$smlnj/cmb.cm"
	cd $(ROOT)/base/system/sml.boot.$* \
	   && $(BS_LINK) $(SIZE_OPT) @SMLboot=BOOTLIST @SMLheap=sml @SMLalloc=1M \
	                 @SMLrebuild="foo"
	rm -r $(ROOT)/base/system/sml.boot.$*
	rm -r $(ROOT)/base/system/*.bin.$*
	mv $(ROOT)/base/system/foo.boot.$* $(ROOT)/base/system/sml.boot.$*
	cd $(ROOT)/base/system && tar zcf $(ROOT)/$@ sml.boot.$*

boot: arch-n-opsys
	eval `./arch-n-opsys $(SIZE_OPT)` && $(MAKE) -f debian/rules boot.$$ARCH-unix.tgz

smlnj: boot
	cd $(ROOT) && env -u MAKEFLAGS URLGETTER=/bin/false ./config/install.sh $(SIZE_OPT) -default $(DEB_HOST_ARCH_BITS)
	@echo Populate $(ROOT)/wrapper
	mkdir -p $(ROOT)/wrapper
	for c in `cd $(ROOT)/bin && ls`; do \
	  sed -f vars.sed -e "s/@CMD@/$$c/g" debian/wrapper.in > $(ROOT)/wrapper/$$c; \
	  chmod 755 $(ROOT)/wrapper/$$c; \
	done

# build in a copy of the source tree
$(ROOT):
	mkdir -p $(ROOT)
	cp -a $(srcdirs) base bootstrap $(ROOT)

override_dh_auto_build-arch: $(ROOT)
	cp debian/targets $(ROOT)/config/targets
	$(MAKE) -f debian/rules smlnj

override_dh_auto_build-indep: $(ROOT)
ifeq (,$(filter nodoc,$(DEB_BUILD_OPTIONS)))
	cd $(ROOT)/base/cm/Doc && latex manual.tex && latex manual.tex && dvipdfmx -o cm_manual.pdf manual.dvi
	cd $(ROOT)/ml-lpt/doc && latex manual.tex && latex manual.tex && dvipdfmx -o ml-lpt_manual.pdf manual.dvi
	cd $(ROOT)/ml-burg/doc && transfig -L ps tree.fig && make && latex doc.tex && latex doc.tex && dvipdfmx -o ml-burg_manual.pdf doc.dvi
	cd $(ROOT)/nlffi/lib/Doc/manual && latex nlffi.tex && latex nlffi.tex && dvipdfmx nlffi.dvi
	cd $(ROOT)/MLRISC/Doc && make -j1
	cd $(ROOT)/MLRISC/Tools/Doc && make
	cd $(ROOT)/ml-lex/doc && pdflatex ml-lex.tex
	cd $(ROOT)/ml-yacc/doc && latex mlyacc.tex && latex mlyacc.tex && dvipdfmx mlyacc.dvi
endif

override_dh_auto_clean:
	rm -rf $(ROOT)
	rm -f vars.sed arch-n-opsys boot*tgz

execute_after_dh_install-arch:
# make sure that the build path doesn't sneak into the driver scripts
	find debian/*$(BINDIR) -maxdepth 1 -type f \
	   -exec sed -i 's,$(ROOT)/bin,$(BINDIR),g; s,$(ROOT)/lib,$(SMLNJ_HOME)/lib,g' {} +
# install extrapathconfig rules to smlnj-runtime package to use as a seed for
# the trigger-generated pathconfig file
	install -m 644 config/extrapathconfig debian/smlnj-runtime$(SMLNJ_HOME)/lib/
	echo bindir ../bin >> debian/smlnj-runtime$(SMLNJ_HOME)/lib/extrapathconfig

# the smlnj-lib HTML documentation loads MathJax from a CDN, but no page uses math
execute_after_dh_installdocs-arch:
	find debian/libsmlnj-smlnj/usr/share/doc -name '*.html' \
	   -exec sed -i '/<!-- support for latexmath -->/,/MathJax.js/d' {} +

override_dh_installchangelogs:
	dh_installchangelogs -psmlnj base/compiler/ChangeLog
	dh_installchangelogs -plibcml-smlnj cml/CHANGES
	dh_installchangelogs -plibexene-smlnj eXene/CHANGES
	dh_installchangelogs -plibsmlnj-smlnj smlnj-lib/CHANGES
	dh_installchangelogs -plibckit-smlnj ckit/HISTORY
	dh_installchangelogs --remaining-packages

# upstream does not build with -g, so there is nothing for a dbgsym package
override_dh_strip:
	dh_strip --no-automatic-dbgsym
