#############################################################################
# user defined variables

USE_MATLAB = 0

#define where to find the newmat, netcdf and matlab libraries and headers
#NEWMAT_LIB_DIR = /usr/local/newmat
#NEWMAT_INC_DIR = /usr/local/newmat
#NEWMAT_LIB_DIR = /usr/lib
#NEWMAT_INC_DIR = /usr/include/newmat
NEWMAT_LIB_DIR = ./newmat
NEWMAT_INC_DIR = ./newmat
NETCDF_LIB_DIR = /usr/lib
NETCDF_INC_DIR = /usr/include


ifeq ($(USE_MATLAB),1)
 #MATLAB_LIB_DIR = /pathToMatlab/matlab/2009b/bin/glnxa64
 #MATLAB_INC_DIR = /pathToMatlab/matlab/2009b/extern/include
 #MATLAB_LD_DIR = /pathToMatlab/matlab/2009b/bin/glnxa64:/pathToMatlab/matlab/2009b/sys/os/glnxa64

 MATLAB_LIB_DIR = /usr/local/MATLAB/R2012a/bin/glnxa64
 MATLAB_INC_DIR = /usr/local/MATLAB/R2012a/extern/include
 MATLAB_LD_DIR = /usr/local/MATLAB/R2012a/bin/glnxa64:/usr/local/MATLAB/R2012a/sys/os/glnxa64
endif

#define compilation variables
OUTPUT_DIR = linux
CXX = g++
ifeq ($(USE_MATLAB),1)
	CFLAGS = -Wall -pg -DUSE_MATLAB
else
	CFLAGS = -Wall -pg -Wno-deprecated -Wsign-compare -O2
endif

ifeq ($(USE_MATLAB),1)
 LIBS = -lnewmat -lm -lnetcdf -lrt -lglut -lGLU -leng -lmat -lmx -lGL -lpthread $(pkg-config --libs pcl_common-1.7 pcl_io-1.7 pcl_octree-1.7 pcl_surface-1.7 pcl_kdtree-1.7)
 INC_PATHS = -I$(NEWMAT_INC_DIR) -I$(NETCDF_INC_DIR) -I$(MATLAB_INC_DIR) $(pkg-config --cflags pcl_common-1.7 pcl_io-1.7 pcl_octree-1.7 pcl_surface-1.7 pcl_kdtree-1.7)
 LIB_PATHS = -L$(NEWMAT_LIB_DIR) -L$(NETCDF_LIB_DIR) -L$(MATLAB_LIB_DIR)
 LD_FLAGS = -Wl,-rpath -Wl,$(MATLAB_LIB_DIR) -Wl,-rpath -Wl,$(MATLAB_LD_DIR)
else
 LIBS = -lnewmat -lm -lnetcdf -lrt -lpthread 
# LIBS += -lhdf5_hl -lhdf5 # for David's computer only
 #LIBS += -lglut -lGLU -lGL  # for plotting functionality only
 INC_PATHS = -I$(NEWMAT_INC_DIR) #-I$(NETCDF_INC_DIR) 
 LIB_PATHS = -L$(NEWMAT_LIB_DIR) #-L$(NETCDF_LIB_DIR)
 LD_FLAGS = -pg
endif

SOURCES = TerrainNav.cpp TNavFilter.cpp TNavPointMassFilter.cpp \
	TNavParticleFilter.cpp TerrainMapOctree.cpp TerrainNavClient.cpp \
	mapio.cpp structDefs.cpp myOutput.cpp matrixArrayCalcs.cpp \
	TerrainMapDEM.cpp OctreeSupport.cpp Octree.cpp OctreeNode.cpp\
#	ParticlePlot.cpp GlutWindow.cpp GlutWindow2d.cpp ColorHelper.cpp \
# TODO: remove plotting stuff?


PROGRAM = main

SERVER = trn_server

OBJECTS = $(SOURCES:%.cpp=$(OUTPUT_DIR)/%.o)
DEPEND = $(SOURCES:%.cpp=$(OUTPUT_DIR)/%.d)

LIB_OBJECTS = $(OUTPUT_DIR)/TerrainNav.o \
	$(OUTPUT_DIR)/TNavFilter.o \
	$(OUTPUT_DIR)/TNavPointMassFilter.o \
	$(OUTPUT_DIR)/TNavParticleFilter.o \
	$(OUTPUT_DIR)/TerrainMapOctree.o \
	$(OUTPUT_DIR)/OctreeSupport.o \
	$(OUTPUT_DIR)/TerrainMapDEM.o \
	$(OUTPUT_DIR)/mapio.o \
	$(OUTPUT_DIR)/structDefs.o \
	$(OUTPUT_DIR)/myOutput.o \
	$(OUTPUT_DIR)/matrixArrayCalcs.o \
	$(OUTPUT_DIR)/TerrainNavClient.o \

NAV_LIBRARY = $(OUTPUT_DIR)/libterrainNav.a


#############################################################################
# build commands
all: $(NAV_LIBRARY) $(OUTPUT_DIR)/$(PROGRAM) $(OUTPUT_DIR)/$(SERVER)

#builds library object
$(NAV_LIBRARY):	$(LIB_OBJECTS)
	ar -r $(NAV_LIBRARY) $(LIB_OBJECTS)

#builds source files into an executable named $(PROGRAM)
$(OUTPUT_DIR)/$(PROGRAM): $(OBJECTS) mainMbari.cpp
	@echo building $@...
	$(CXX) $(INC_PATHS) $(LIB_PATHS) $^ -o $@ $(LIBS) $(LD_FLAGS)
	@echo

#builds source files into an executable named $(SERVER)
$(OUTPUT_DIR)/$(SERVER): $(OBJECTS) trn_server.cpp
	@echo building $@...
	$(CXX) $(INC_PATHS) $(LIB_PATHS) $^ -o $@ $(LIBS) $(LD_FLAGS)
	@echo

$(OUTPUT_DIR)/testStructDefs: $(OBJECTS) testStructDefs.cpp
	@echo building $@...
	$(CXX) $(INC_PATHS) $(LIB_PATHS) $^ -o $@ $(LIBS) $(LD_FLAGS)
	@echo

#generic command to build object files from source files
$(OUTPUT_DIR)/%.o :%.cpp
	@echo compiling $<...
	$(CXX) $(CFLAGS) $(INC_PATHS) -c $< -o $@
	@echo

#generic command to build dependency files from source files
$(OUTPUT_DIR)/%.d :%.cpp
	@[ -d $(OUTPUT_DIR) ] || mkdir -p $(OUTPUT_DIR)
	@echo generating dependency file for $<
	@set -e; $(CXX) -MM $(CFLAGS) $(INC_PATHS) $< \
	| awk '/o:/ {printf "%s", "$@ $(OUTPUT_DIR)/"} {print}' > $@; \
	[ -s $@ ] || rm -f $@
	@echo

###########################################################################
# clean-up commands

#clean will only delete the object and dependency files
.PHONY: clean
clean:
	rm -f $(OBJECTS) $(DEPEND)

#purge will delete the program file, object files, dependency files, and
#output directory
.PHONY: purge
purge:
	rm -f $(PROG) $(OBJECTS) $(DEPEND)
	rm -rf $(OUTPUT_DIR)

#include the dependencies
ifneq ($(MAKECMDGOALS),purge)
ifneq ($(MAKECMDGOALS),clean)
-include $(DEPEND)
endif
endif
