HCFLAGS = -c -O2
LINKFLAGS = -O2 -package array
GHC = ghc -DMAKE
HC = $(GHC)

GHCP = $(GHC) -prof -auto-all -osuf p_o -hisuf p_hi
HCP = $(GHCP)
HI = runhugs

ifeq ($(OSTYPE),cygwin)
 EXT = .exe
else
 EXT = 
endif

.SUFFIXES : .p_o .o .hi .p_hi .hs .lhs

.p_o.p_hi:
	@:

.o.hi:
	@:

.hs.o:
	$(HC) $(HCFLAGS) $<

.lhs.o:
	$(HC) $(HCFLAGS) $<

.hs.p_o:
	$(HCP) $(HCFLAGS) $<

.lhs.p_o:
	$(HCP) $(HCFLAGS) $<

UUSRC = UU_Parsing.hs UU_Parsing_ext.hs UU_Scanner.hs UU_Pretty.hs \
        UU_Pretty_ext.hs OldPretty.hs

COMSRC =  Types.hs State.hs Names.hs Utils.hs \
          Constants.hs Syntax.hs PPrint.hs HParse.hs Expressions.hs \
          SCC.lhs SCC_Base.lhs SCC_nonST_Prune.lhs Sets.hs \
          Laws.hs Substitutions.hs SubExpressions.hs FiniteMaps.hs \
          Matching.hs ReferenceMatching.lhs \
          HtmlBlockTable.lhs Html.lhs GList.hs FailList.hs \
          Calculations.hs Rewrite.hs CabaledVersion.hs

EXESRC = Main.hs

CGISRC = Pretty.lhs CGI.lhs CGIMain.lhs Exception.hs

AGSRC  = AG1.hs AG1_Parser.hs AG1_Print.hs AG1_Sem.hs AGMain.hs \
         UU_Maps.hs

MAGSRC = $(UUSRC) $(COMSRC) $(EXESRC)

CGMSRC = $(UUSRC) $(COMSRC) $(CGISRC)

ALLSRC = $(UUSRC) $(AGSRC) $(COMSRC) $(EXESRC) $(CGISRC) Infer.ag \
          buildfast.sh \
          accummatches.patch fastise.patch onestepflex.patch \
          accumulate.patch quickerapps.patch \
          fastabstracts.patch viable.patch \
          Makefile agdepend

GENHS = Infer.hs FastMatching.lhs Version.hs
GENOBJT = ${GENHS:.hs=.o}
GENOBJ = ${GENOBJT:.lhs=.o}

EXTOBJ = ${GENOBJ}
MAGOBJT = ${MAGSRC:.hs=.o}
MAGOBJ = ${MAGOBJT:.lhs=.o} ${EXTOBJ}
AGOBJ = ${AGSRC:.hs=.o}
UUOBJ = ${UUSRC:.hs=.o}
CGMOBJT = ${CGMSRC:.hs=.o}
CGMOBJ = ${CGMOBJT:.lhs=.o} ${EXTOBJ}

MAGPOBJ = ${MAGOBJ:.o=.p_o}

all: magdcalc$(EXT) cgi$(EXT)

cgi$(EXT): $(CGMOBJ)
	$(HC) -o cgi $(LINKFLAGS) $(CGMOBJ)

ag$(EXT): $(AGOBJ) $(UUOBJ)
	$(HC) -o ag $(LINKFLAGS) $(AGOBJ) $(UUOBJ)

magdcalc$(EXT): $(MAGOBJ)
	$(HC) -o magdcalc $(LINKFLAGS) $(MAGOBJ)

magdcalcp$(EXT): $(MAGPOBJ)
	$(HCP) -o magdcalcp $(LINKFLAGS) $(MAGPOBJ)

UU_Parsing.o: UU_Parsing.hs
	$(HC) $(HCFLAGS) -cpp -DBEGIN_GHC_ONLY='-}' -DEND_GHC_ONLY='{-' -o $@ $<

HParse.o: HParse.hs
	$(HC) $(HCFLAGS) -H10m -o $@ $<

Infer.hs: Infer.ag ag$(EXT)
	echo Infer | ./ag$(EXT)

FastMatching.lhs: ReferenceMatching.lhs buildfast.sh accumulate.patch viable.patch onestepflex.patch quickerapps.patch fastabstracts.patch accummatches.patch fastise.patch
	./buildfast.sh accumulate viable onestepflex fastabstracts quickerapps accummatches

Version.hs: ../Makefile $(ALLSRC)
	cd .. && make src/Version.hs

clean: 
	rm -f *.o *.hi *.p_o *.p_hi core magdcalc magdcalcp ag cgi $(GENHS) *~ *.bak depend

srccopy:
	cp $(ALLSRC) ../mag-$(VERSION)/src/

# agdepend isn't removed in clean because it's required to bootstrap depend
# because of Infer.hs; it'd be slower but rather less messy to generate 
# Infer.hs with hugs

agdepend: $(UUSRC) $(AGSRC)
	$(GHC) -M -dep-makefile -optdepagdepend -dep-suffix -optdepp $(UUSRC) $(AGSRC)

include agdepend

depend: $(COMSRC) $(EXESRC) $(CGISRC) $(GENHS)
	$(GHC) -M -dep-makefile -optdepdepend -dep-suffix -optdepp $(COMSRC) $(EXESRC) $(CGISRC) $(GENHS)

include depend
