MHSTARGET=
MHSOUTPUT=
MHS=../bin/gmhs
TMHS=$(MHS) $(MHSTARGET) $(MHSOUTPUT) -i../lib
EVAL=../bin/mhseval +RTS -H1M -RTS
.PHONY: test nfib clean errtest alltest cache info

alltest:	info test errtest testforimp testforexp testforimpexp testapplysp
# interactivetest

cache:
	rm -f .mhscache
	$(TMHS) -CW AllOfLib

info:
	$(TMHS) Info       && $(EVAL)

test:
	$(TMHS) Hello      && $(EVAL) > Hello.out      && diff Hello.ref Hello.out
#	$(TMHS) IOTest     && (echo q | $(EVAL) a bb ccc | sed 's/^[0-9]*ms/1ms/' > IOTest.out) && diff IOTest.ref IOTest.out
	$(TMHS) Serdes     && $(EVAL) > Serdes.out     && diff Serdes.ref Serdes.out
	$(TMHS) StringTest && $(EVAL) > StringTest.out && diff StringTest.ref StringTest.out
	$(TMHS) ListTest   && $(EVAL) > ListTest.out   && diff ListTest.ref ListTest.out
	$(TMHS) Fac        && $(EVAL) > Fac.out        && diff Fac.ref Fac.out
	$(TMHS) Misc       && $(EVAL) > Misc.out       && diff Misc.ref Misc.out
	$(TMHS) Case       && $(EVAL) > Case.out       && diff Case.ref Case.out
	$(TMHS) Arith      && $(EVAL) > Arith.out      && diff Arith.ref Arith.out
	$(TMHS) Arith64    && $(EVAL) > Arith64.out    && diff Arith64.ref Arith64.out
	$(TMHS) Guard      && $(EVAL) > Guard.out      && diff Guard.ref Guard.out
	$(TMHS) Newtype    && $(EVAL) > Newtype.out    && diff Newtype.ref Newtype.out
	$(TMHS) LitMatch   && $(EVAL) > LitMatch.out   && diff LitMatch.ref LitMatch.out
	$(TMHS) Word       && $(EVAL) > Word.out       && diff Word.ref Word.out
	$(TMHS) Integer    && $(EVAL) > Integer.out    && diff Integer.ref Integer.out
	$(TMHS) Enum       && $(EVAL) > Enum.out       && diff Enum.ref Enum.out
	$(TMHS) MutRec     && $(EVAL) > MutRec.out     && diff MutRec.ref MutRec.out
	$(TMHS) LocalPoly  && $(EVAL) > LocalPoly.out  && diff LocalPoly.ref LocalPoly.out
	$(TMHS) Rank2      && $(EVAL) > Rank2.out      && diff Rank2.ref Rank2.out
	$(TMHS) Catch      && $(EVAL) > Catch.out      && diff Catch.ref Catch.out
	$(TMHS) DArith     && $(EVAL) > DArith.out     && diff DArith.ref DArith.out
	$(TMHS) FArith     && $(EVAL) > FArith.out     && diff FArith.ref FArith.out
	$(TMHS) RealFloat  && $(EVAL) > RealFloat.out  && diff RealFloat.ref RealFloat.out
	$(TMHS) Infix      && $(EVAL) > Infix.out      && diff Infix.ref Infix.out
	$(TMHS) Class      && $(EVAL) > Class.out      && diff Class.ref Class.out
	$(TMHS) Eq         && $(EVAL) > Eq.out         && diff Eq.ref Eq.out
	$(TMHS) Floating   && $(EVAL) > Floating.out   && diff Floating.ref Floating.out
	$(TMHS) Default    && $(EVAL) > Default.out    && diff Default.ref Default.out
	$(TMHS) Multi      && $(EVAL) > Multi.out      && diff Multi.ref Multi.out
	$(TMHS) Exists     && $(EVAL) > Exists.out     && diff Exists.ref Exists.out
	$(TMHS) TypeEq     && $(EVAL) > TypeEq.out     && diff TypeEq.ref TypeEq.out
	$(TMHS) Sieve      && $(EVAL) > Sieve.out      && diff Sieve.ref Sieve.out
	$(TMHS) Dict       && $(EVAL) > Dict.out       && diff Dict.ref Dict.out
	$(TMHS) Symbol     && $(EVAL) > Symbol.out     && diff Symbol.ref Symbol.out
	$(TMHS) FunDep     && $(EVAL) > FunDep.out     && diff FunDep.ref FunDep.out
	$(TMHS) TypeLits   && $(EVAL) > TypeLits.out   && diff TypeLits.ref TypeLits.out
	$(TMHS) View       && $(EVAL) > View.out       && diff View.ref View.out
	$(TMHS) IOArray    && $(EVAL) > IOArray.out    && diff IOArray.ref IOArray.out
	$(TMHS) ST         && $(EVAL) > ST.out         && diff ST.ref ST.out
	$(TMHS) HigherKind && $(EVAL) > HigherKind.out && diff HigherKind.ref HigherKind.out
	$(TMHS) PolyKind   && $(EVAL) > PolyKind.out   && diff PolyKind.ref PolyKind.out
	$(TMHS) Record     && $(EVAL) > Record.out     && diff Record.ref Record.out
	$(TMHS) Deriving   && $(EVAL) > Deriving.out   && diff Deriving.ref Deriving.out
	$(TMHS) Unicode    && $(EVAL) > Unicode.out    && diff Unicode.ref Unicode.out
	$(TMHS) BindPat    && $(EVAL) > BindPat.out    && diff BindPat.ref BindPat.out
	$(TMHS) Read       && $(EVAL) > Read.out       && diff Read.ref Read.out
	$(TMHS) ListCompr  && $(EVAL) > ListCompr.out  && diff ListCompr.ref ListCompr.out
	$(TMHS) ParseInd   && $(EVAL) > ParseInd.out   && diff ParseInd.ref ParseInd.out
	$(TMHS) Infer      && $(EVAL) > Infer.out      && diff Infer.ref Infer.out
	$(TMHS) Enum       && $(EVAL) > Enum.out       && diff Enum.ref Enum.out
	$(TMHS) RecMdl     && $(EVAL) > RecMdl.out     && diff RecMdl.ref RecMdl.out
	$(TMHS) ForeignPtr && $(EVAL) > ForeignPtr.out && diff ForeignPtr.ref ForeignPtr.out
	$(TMHS) Array      && $(EVAL) > Array.out      && diff Array.ref Array.out
	$(TMHS) Eq1        && $(EVAL) > Eq1.out        && diff Eq1.ref Eq1.out
	$(TMHS) Irref      && $(EVAL) > Irref.out      && diff Irref.ref Irref.out
	$(TMHS) DfltSig    && $(EVAL) > DfltSig.out    && diff DfltSig.ref DfltSig.out
	$(TMHS) Bytestring && $(EVAL) > Bytestring.out && diff Bytestring.ref Bytestring.out
	$(TMHS) Text       && $(EVAL) > Text.out       && diff Text.ref Text.out
	$(TMHS) ByteStringLow && $(EVAL) > ByteStringLow.out && diff ByteStringLow.ref ByteStringLow.out
	$(TMHS) ImpMet     && $(EVAL) > ImpMet.out     && diff ImpMet.ref ImpMet.out
	$(TMHS) MultiIf    && $(EVAL) > MultiIf.out    && diff MultiIf.ref MultiIf.out
	$(TMHS) LameCase   && $(EVAL) > LameCase.out   && diff LameCase.ref LameCase.out
	$(TMHS) NoForall   && $(EVAL) > NoForall.out   && diff NoForall.ref NoForall.out
	$(TMHS) Bang       && $(EVAL) > Bang.out       && diff Bang.ref Bang.out
	$(TMHS) MString    && $(EVAL) > MString.out    && diff MString.ref MString.out
	$(TMHS) OrPat      && $(EVAL) > OrPat.out      && diff OrPat.ref OrPat.out
	$(TMHS) PartRed    && $(EVAL) > PartRed.out    && diff PartRed.ref PartRed.out
	$(TMHS) PatSyn     && $(EVAL) > PatSyn.out     && diff PatSyn.ref PatSyn.out
	$(TMHS) Coerce     && $(EVAL) > Coerce.out     && diff Coerce.ref Coerce.out
	$(TMHS) PatBind    && $(EVAL) > PatBind.out    && diff PatBind.ref PatBind.out
	$(TMHS) NumUnder   && $(EVAL) > NumUnder.out   && diff NumUnder.ref NumUnder.out
	$(TMHS) LocalFix   && $(EVAL) > LocalFix.out   && diff LocalFix.ref LocalFix.out
	$(TMHS) TypeApp    && $(EVAL) > TypeApp.out    && diff TypeApp.ref TypeApp.out
	$(TMHS) Do         && $(EVAL) > Do.out         && diff Do.ref Do.out
	$(TMHS) Via        && $(EVAL) > Via.out        && diff Via.ref Via.out
	$(TMHS) ByteStringIO && $(EVAL) > ByteStringIO.out && diff ByteStringIO.ref ByteStringIO.out
	$(TMHS) BitCount   && $(EVAL) > BitCount.out   && diff BitCount.ref BitCount.out
	$(TMHS) Bounded    && $(EVAL) > Bounded.out    && diff Bounded.ref Bounded.out
	$(TMHS) Typeable   && $(EVAL) > Typeable.out   && diff Typeable.ref Typeable.out
	$(TMHS) Storable   && $(EVAL) > Storable.out   && diff Storable.ref Storable.out
	$(TMHS) StandDer   && $(EVAL) > StandDer.out   && diff StandDer.ref StandDer.out
	MHSCPPHS=../bin/cpphs \
	$(TMHS) Cpp        && $(EVAL) > Cpp.out        && diff Cpp.ref Cpp.out
	$(TMHS) Lit        && $(EVAL) > Lit.out        && diff Lit.ref Lit.out
	$(TMHS) TypeOp     && $(EVAL) > TypeOp.out     && diff TypeOp.ref TypeOp.out
	$(TMHS) Forall     && $(EVAL) > Forall.out     && diff Forall.ref Forall.out
	$(TMHS) Block      && $(EVAL) > Block.out      && diff Block.ref Block.out
	$(TMHS) Fork       && $(EVAL) > Fork.out       && diff Fork.ref Fork.out
	$(TMHS) Concur     && $(EVAL) > Concur.out     && diff Concur.ref Concur.out
	$(TMHS) MVar       && $(EVAL) > MVar.out       && diff MVar.ref MVar.out
	$(TMHS) Delay      && $(EVAL) > Delay.out      && diff Delay.ref Delay.out
	$(TMHS) ThrSt      && $(EVAL) > ThrSt.out      && diff ThrSt.ref ThrSt.out
	$(TMHS) Throw      && $(EVAL) > Throw.out      && diff Throw.ref Throw.out
	$(TMHS) RtsExn     && $(EVAL) > RtsExn.out     && diff RtsExn.ref RtsExn.out
	$(TMHS) Mask       && $(EVAL) > Mask.out       && diff Mask.ref Mask.out
	$(TMHS) EmptyData  && $(EVAL) > EmptyData.out  && diff EmptyData.ref EmptyData.out
	$(TMHS) QualDo     && $(EVAL) > QualDo.out     && diff QualDo.ref QualDo.out
	$(TMHS) Weak       && $(EVAL) > Weak.out       && diff Weak.ref Weak.out
	$(TMHS) Fix        && $(EVAL) > Fix.out        && diff Fix.ref Fix.out
	$(TMHS) Pat        && $(EVAL) > Pat.out        && diff Pat.ref Pat.out
	$(TMHS) Logarithms && $(EVAL) > Logarithms.out && diff Logarithms.ref Logarithms.out
	$(TMHS) Builder    && $(EVAL) > Builder.out    && diff Builder.ref Builder.out

