include Makefile.inc

ifeq "ghc" "$(findstring ghc, ${HC})"
  ifeq "606" "${GHCSYM}"
HMAKEFLAGS = -I. -I$(INCDIR) -fglasgow-exts -package base -package readline \
		 -DUSE_READLINE=1 $(BUILDOPTS) -prof -auto-all
  else
HMAKEFLAGS = -I. -I$(INCDIR) -fglasgow-exts -package lang -package util \
		 -DUSE_READLINE=1 $(BUILDOPTS) -prof -auto-all
  endif
else
HMAKEFLAGS = -I. -I$(INCDIR) -package base +CTS -H8M -CTS -K10M $(BUILDOPTS)
endif

ifeq "glib" "$(GLIB)"
GLIB_CFLAGS = $(shell glib-config --cflags)
GLIB_LINK   = $(shell glib-config --libs)
else
GLIB_CFLAGS = 
GLIB_LINK   =
endif

OBJDIR	= ${BUILDDIR}/${OBJ}/hattools
DEST	= $(LIBDIR)/$(MACHINE)

COMMONLIBS = pathutils.c artutils.c finitemap.c
OBSERVLIBS = hat-names.c observeutils.c
DETECTLIBS = parentset.c detectutils.c
NOTERMLIBS = nontermutils.c
#MALCLIBS = pathutils.c artutils.c hat-names.c observeutils.c parentset.c newdetect.c
THORLIBS = detect.c hashtable.c

COMMONOBJS = $(patsubst %.c,$(OBJDIR)/%.o,$(COMMONLIBS))
OBSERVOBJS = $(patsubst %.c,$(OBJDIR)/%.o,$(OBSERVLIBS))
DETECTOBJS = $(patsubst %.c,$(OBJDIR)/%.o,$(DETECTLIBS))
NOTERMOBJS = $(patsubst %.c,$(OBJDIR)/%.o,$(NOTERMLIBS))
ALLCOBJS   = $(COMMONOBJS) $(OBSERVOBJS) $(DETECTOBJS) $(NOTERMOBJS)
#MALCOBJS = $(patsubst %.c,$(OBJDIR)/%.o,$(MALCLIBS))
THOROBJS = $(patsubst %.c,$(OBJDIR)/%.o,$(THORLIBS))


PROGNAMES = hat-check hat-stack hat-view hat-trail hat-observe hat-detect \
	hat-anim hat-explore hat-cover black-hat hat-nonterm pretty-hat \
	hat-delta
PROGS     = $(patsubst %, $(DEST)/%, $(PROGNAMES))

all: $(OBJDIR) $(PROGS)
objdir: $(OBJDIR)
clean:
	rm -f $(ALLCOBJS)
	hmake -realclean -hc=$(HC) -d$(OBJDIR) \
		HatObserve HatTrail HatDetect HatStackText HatExplore HatCoverText \
		SrcRefViewer HatAnim BlackHat HatNonTerm PrettyHat
realclean: clean
	rm -f $(PROGS)
$(OBJDIR):
	mkdir -p $(OBJDIR)

VERSIONING = -DVERSION="\"$(HATVERSION)\"" -DFILEVERSION="\"$(HATFILEVERSION)\""


# libraries and tools
$(ALLCOBJS) : $(OBJDIR)/%.o : %.c
	$(CC) $(OPT) -I$(INCDIR) $(VERSIONING) -c $< -o $@ $(GLIB_CFLAGS)
$(OBJDIR)/artutils.o: artutils.h pathutils.h
$(OBJDIR)/observeutils.o: artutils.h observeutils.h finitemap.h checkglib.h
$(OBJDIR)/finitemap.o: finitemap.h checkglib.h
$(OBJDIR)/hat-names.o: artutils.h finitemap.h checkglib.h
$(OBJDIR)/parentset.o: parentset.h
$(OBJDIR)/detectutils.o: artutils.h parentset.h
$(DEST)/hat-stack-c: hat-stack.c artutils.h $(COMMONOBJS)
	$(CC) $(OPT) -I$(INCDIR) hat-stack.c $(COMMONOBJS) -o $(DEST)/hat-stack\
		$(GLIB_LINK)
