include Makefile.inc

OBJDIR   = $(BUILDDIR)/$(OBJ)/hatlib/$(HC)
TARGDIR  = $(LIBDIR)/$(MACHINE)/hatlib/$(HC)
TARGET   = $(TARGDIR)/libHShat.a
PRECFLAGS = -DVERSION="\"$(HATVERSION)\"" -I$(INCDIR)
HIERDIRS = Data Debug Control Control/Monad System System/IO System/Console \
	   Text Text/ParserCombinators Text/ParserCombinators/Parsec \
	   Text/PrettyPrint Foreign Foreign/Marshal #Foreign/C
HATDIRS  = Hat $(patsubst %, Hat/%, ${HIERDIRS})
OBJDIRS  = $(patsubst %, ${OBJDIR}/%, ${HATDIRS})
TARGDIRS = $(patsubst %, ${TARGDIR}/%, ${HATDIRS})
ifeq "$(findstring ghc, $(HC))" "ghc"
# must give package name whilst building, plus we need the FFI
HFLAGS = -package-name hat -fglasgow-exts \
		$(shell ${LOCAL}fixghc ${GHCSYM} -package lang -package base) \
		-fno-warn-overlapping-patterns -fno-warn-missing-methods \
		-i$(OBJDIR) -I$(INCDIR) $(shell echo ${BUILDOPTS}) \
		'-\#include "hat-c.h"'
CFLAGS = -O -D__GLASGOW_HASKELL__ $(PRECFLAGS)
endif
ifeq "$(findstring nhc98, $(HC))" "nhc98"
HFLAGS = -I$(OBJDIR) -package base +RTS -K12M -H64M -RTS \
		$(shell echo ${BUILDOPTS})
CFLAGS = -O -D__NHC__ $(PRECFLAGS)
# for time profiling of traced programs:
#HFLAGS = -z +RTS -K16M -H64M -RTS
endif
export HFLAGS

# C sources are just compiled normally
CSRCS = hat-c.c
COBJS = $(patsubst %.c, $(OBJDIR)/%.o, $(CSRCS))

# plain Haskell sources are also compiled normally
PLAINSRCS = \
	Hat/Hat.hs Hat/PreludeBuiltinTypes.hs Hat/IOBuiltin.hs \
	Hat/SystemBuiltin.hs Hat/TimeBuiltin.hs Hat/RandomBuiltin.hs \
	Hat/DirectoryBuiltin.hs Hat/Data/IORefBuiltin.hs \
	Hat/Foreign/BuiltinTypes.hs
PLAINOBJS = $(patsubst %.hs, $(OBJDIR)/%.o, $(PLAINSRCS))

# these Haskell sources undergo hat-trans before compilation
TRANSSRCS = \
	PreludeBuiltin.hs PreludeBasic.hs IOBuiltinTypes.hs \
	SystemBuiltinTypes.hs TimeBuiltinTypes.hs DirectoryBuiltinTypes.hs
TRANSHATS = $(patsubst %, Hat/%,                $(TRANSSRCS))
TRANSOBJS = $(patsubst %.hs, $(OBJDIR)/Hat/%.o, $(TRANSSRCS))

