###############################################################################
# GOMI MAKEFILE
# Copyright (c) 2001 Joe Leslie-Hurd, distributed under the MIT license
###############################################################################

###############################################################################
# The default action.
###############################################################################

.PHONY: default
default: mosml

###############################################################################
# Cleaning temporary files.
###############################################################################

TEMP = \
  $(MOSML_TARGETS) \
  bin/mosml/*.sml bin/mosml/*.ui bin/mosml/*.uo bin/mosml/a.out \
  $(MLTON_TARGETS) \
  bin/mlton/*.sml bin/mlton/*.mlb \
  $(POLYML_TARGETS) \
  bin/polyml/*.sml bin/polyml/*.o

.PHONY: clean
clean:
	@echo
	@echo '********************'
	@echo '* Clean everything *'
	@echo '********************'
	@echo
	rm -f $(TEMP)
	$(MAKE) -C test $@

###############################################################################
# Source files.
###############################################################################

SRC = \
  src/Useful.sig src/Useful.sml \
  src/Lazy.sig src/Lazy.sml \
  src/Ordered.sig src/Ordered.sml \
  src/Map.sig src/Map.sml \
  src/KeyMap.sig src/KeyMap.sml \
  src/Set.sig src/Set.sml \
  src/ElementSet.sig src/ElementSet.sml \
  src/Stream.sig src/Stream.sml \
  src/Print.sig src/Print.sml \
  src/Parse.sig src/Parse.sml \
  src/Probability.sig src/Probability.sml \
  src/Side.sig src/Side.sml \
  src/Sgf.sig src/Sgf.sml \
  src/Komi.sig src/Komi.sml \
  src/Rules.sig src/Rules.sml \
  src/Point.sig src/Point.sml \
  src/Dimensions.sig src/Dimensions.sml \
  src/Symmetry.sig src/Symmetry.sml \
  src/Status.sig src/Status.sml \
  src/Board.sig src/Board.sml \
  src/Move.sig src/Move.sml \
  src/GoSgf.sig src/GoSgf.sml \
  src/Score.sig src/Score.sml \
  src/Pattern.sig src/Pattern.sml \
  src/Formula.sig src/Formula.sml \
  src/Position.sig src/Position.sml \
  src/Database.sig src/Database.sml \
  src/IStack.sig src/IStack.sml \
  src/IIntSet.sig src/IIntSet.sml \
  src/IIntDist.sig src/IIntDist.sml \
  src/IPoint.sig src/IPoint.sml \
  src/IMove.sig src/IMove.sml \
  src/IBoard.sig src/IBoard.sml \
  src/IPattern.sig src/IPattern.sml \
  src/IInference.sig src/IInference.sml \
  src/IConfiguration.sig src/IConfiguration.sml \
  src/ISample.sig src/ISample.sml \
  src/Engine.sig src/Engine.sml \
  src/GTP.sig src/GTP.sml \
  src/Options.sig src/Options.sml

EXTRA_SRC =

###############################################################################
# The ML preprocessor.
###############################################################################

MLPP = scripts/mlpp

MLPP_OPTS =

###############################################################################
# The Moscow ML compiler.
###############################################################################

MOSMLC = mosmlc -toplevel -q

MOSML_SRC = \
  src/Portable.sig src/PortableMosml.sml \
  $(SRC)

MOSML_TARGETS = \
  bin/mosml/gomi \
  bin/mosml/benchmark

include bin/mosml/Makefile.src

.PHONY: mosml-info
mosml-info:
	@echo
	@echo '*****************************************'
	@echo '* Build and test the Moscow ML programs *'
	@echo '*****************************************'
	@echo

.PHONY: mosml-obj
mosml-obj: $(MOSML_OBJ)

.PHONY: mosml-targets
mosml-targets: $(MOSML_TARGETS)

.PHONY: mosml-test
mosml-test:
	$(MAKE) -C test mosml

.PHONY: mosml
mosml: mosml-info mosml-obj mosml-targets mosml-test

###############################################################################
# The MLton compiler.
###############################################################################

GOMI = bin/mlton/gomi

MLTON = mlton

MLTON_OPTS = -runtime 'ram-slop 0.4'

MLTON_SRC = \
  src/Portable.sig src/PortableMlton.sml \
  $(SRC)

MLTON_TARGETS = \
  bin/mlton/selftest \
  $(GOMI)

bin/mlton/%.sml: $(MLTON_SRC) src/%.sml
	@$(MLPP) $(MLPP_OPTS) -c mlton $^ > $@

bin/mlton/%.mlb: bin/mlton/%.sml
	echo '$$(SML_LIB)/basis/basis.mlb $$(SML_LIB)/basis/mlton.mlb $(notdir $<)' > $@

bin/mlton/%: bin/mlton/%.mlb
	@echo
	@echo '***************************'
	@echo '* Compile a MLton program *'
	@echo '***************************'
	@echo
	@echo $@
	cd bin/mlton ; $(MLTON) $(MLTON_OPTS) $(notdir $<)
	@echo

.PHONY: mlton-info
mlton-info:
	@echo
	@echo '*************************************'
	@echo '* Build and test the MLton programs *'
	@echo '*************************************'
	@echo

.PHONY: mlton-targets
mlton-targets: $(MLTON_TARGETS)

.PHONY: mlton-test
mlton-test:
	$(MAKE) -C test mlton

.PHONY: mlton
mlton: mlton-info mlton-targets mlton-test

###############################################################################
# Building using Poly/ML.
###############################################################################

POLYML = poly

POLYML_OPTS =

ifeq ($(shell uname), Darwin)
  POLYML_LINK_OPTS = -lpolymain -lpolyml -segprot POLY rwx rwx
else
  POLYML_LINK_OPTS = -lpolymain -lpolyml
endif

POLYML_SRC = \
  src/Random.sig src/Random.sml \
  src/Portable.sig src/PortablePolyml.sml \
  $(SRC)

POLYML_TARGETS = \
  bin/polyml/selftest \
  bin/polyml/gomi

bin/polyml/%.sml: src/%.sml $(POLYML_SRC)
	@$(MLPP) $(MLPP_OPTS) -c polyml $(POLYML_SRC) > $@
	@echo 'fun main () = let' >> $@
	@$(MLPP) $(MLPP_OPTS) -c polyml $< >> $@
	@echo "in () end handle e => (TextIO.output (TextIO.stdErr, \"FATAL EXCEPTION:\\\\n\"^ exnMessage e); OS.Process.exit OS.Process.failure); PolyML.export(\"$(basename $(notdir $<))\", main);" >> $@

bin/polyml/%.o: bin/polyml/%.sml
	cd bin/polyml ; echo "use \"$(notdir $<)\";" | $(POLYML) $(POLYML_OPTS)

bin/polyml/%: bin/polyml/%.o
	@echo
	@echo '*****************************'
	@echo '* Compile a Poly/ML program *'
	@echo '*****************************'
	@echo
	@echo $@
	cd bin/polyml && $(CC) -o $(notdir $@) $(notdir $<) $(POLYML_LINK_OPTS)
	@echo

.PHONY: polyml-info
polyml-info:
	@echo
	@echo '***************************************'
	@echo '* Build and test the Poly/ML programs *'
	@echo '***************************************'
	@echo

.PHONY: polyml
polyml: polyml-info $(POLYML_TARGETS)
	$(MAKE) -C test polyml

###############################################################################
# Development.
##############################################################################

include Makefile.dev

Makefile.dev:
	echo > $@