$(DEST)/hat-trail: HatTrail.hs LowLevel.hs SExp.hs PrettyLibHighlight.hs \
			HighlightStyle.hs Run.hs FFIExtensions.hs Ident.hs \
			CommonUI.hs SrcRef.hs $(COMMONOBJS)
	hmake -hc=$(HC) $(HMAKEFLAGS) HatTrail $(COMMONOBJS) \
		-d$(OBJDIR) $(shell echo $(LIBCOMPAT)) $(GLIB_LINK)
	mv $(OBJDIR)/HatTrail$(EXE) $(DEST)/hat-trail$(EXE)
$(DEST)/hat-stack: HatStackText.hs HatStack.hs LowLevel.hs SExp.hs PrettyLibHighlight.hs \
			HighlightStyle.hs FFIExtensions.hs Ident.hs SrcRef.hs \
			$(COMMONOBJS)
	hmake -hc=$(HC) $(HMAKEFLAGS) HatStackText $(COMMONOBJS) \
		-d$(OBJDIR) $(shell echo $(LIBCOMPAT)) $(GLIB_LINK)
	mv $(OBJDIR)/HatStackText$(EXE) $(DEST)/hat-stack$(EXE)
$(DEST)/hat-cover: HatCover.hs HatCoverText.hs LowLevel.hs FFIExtensions.hs SrcRef.hs \
			HighlightStyle.hs $(COMMONOBJS)
	hmake -hc=$(HC) $(HMAKEFLAGS) HatCoverText $(COMMONOBJS) \
		-d$(OBJDIR) $(shell echo $(LIBCOMPAT)) $(GLIB_LINK)
	mv $(OBJDIR)/HatCoverText$(EXE) $(DEST)/hat-cover$(EXE)

$(DEST)/hat-view: SrcRefViewer.hs HighlightStyle.hs Run.hs
	hmake -hc=$(HC) $(HMAKEFLAGS) SrcRefViewer \
		-d$(OBJDIR) $(shell echo $(LIBCOMPAT))
	mv $(OBJDIR)/SrcRefViewer$(EXE) $(DEST)/hat-view$(EXE)
$(DEST)/hat-observe: HatObserve.hs Observe.hs LowLevel.hs SExp.hs Ident.hs \
			PrettyLibHighlight.hs HighlightStyle.hs Run.hs \
			FFIExtensions.hs Pattern.hs ParseLib.hs Idents.hs \
			CmdLine.hs CommonUI.hs SrcRef.hs \
			$(COMMONOBJS) $(OBSERVOBJS)
	hmake -hc=$(HC) $(HMAKEFLAGS) HatObserve \
		$(COMMONOBJS) $(OBSERVOBJS) -d$(OBJDIR) \
		$(shell echo $(LIBCOMPAT)) $(GLIB_CFLAGS) $(GLIB_LINK)
	mv $(OBJDIR)/HatObserve$(EXE) $(DEST)/hat-observe$(EXE)
$(DEST)/hat-detect: HatDetect.hs Detect.hs LowLevel.hs SExp.hs Ident.hs \
			PrettyLibHighlight.hs HighlightStyle.hs Run.hs \
			FFIExtensions.hs CmdLine.hs CommonUI.hs SrcRef.hs \
			NodeExp.hs EDT.hs \
			$(COMMONOBJS) $(DETECTOBJS)
	hmake -hc=$(HC) $(HMAKEFLAGS) HatDetect \
		$(COMMONOBJS) $(DETECTOBJS) -d$(OBJDIR) \
		$(shell echo $(LIBCOMPAT)) $(GLIB_LINK)
	mv $(OBJDIR)/HatDetect$(EXE) $(DEST)/hat-detect$(EXE)


