# ================= Fortran libraries            ===========================

GFORTRAN_LIB_DIR = /usr/local/Cellar/gcc/9.2.0/lib/gcc/9
GFORTRAN_LIBS = -lgfortran

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

IO_INCLUDE_DIR = ./InputOutput/include
HESSIAN_INCLUDE_DIR = ./BuildHessian/include
BFACT_INCLUDE_DIR = ./OptimBfactors/include
DELCX_INCLUDE_DIR = ./Delcx/include
TOOLS_INCLUDE_DIR = ./Tools/include
NETWORK_INCLUDE_DIR = ./Network/include

GMP_LIB_DIR =
GMP_LIBS = -lgmp
BLAS_LIBS = -lblas -llapack
THREAD_LIBS = -lpthread

# ================= 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=
NAME=FitNMA
NAMEOBJ=$(OBJ_DIR)/$(NAME).o
NAMEBIN=$(BIN_DIR)/$(NAME)$(EXT)
F_NAMEOBJ=$(F_OBJ_DIR)/lbfgsb.o $(F_OBJ_DIR)/bestfitm.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$(IO_INCLUDE_DIR) -I$(HESSIAN_INCLUDE_DIR) -I$(BFACT_INCLUDE_DIR) -I$(DELCX_INCLUDE_DIR) -I$(TOOLS_INCLUDE_DIR) -I$(NETWORK_INCLUDE_DIR)

LIB_DIRS = -L$(GFORTRAN_LIB_DIR)

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

LOAD_LIB_PATH = -Wl,-rpath,$(GFORTRAN_LIB_DIR)

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)

OBJECTS2 = \
$(NAMEOBJ2) $(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)