# these Haskell sources undergo hat-trans, and the final obj/hx is also renamed
MOVEDSRCS = \
	Prelude.hs Char.hs Ratio.hs List.hs Complex.hs Numeric.hs \
	Maybe.hs Monad.hs Ix.hs Array.hs IO.hs System.hs \
	Locale.hs CPUTime.hs Time.hs Random.hs Directory.hs \
	Data/IORef.hs Data/Bool.hs Data/Char.hs Data/Complex.hs Data/Ix.hs \
	Data/Array.hs Data/Bits.hs Data/Either.hs Data/Maybe.hs \
	Data/FiniteMap.hs Data/List.hs Data/Ratio.hs Data/Set.hs Data/Tuple.hs \
	Control/Monad.hs Control/Monad/Fix.hs Control/Arrow.hs \
	System/CPUTime.hs System/Cmd.hs System/Random.hs System/Directory.hs \
	System/Environment.hs System/Exit.hs System/Locale.hs System/Time.hs \
	System/IO/Unsafe.hs System/IO.hs System/IO/Error.hs \
	System/Console/GetOpt.hs \
	Debug/Trace.hs Text/Show.hs Text/Read.hs \
	Text/PrettyPrint/HughesPJ.hs Text/PrettyPrint.hs \
	Text/ParserCombinators/Parsec/Char.hs \
	Text/ParserCombinators/Parsec/Combinator.hs \
	Text/ParserCombinators/Parsec/Error.hs \
	Text/ParserCombinators/Parsec/Expr.hs \
	Text/ParserCombinators/Parsec/Pos.hs \
	Text/ParserCombinators/Parsec/Prim.hs \
	Text/ParserCombinators/Parsec.hs \
	Foreign/Ptr.hs Foreign/StablePtr.hs Foreign/ForeignPtr.hs \
	Foreign/Storable.hs Foreign/Marshal/Error.hs \
	Text/ParserCombinators/Parsec/Perm.hs
	# Text/ParserCombinators/Parsec/Language.hs \
	# Text/ParserCombinators/Parsec/Token.hs
MOVEDHATS = $(patsubst %, Hat/%,                $(MOVEDSRCS))
MOVEDOBJS = $(patsubst %.hs, $(OBJDIR)/Hat/%.o, $(MOVEDSRCS))


