# ================= Libraries and Includes ====================================

MESH_INCLUDE_DIR = ./mesh/include
MESHDIST_INCLUDE_DIR = ./MeshDist/include
OT_INCLUDE_DIR = ./OT1/include
OTM_INCLUDE_DIR = ./OT1M/include
ALIGN_INCLUDE_DIR = ./Align/include
DESC_INCLUDE_DIR = ./Descriptors/include
DESC2_INCLUDE_DIR = ./Spectral/include
OPTIM_INCLUDE_DIR = ./Optim/include
RENDER_INCLUDE_DIR = ./dependencies/renderpatch/include
SIFT_INCLUDE_DIR = ./dependencies/sift/include
GEO_INCLUDE_DIR = ./dependencies/geodesic

BLAS_LIBS = -lblas -llapack
THREAD_LIBS = -lpthread
GFORTRAN_LIBS = -lgfortran

BLAS_LIB_DIR = /usr/local/gfortran/lib/

# ================= Project Directories ====================================

INC_DIR = ./project/include
SRC_DIR = ./project/src
OBJ_DIR = ./project/src
BIN_DIR = ./bin
F_SRC_DIR = ./dependencies/Fortran
F_OBJ_DIR = ./dependencies/Fortran

# ================= Project Name ===========================================

EXT=.cpu
NAME=Comp3DShapes
NAMEOBJ=$(OBJ_DIR)/$(NAME).o
NAMEBIN=$(BIN_DIR)/$(NAME)$(EXT)
F_NAMEOBJ=$(F_OBJ_DIR)/lbfgsb.o

# ================= Compilers and Flags ====================================

CC 		:= gcc
CFLAGS 		:= -c -O3 -ansi -Wall -Werror -pedantic 
CPP 		:= g++
CPPFLAGS 	:= -c -std=c++11 -O3 -Wdeprecated-declarations -Wuninitialized -ansi -Wall -std=c++0x
FC 		:= gfortran
FFLAGS 		:= -c -O3 -fcray-pointer

INCLUDE_DIRS = -I$(INC_DIR) -I$(OT_INCLUDE_DIR) -I$(OTM_INCLUDE_DIR) -I$(DESC_INCLUDE_DIR)\
		-I$(DESC2_INCLUDE_DIR) -I$(ALIGN_INCLUDE_DIR) -I$(MESH_INCLUDE_DIR)  \
		-I$(OPTIM_INCLUDE_DIR) -I$(RENDER_INCLUDE_DIR) -I$(SIFT_INCLUDE_DIR) \
		-I$(MESHDIST_INCLUDE_DIR) -I$(GEO_INCLUDE_DIR)

LIB_DIRS = -L$(BLAS_LIB_DIR)

LIBS = $(BLAS_LIBS) $(THREAD_LIBS) $(GFORTRAN_LIBS) -lstdc++

LOAD_LIB_PATH = 

LD_FLAGS = -O3

# ================= Pattern rules ==========================================

$(OBJ_DIR)/%.o: $(SRC_DIR)/%.cpp
	$(CPP) $(CPPFLAGS) $(INCLUDE_DIRS) $< -o $@

$(OBJ_DIR)/%.o: $(SRC_DIR)/%.c
	$(CC) $(CFLAGS) $(INCLUDE_DIRS) $< -o $@

$(F_OBJ_DIR)/%.o: $(F_SRC_DIR)/%.f
	$(FC) $(FFLAGS) $< -o $@

# ================= Compile source code ====================================

OBJECTS = \
$(NAMEOBJ) $(F_NAMEOBJ)

# ================= Generate Executable ====================================

$(NAMEBIN) : $(OBJECTS)
	$(CPP) -o $(NAMEBIN) $(LD_FLAGS) $(OBJECTS) $(LIB_DIRS) $(LIBS) $(LOAD_LIB_PATH)

all: $(OBJECTS)
	$(CPP) -o $(NAMEBIN) $(LD_FLAGS) $(OBJECTS) $(LIB_DIRS) $(LIBS) $(LOAD_LIB_PATH)

clean:
	touch $(OBJ_DIR)/junk.o; rm -f $(OBJ_DIR)/*.o $(F_OBJ_DIR)/*.o $(NAMEBIN)