testforimp:
	MHSDIR=.. $(TMHS) ForeignC -of.exe && ./f.exe > ForeignC.out && diff ForeignC.ref ForeignC.out

testforimpjs:
	MHSDIR=.. $(TMHS) -temscripten ForImpJS -of.js && node f.js > ForImpJS.out && diff ForImpJS.ref ForImpJS.out

testforexp:
	MHSDIR=.. $(TMHS) -c -optc --shared -optc -fPIC ForExp -oForExpHs.so && $(CC) -lm ForExp.c ForExpHs.so -Wl,-rpath,'$$ORIGIN' -o ForExp.exe && ./ForExp.exe > ForExp.out && diff ForExp.ref ForExp.out

testforimpexp:
	MHSDIR=.. $(TMHS) -optc -I. Callback hsimp.c -oCallback.exe && ./Callback.exe > Callback.out && diff Callback.ref Callback.out

testapplysp:
	MHSDIR=.. $(TMHS) -optc -I. ApplySP hsasp.c -oApplySP.exe && ./ApplySP.exe > ApplySP.out && diff ApplySP.ref ApplySP.out

errtest:
	sh errtester.sh $(MHS) < errmsg.test

interactivetest:
	$(TMHS) < itest.in | sed -e '1,/^>/d' > itest.out && diff itest.ref itest.out

nfib:
	$(TMHS) Nfib && $(EVAL)

clean:
	rm -f *.out *.tmp *.js *.exe *.so a.out *_stub.h
