SYSTEM = x86-64_linux
LIBFORMAT = static_pic

# CPLEX directories
CPLEXVERSION = CPLEX_Studio201
CPLEXDIR      = /path/to/cplex/$(CPLEXVERSION)/cplex
CONCERTDIR    = /path/to/cplex/$(CPLEXVERSION)/concert

CCC = g++ -O3 -Wall #-DNDEBUG
CCOPT = -std=c++17 -march=native -w -fPIC -fno-strict-aliasing -fexceptions -DIL_STD

# CPLEX library directories
CPLEXBINDIR   = $(CPLEXDIR)/bin/$(BINDIST)
CPLEXLIBDIR   = $(CPLEXDIR)/lib/$(SYSTEM)/$(LIBFORMAT)
CONCERTLIBDIR = $(CONCERTDIR)/lib/$(SYSTEM)/$(LIBFORMAT)

# CPLEX include directories
CONCERTINCDIR = $(CONCERTDIR)/include
CPLEXINCDIR   = $(CPLEXDIR)/include

# Boost library directories
# Modify the paths below according to your setup
BOOSTINCDIR = /path/to/boost_1_82_0/include 
BOOSTLIBDIR = /path/to/boost_1_82_0/lib

# Armadillo include directories
# Modify the path below according to your setup
ARMAINCDIR = /path/to/armadillo-11.2.4/include

# OpenBLAS library directories
# Modify the path below according to your setup
OPENBLASLIBDIR = /path/to/OpenBLAS

# LAPACK library directories
# Modify the path below according to your setup
LAPACKLIBDIR = /path/to/lapack-3.10.1

CCLNDIRS  = -L$(CPLEXLIBDIR) -L$(CONCERTLIBDIR) -L./cvrpsep \
		-L$(OPENBLASLIBDIR) -L$(LAPACKLIBDIR) -L$(BOOSTLIBDIR)
CCLNFLAGS = -lconcert -lilocplex -lcplex -m64 -lm -lpthread -ldl \
            -lcvrpsep -lboost_serialization -lz -lboost_iostreams -lopenblas -llapack
CCFLAGS = $(CCOPT) -I$(CPLEXINCDIR) -I$(CONCERTINCDIR) \
            -I$(BOOSTINCDIR) -I$(ARMAINCDIR)

SOURCES=Instance.cpp IntegerSolver.cpp Knapsack.cpp Label.cpp LinearSolver.cpp \
               Pricing.cpp Route.cpp Separation3SRC.cpp SeparationRCC.cpp Solution.cpp \
               Solver.cpp SubsetRowCut.cpp FeatureScenarioSampler.cpp ArmaLoader.cpp \
               InstanceGenerator.cpp NoiseGenerator.cpp \
               PenaltyPredictionModel.cpp StandardScaler.cpp MLPRegressor.cpp main.cpp
OBJECTS=$(SOURCES:.cpp=.o) # see https://www.gnu.org/savannah-checkouts/gnu/make/manual/make.html#Substitution-Refs
EXECUTABLE=main

# see https://stackoverflow.com/questions/1344829/gmake-compile-all-files-in-a-directory
# see https://www.gnu.org/savannah-checkouts/gnu/make/manual/make.html#Wildcard-Function
CVRPSEP_OBJECTS := $(patsubst %.cpp,%.o,$(wildcard cvrpsep/*.cpp))
LIBCVRPSEP=cvrpsep/libcvrpsep.a

all: $(SOURCES) $(LIBCVRPSEP) $(EXECUTABLE)

# see https://stackoverflow.com/questions/3220277/what-do-the-makefile-symbols-and-mean
# see https://www.gnu.org/savannah-checkouts/gnu/make/manual/make.html#Automatic-Variables
$(LIBCVRPSEP): $(CVRPSEP_OBJECTS)
	ar rcs $@ $^

$(EXECUTABLE): $(OBJECTS)
	$(CCC) $(CCFLAGS) $(CCLNDIRS) $(OBJECTS) -o $@ $(CCLNFLAGS) 

# see https://www.gnu.org/savannah-checkouts/gnu/make/manual/make.html#Suffix-Rules
.cpp.o:
	$(CCC) -c $(CCFLAGS) $< -o $@

clean:
	/bin/rm -rf *.o main ./cvrpsep/*.o $(LIBCVRPSEP)
