include $(RPS_DIR)/Makefile.conf

ROOT = .

LIBDIR = $(ROOT)/lib/$(ARCH)/$(OS)
OBJDIR = $(ROOT)/obj/$(ARCH)/$(OS)
BINDIR = $(ROOT)/bin/$(ARCH)/$(OS)
SRCDIR = $(ROOT)/src
INCDIR = $(ROOT)/include

LIBNAME = timeseries
LIBFILE = $(LIBDIR)/lib$(LIBNAME).a
LIB_TS = $(LIBFILE)


CFLAGS = -I$(INCDIR) $(RECIPES_INCOPTS) $(FRACDIFF_INCOPTS) \
         $(PVM_INCOPTS)

ifeq ($(OPTIMIZE),YES)
   CFLAGS += -O
else
   CFLAGS += -g -gstabs+ -ggdb
endif


LDFLAGS = -L$(TS_LIB_DIR) \
          -l$(LIBNAME) \
          $(RECIPES_LIBOPTS) \
          $(FRACDIFF_LIBOPTS) \
          $(PVM_LIBOPTS) \
          -lm

ifeq ($(OPTIMIZE),YES)
   LDFLAGS += -O
else
   LDFLAGS += -g -gstabs+ -ggdb
endif

#
# These are the execs this make file will build in addition to the lib
#
# ts_example 	   do fit and prediction from command line
# test_generic     different version of example
# evaluate         standalone evaluation program
# crossval_generic older, non-parallel crossvalidation

# crossval_slave   pvm crossvalidation slave
# impulseresp      fit, and then output impulse response of filter
# perftest         performance testing of models
#
# gfnn             global false nearest neighbor from abarbanel method
# mi               average mutual information profile
#

EXECLIST = ts_example 	    \
           test_generic     \
           evaluate         \
           crossval_generic \
           impulseresp      \
           perftest         \
           gfnn             \
           mi

ifeq ($(HAVE_PVM),YES)
   EXECLIST +=  crossval_master crossval_slave
endif


MAINLIST = $(EXECLIST:=.o)

LIB_TS_OBJECTS_LIST = linear.o poly.o ar.o arima.o arfima.o etathetapred.o \
                      tools.o ma.o arma.o bestmean.o it.o evaluate_core.o \
                      crossval_core.o mean.o last.o none.o fit.o

SRCLIST = $(MAINLIST:.o=.cpp) $(LIB_TS_OBJECTS_LIST:.o=.cpp)

EXECS = $(foreach m, $(EXECLIST), $(BINDIR)/$(m))

LIB_TS_OBJECTS = $(foreach m, $(LIB_TS_OBJECTS_LIST), $(OBJDIR)/$(m))

MAINS = $(foreach m, $(MAINLIST),$(OBJDIR)/$(m))

OBJECTS = $(LIB_TS_OBJECTS) $(MAINS)

SRCS = $(foreach m, $(SRCLIST),$(SRCDIR)/$(m))

all: $(LIB_TS) $(EXECS)


$(LIB_TS) : $(LIB_TS_OBJECTS)
	$(AR) ruv $(LIB_TS) $(LIB_TS_OBJECTS)
	$(RANLIB) $(LIB_TS)



define MakeExeAction
	$(CC) $(CFLAGS) $< $(LDFLAGS) -o $(BINDIR)/$(@F)
endef



$(EXECS):$(BINDIR)/%:$(OBJDIR)/%.o $(LIB_TS)
	$(MakeExeAction)



$(OBJDIR)/%.o : $(SRCDIR)/%.cpp
	$(CC) $(CFLAGS) -c $< -o $(OBJDIR)/$(@F)


clean:
	-rm -f $(OBJECTS) $(EXECS) $(LIB_TS)


.dependencies.$(ARCH).$(OS) : $(SRCS)
	$(CC) $(CFLAGS) -MM $(SRCS) | awk '/:/ {printf "%s", "$(OBJDIR)/"} {print}' >  .dependencies.$(ARCH).$(OS)

depend: Makefile $(SRCS)
	$(CC) $(CFLAGS) -MM $(SRCS) | awk '/:/ {printf "%s", "$(OBJDIR)/"} {print}' >  .dependencies.$(ARCH).$(OS)


include .dependencies.$(ARCH).$(OS)