# Olaf's experimental tool
$(DEST)/hat-explore: HatExplore.hs HighlightStyle.hs Run.hs LowLevel.hs\
			HighlightStyle.hs FFIExtensions.hs Ident.hs SrcRef.hs \
			$(COMMONOBJS) $(DETECTOBJS)
	hmake -hc=$(HC) $(HMAKEFLAGS) HatExplore \
		$(COMMONOBJS) $(DETECTOBJS) -d$(OBJDIR) \
		$(shell echo $(LIBCOMPAT)) $(GLIB_LINK)
	mv $(OBJDIR)/HatExplore$(EXE) $(DEST)/hat-explore$(EXE)


# Colin's tools
$(DEST)/hat-check: hat-check.c
	$(CC) hat-check.c -o $(DEST)/hat-check -I$(INCDIR) $(VERSIONING) \
		$(shell echo $(LIBCOMPAT))


# Thorsten's libraries and tools
$(THOROBJS) : $(OBJDIR)/%.o : %.c
	$(CC) -c -o $@ $<

$(OBJDIR)/hashtable.o: hashtable.h
#$(OBJDIR)/detect.o : detect.h FunTable.h hatinterface.h Expressions.h nodelist.h hashtable.h

# Tom Davie's tools
$(DEST)/hat-anim: HatAnim.hs NodeExp.hs $(COMMONOBJS)
	hmake -hc=$(HC) $(HMAKEFLAGS) HatAnim \
		$(COMMONOBJS) $(DETECTOBJS) -d$(OBJDIR)
		$(shell echo $(LIBCOMPAT))
	mv $(OBJDIR)/HatAnim$(EXE) $(DEST)/hat-anim$(EXE)
$(DEST)/pretty-hat: PrettyHat.hs Pretty.hs NodeExp.hs EDT.hs $(COMMONOBJS)
	hmake -hc=$(HC) $(HMAKEFLAGS) PrettyHat \
		$(COMMONOBJS) $(DETECTOBJS) -d$(OBJDIR) \
		$(shell echo $(LIBCOMPAT))
	mv $(OBJDIR)/PrettyHat$(EXE) $(DEST)/pretty-hat$(EXE)
$(DEST)/hat-delta: HatDelta.hs Detect.hs LowLevel.hs SExp.hs Ident.hs \
			PrettyLibHighlight.hs HighlightStyle.hs Run.hs \
			FFIExtensions.hs CmdLine.hs CommonUI.hs SrcRef.hs \
			NodeExp.hs EDT.hs Slice.hs \
			$(COMMONOBJS) $(DETECTOBJS)
	hmake -hc=$(HC) $(HMAKEFLAGS) HatDelta \
		$(COMMONOBJS) $(DETECTOBJS) -d$(OBJDIR) \
		$(shell echo $(LIBCOMPAT)) $(GLIB_LINK)
	mv $(OBJDIR)/HatDelta$(EXE) $(DEST)/hat-delta$(EXE)

# Mike Dodds tools
$(DEST)/black-hat: BlackHat.hs LowLevel.hs SExp.hs PrettyLibHighlight.hs \
		HighlightStyle.hs Run.hs FFIExtensions.hs NonTermLib.hs \
		$(COMMONOBJS) $(NOTERMOBJS)
	hmake -hc=$(HC) $(HMAKEFLAGS) BlackHat $(COMMONOBJS) $(NOTERMOBJS) \
		-d$(OBJDIR) $(shell echo $(LIBCOMPAT)) $(GLIB_LINK)
	mv $(OBJDIR)/BlackHat$(EXE) $(DEST)/black-hat$(EXE)
$(DEST)/hat-nonterm: HatNonTerm.hs LowLevel.hs SExp.hs PrettyLibHighlight.hs \
		HighlightStyle.hs Run.hs FFIExtensions.hs NonTermLib.hs \
		$(COMMONOBJS) $(NOTERMOBJS)
	hmake -hc=$(HC) $(HMAKEFLAGS) HatNonTerm $(COMMONOBJS) $(NOTERMOBJS) \
		-d$(OBJDIR) $(shell echo $(LIBCOMPAT)) $(GLIB_LINK)
	mv $(OBJDIR)/HatNonTerm$(EXE) $(DEST)/hat-nonterm$(EXE)
