#Compiler
CC = g++

# ---- General Settings ----
#Set library base folder here, you can set as many library base folders as you wish sepearated by space (or zero by letting this space empty)
LIB_DIRS = ../Buffers
#Set files to be excluded for compilation
LIB_DIR_EXCLUDE_FILES = test.o
#Set name of binary output file
BIN = ResourceSharing

#Default file locations
SOURCE_DIR = ./src
INCLUDE_DIR = ./inc
BUILD_DIR_DEBUG = ./build/debug
BUILD_DIR_RELEASE = ./build/release
BIN_DIR = ./bin

#Used to automatically determine object files - do not change!
SOURCE_FILES := $(wildcard ${SOURCE_DIR}/*.cpp)
OBJECT_FILES_BASE := $(addsuffix .o, $(notdir $(basename $(SOURCE_FILES))))
OBJECT_FILES_DEBUG := $(addprefix $(BUILD_DIR_DEBUG)/, $(OBJECT_FILES_BASE))
OBJECT_FILES_RELEASE := $(addprefix $(BUILD_DIR_RELEASE)/, $(OBJECT_FILES_BASE))

#Compile and Linker flags
CFLAGS_DEBUG = `pkg-config libgvc --cflags` -g3 -std=c++17 -Wall -Wextra -Wpedantic -O0 -fopenmp
CFLAGS_RELEASE = `pkg-config libgvc --cflags` -std=c++17 -O3 -flto

LFLAGS_DEBUG=`pkg-config libgvc --libs`
LFLAGS_RELEASE=`pkg-config libgvc --libs` -flto


debug: $(OBJECT_FILES_DEBUG) make_libs_debug
	$(CC) $(CFLAGS_DEBUG) $(OBJECT_FILES_DEBUG) $(filter-out $(addprefix %, ${LIB_DIR_EXCLUDE_FILES}), $(wildcard $(addsuffix /$(BUILD_DIR_DEBUG), $(LIB_DIRS))/*.o)) -o $(BIN_DIR)/$(BIN) $(LFLAGS_DEBUG)

release: $(OBJECT_FILES_RELEASE) make_libs_release
	$(CC) $(CFLAGS_RELEASE) $(OBJECT_FILES_RELEASE) $(filter-out $(addprefix %, ${LIB_DIR_EXCLUDE_FILES}), $(wildcard $(addsuffix /$(BUILD_DIR_RELEASE), $(LIB_DIRS))/*.o)) -o $(BIN_DIR)/$(BIN) $(LFLAGS_RELEASE)

make_libs_debug:
	$(foreach LIB, $(LIB_DIRS), cd $(LIB) && make)
	mkdir -p ${BIN_DIR}

make_libs_release:
	$(foreach LIB, $(LIB_DIRS), cd $(LIB) && make release)
	mkdir -p ${BIN_DIR}

${BUILD_DIR_DEBUG}/%.o : ${SOURCE_DIR}/%.cpp
	mkdir -p $(BUILD_DIR_DEBUG)
	${CC} -c ${CFLAGS_DEBUG} $< -o $@ -I${INCLUDE_DIR} $(addprefix -I./, $(addsuffix /$(INCLUDE_DIR), ${LIB_DIRS}))

${BUILD_DIR_RELEASE}/%.o : ${SOURCE_DIR}/%.cpp
	mkdir -p $(BUILD_DIR_RELEASE)
	${CC} -c ${CFLAGS_RELEASE} $< -o $@ -I${INCLUDE_DIR} $(addprefix -I./, $(addsuffix /$(INCLUDE_DIR), ${LIB_DIRS}))

clean:
	rm -f ${BUILD_DIR_DEBUG}/*.o
	rm -f ${BUILD_DIR_RELEASE}/*.o
	rm -f ${BIN_DIR}/BIN

clean_all: clean
	$(foreach LIB, $(LIB_DIRS), cd $(LIB) && make clean_all)