all: install
install: $(OBJDIR) $(OBJDIRS) $(TARGDIR) $(TARGDIRS) $(TARGET)
	mkdir -p $(INCDIR)/hat 2>/dev/null || $(TRUE)
	for dir in $(HIERDIRS); \
		do mkdir -p $(INCDIR)/hat/$$dir 2>/dev/null || $(TRUE); \
		done
	$(INSTALL) *.hx $(INCDIR)/hat
	for dir in $(HIERDIRS); \
		do $(INSTALL) $$dir/*.hx $(INCDIR)/hat/$$dir; \
		done
	$(INSTALL) hat-package.conf $(TARGDIR)
	for dir in $(HATDIRS); \
		do $(INSTALL) $(OBJDIR)/$$dir/*.hi $(TARGDIR)/$$dir; \
		done
clean:
	-rm -rf $(OBJDIR) $(TRANSHATS) $(MOVEDHATS) Hat/*.hi Hat/Hat.hx \
		$(patsubst %.hs, %.hx, $(TRANSSRCS)) \
		$(patsubst %.hs, %.hx, $(MOVEDSRCS))
$(OBJDIR) $(OBJDIRS) $(TARGDIR) $(TARGDIRS):
	mkdir -p $@ || $(TRUE)

$(PLAINOBJS): $(OBJDIR)/%.o: %.hs
	$(HC) $(HFLAGS) -cpp -c -o $@ $<
	mv $(patsubst %.hs, %.hi, $<) $(patsubst %.hs, ${OBJDIR}/%.hi, $<)

$(TRANSOBJS): $(OBJDIR)/Hat/%.o: %.hs
	$(LOCAL)hat-trans -P. -trusted -prelude $<
	$(HC) $(HFLAGS) -cpp -c -o $@ Hat/$<
	mv $(patsubst %.hs, Hat/%.hi, $<) $(patsubst %.hs, ${OBJDIR}/Hat/%.hi, $<)

$(MOVEDOBJS): $(OBJDIR)/Hat/%.o: %.hs
	$(LOCAL)hat-trans -P. -I. -trusted -prelude $<
	$(HC) $(HFLAGS) -cpp -c -o $@ Hat/$<
	mv $(patsubst %.hs, Hat/%.hi, $<) $(patsubst %.hs, ${OBJDIR}/Hat/%.hi, $<) 


$(COBJS): $(OBJDIR)/%.o: %.c
	$(CC) $(CFLAGS) -c -o $@ $<

# single archive for all object files
$(TARGET): $(COBJS) $(PLAINOBJS) $(TRANSOBJS) $(MOVEDOBJS)
	$(AR) cr $(TARGET) $(COBJS) $(PLAINOBJS) $(TRANSOBJS) $(MOVEDOBJS)
	ranlib $(TARGET)


# Here are the extra dependencies.
$(OBJDIR)/Hat/PreludeBuiltinTypes.o: $(OBJDIR)/Hat/Hat.o 
$(OBJDIR)/Hat/PreludeBuiltin.o: $(OBJDIR)/Hat/PreludeBuiltinTypes.o
$(OBJDIR)/Hat/PreludeBasic.o: $(OBJDIR)/Hat/PreludeBuiltin.o
$(OBJDIR)/Hat/Prelude.o: $(OBJDIR)/Hat/PreludeBasic.o
$(OBJDIR)/Hat/Char.o: $(OBJDIR)/Hat/PreludeBasic.o
$(OBJDIR)/Hat/IOBuiltin.o: $(OBJDIR)/Hat/Hat.o $(OBJDIR)/Hat/IOBuiltinTypes.o \
	$(OBJDIR)/Hat/PreludeBuiltinTypes.o $(OBJDIR)/Hat/Prelude.o
$(OBJDIR)/Hat/IOBuiltinTypes.o: $(OBJDIR)/Hat/Ix.o $(OBJDIR)/Hat/Prelude.o
$(OBJDIR)/Hat/Array.o: $(OBJDIR)/Hat/Ix.o $(OBJDIR)/Hat/List.o \
	$(OBJDIR)/Hat/Prelude.o
$(OBJDIR)/Hat/Complex.o: $(OBJDIR)/Hat/Prelude.o
$(OBJDIR)/Hat/IO.o: $(OBJDIR)/Hat/Ix.o $(OBJDIR)/Hat/PreludeBuiltinTypes.o \
	$(OBJDIR)/Hat/IOBuiltinTypes.o $(OBJDIR)/Hat/IOBuiltin.o
$(OBJDIR)/Hat/Ix.o: $(OBJDIR)/Hat/Prelude.o
$(OBJDIR)/Hat/List.o: $(OBJDIR)/Hat/Prelude.o $(OBJDIR)/Hat/Maybe.o
$(OBJDIR)/Hat/Maybe.o: $(OBJDIR)/Hat/Prelude.o
$(OBJDIR)/Hat/Monad.o: $(OBJDIR)/Hat/Prelude.o
$(OBJDIR)/Hat/Numeric.o: $(OBJDIR)/Hat/PreludeBasic.o
$(OBJDIR)/Hat/Ratio.o: $(OBJDIR)/Hat/PreludeBasic.o
$(OBJDIR)/Hat/SystemBuiltinTypes.o: $(OBJDIR)/Hat/Prelude.o
$(OBJDIR)/Hat/SystemBuiltin.o: $(OBJDIR)/Hat/SystemBuiltinTypes.o
$(OBJDIR)/Hat/System.o: $(OBJDIR)/Hat/SystemBuiltin.o
$(OBJDIR)/Hat/TimeBuiltinTypes.o: $(OBJDIR)/Hat/Prelude.o
$(OBJDIR)/Hat/TimeBuiltin.o: $(OBJDIR)/Hat/TimeBuiltinTypes.o \
	$(OBJDIR)/Hat/Locale.o
$(OBJDIR)/Hat/Time.o: $(OBJDIR)/Hat/TimeBuiltin.o
$(OBJDIR)/Hat/RandomBuiltin.o: $(OBJDIR)/Hat/Prelude.o
$(OBJDIR)/Hat/Random.o: $(OBJDIR)/Hat/RandomBuiltin.o
$(OBJDIR)/Hat/DirectoryBuiltinTypes.o: $(OBJDIR)/Hat/Prelude.o
$(OBJDIR)/Hat/DirectoryBuiltin.o: $(OBJDIR)/Hat/DirectoryBuiltinTypes.o
$(OBJDIR)/Hat/Directory.o: $(OBJDIR)/Hat/DirectoryBuiltin.o
$(OBJDIR)/Hat/Data/IORef.o: $(OBJDIR)/Hat/Data/IORefBuiltin.o
$(OBJDIR)/Hat/Control/Monad/Fix.o: $(OBJDIR)/Hat/System/IO.o
$(OBJDIR)/Hat/Control/Arrow.o: $(OBJDIR)/Hat/Control/Monad.o \
	$(OBJDIR)/Hat/Control/Monad/Fix.o
$(OBJDIR)/Hat/System/IO.o: $(OBJDIR)/Hat/System/IO/Unsafe.o
$(OBJDIR)/Hat/Text/PrettyPrint.o: $(OBJDIR)/Hat/Text/PrettyPrint/HughesPJ.o 
$(OBJDIR)/Hat/Text/ParserCombinators/Parsec/Char.o: \
	$(OBJDIR)/Hat/Text/ParserCombinators/Parsec/Pos.o  \
	$(OBJDIR)/Hat/Text/ParserCombinators/Parsec/Prim.o \
	$(OBJDIR)/Hat/Data/Char.o
$(OBJDIR)/Hat/Text/ParserCombinators/Parsec/Combinator.o: \
	$(OBJDIR)/Hat/Text/ParserCombinators/Parsec/Prim.o \
	$(OBJDIR)/Hat/Control/Monad.o
$(OBJDIR)/Hat/Text/ParserCombinators/Parsec/Error.o: \
	$(OBJDIR)/Hat/Text/ParserCombinators/Parsec/Pos.o \
	$(OBJDIR)/Hat/Data/List.o
$(OBJDIR)/Hat/Text/ParserCombinators/Parsec/Expr.o: \
	$(OBJDIR)/Hat/Text/ParserCombinators/Parsec/Prim.o \
	$(OBJDIR)/Hat/Text/ParserCombinators/Parsec/Combinator.o
$(OBJDIR)/Hat/Text/ParserCombinators/Parsec/Language.o: \
	$(OBJDIR)/Hat/Text/ParserCombinators/Parsec/Token.o \
	$(OBJDIR)/Hat/Text/ParserCombinators/Parsec.o
$(OBJDIR)/Hat/Text/ParserCombinators/Parsec/Perm.o: \
	$(OBJDIR)/Hat/Text/ParserCombinators/Parsec.o
$(OBJDIR)/Hat/Text/ParserCombinators/Parsec/Prim.o: \
	$(OBJDIR)/Hat/Text/ParserCombinators/Parsec/Pos.o  \
	$(OBJDIR)/Hat/Text/ParserCombinators/Parsec/Error.o  \
	$(OBJDIR)/Hat/Control/Monad.o
$(OBJDIR)/Hat/Text/ParserCombinators/Parsec/Token.o: \
	$(OBJDIR)/Hat/Text/ParserCombinators/Parsec.o \
	$(OBJDIR)/Hat/Data/Char.o $(OBJDIR)/Hat/Data/List.o
$(OBJDIR)/Hat/Text/ParserCombinators/Parsec.o: \
	$(OBJDIR)/Hat/Text/ParserCombinators/Parsec/Pos.o \
	$(OBJDIR)/Hat/Text/ParserCombinators/Parsec/Error.o \
	$(OBJDIR)/Hat/Text/ParserCombinators/Parsec/Prim.o \
	$(OBJDIR)/Hat/Text/ParserCombinators/Parsec/Combinator.o \
	$(OBJDIR)/Hat/Text/ParserCombinators/Parsec/Char.o



# C-files dependencies.
$(OBJDIR)/hat-c.o: hat-c.c hat-c.h $(INCDIR)/art.h

