ENQUOTE=${ENQUOTE}
MOSMLBIN=${MOSMLHOME}/bin


# Find all the script files
SCRIPTS     := $(wildcard *Script.sml)

# Compute the name of the Theoryfiles
THEORIESSML := $(SCRIPTS:%Script.sml=%Theory.sml)
THEORIESSIG := $(THEORIESSML:.sml=.sig)
TOBJS       = $(THEORIESSML:.sml=.uo)

# Find all the .sml and .sig files
LSSML       := $(wildcard *.sml) 
LSSIG       := $(wildcard *.sig)

# Leave out the theoryfiles
SMLSRC      := $(filter-out $(THEORIESSML),$(LSSML))
SIGSRC      := $(filter-out $(THEORIESSIG),$(LSSIG))
OBJS        := $(SMLSRC:.sml=.uo)

# Check if the user has a INCLUDE.mk file
INCLUDEFILE:=$(shell if [ -f ./INCLUDE.mk ]; then echo ./INCLUDE.mk; fi)

DEFINCLUDE:=$(HOLDIR)/tools/INCLUDE.mk
include $(INCLUDEFILE) $(DEFINCLUDE)

# INCLUDE is "" if the user hasn't specified it in her INCLUDE.mk 
INCLUDEPATH:=$(INCLUDE) $(DEFAULTINCLUDE) 

MOSMLTOOLS:=${MOSMLBIN}/camlrunm $(MOSMLHOME)/tools
LOCALTOOLS:=${MOSMLBIN}/camlrunm $(HOLDIR)/tools
MOSMLFLAGS:=$(INCLUDEPATH) -q
#MOSMLC:=${MOSMLBIN}/mosmlc -c $(MOSMLFLAGS)
#MOSMLC:=${HOLDIR}/bin/mosmlc.enquote -c $(MOSMLFLAGS)
MOSMLC:=${HOLDIR}/bin/mosmlc${ENQUOTE} -c $(MOSMLFLAGS)
MOSMLL:=${MOSMLBIN}/mosmlc $(MOSMLFLAGS)
CAMLRUNM:=${MOSMLBIN}/camlrunm 
MOSMLLEX:=${MOSMLBIN}/mosmllex
MOSMLYACC:=${MOSMLBIN}/mosmlyac

all: $(TOBJS) $(OBJS) 

STATICDEP:=$(SMLSRC:%.sml=.HOLMK/%.d) $(SIGSRC:%.sig=.HOLMK/%.sd)
DYNAMICDEP:=$(THEORIESSML:%.sml=.HOLMK/%.d) $(THEORIESSIG:%.sig=.HOLMK/%.sd)

.HOLMK/static: $(STATICDEP)
	@echo $(^:%=-f %) > $@

.HOLMK/dynamic: $(DYNAMICDEP)
	@echo $(STATICDEP:%=-f %) $(^:%=-f %) > $@

.PRECIOUS: .HOLMK/%.d .HOLMK/%.sd .HOLMK/%Theory.mk %Theory.sml %Theory.uo \
	   %Theory.ui %Theory.sig %.ui %.uo 

.HOLMK/%.d: %.sml .HOLMK
	@echo 'Finding dependencies for $<'
	@$(LOCALTOOLS)/holdep $(INCLUDEPATH) $< > $@

.HOLMK/%.sd: %.sig .HOLMK
	@echo 'Finding dependencies for $<'
	@$(LOCALTOOLS)/holdep $(INCLUDEPATH) $< > $@

%Theory.sml %Theory.sig: %Script
	@echo 'Generating $@'
	@$(CAMLRUNM) $<


# Sometimes we'll have to compile a Theory file without having all the
# dependencies, so we make sure that the .sig file has been compiled
# first.
$(TOBJS): %.uo:  %.sml %.ui
	@echo 'Compiling $<'
	@$(MOSMLC) $<

%Script: %Script.uo
	@echo 'Linking $@'
	@$(MOSMLL) -o $@ -noheader $< 

%.ui: %.sig
	@echo 'Compiling $<'
	@$(MOSMLC) $<

%.uo: %.sml
	@echo 'Compiling $<'
	@$(MOSMLC) $<

.HOLMK:
	mkdir $@
