OS := $(shell uname)

LIBCDSPATH = ../libcds-v1.0.12

# Uncomment here to enable optional dependencies
RAPTOR_SUPPORT=false
#KYOTO_SUPPORT=true
LIBZ_SUPPORT=true
SERD_SUPPORT=true

CPP=g++

OFLAGS=-O3

FLAGS=$(OFLAGS) -Wno-deprecated -Wall -Wextra -Wno-unused-parameter -Wno-sign-compare -Wno-unknown-warning-option -std=c++0x

ifeq ($(CPP), g++)
FLAGS+=-Wno-unused-but-set-variable
endif

INCLUDES=-I $(LIBCDSPATH)/includes/ -I /usr/local/include -I ./include -I /opt/local/include -I /usr/include
LDFLAGS=
DOXYGEN=doxygen
DEFINES= -DHAVE_CDS
LIB=$(LIBCDSPATH)/lib/libcds.a -L/usr/local/lib -lstdc++

ifeq ($(RAPTOR_SUPPORT), true)
DEFINES:=$(DEFINES) -DHAVE_RAPTOR
LIB:=$(LIB) -lraptor2
endif

ifeq ($(KYOTO_SUPPORT), true)
DEFINES:=$(DEFINES) -DHAVE_KYOTO
LIB:=$(LIB) -lkyotocabinet
endif

ifeq ($(LIBZ_SUPPORT), true)
DEFINES:=$(DEFINES) -DHAVE_LIBZ
LIB:=$(LIB) -lz
endif

ifeq ($(SERD_SUPPORT), true)
DEFINES:=$(DEFINES) -DHAVE_SERD
LIB:=$(LIB) -lserd-0
endif

ifeq ($(OS), Darwin)
CPP=clang++
FLAGS:=$(FLAGS) -arch x86_64
endif

ifeq ($(CPP), g++)
FLAGS:=$(FLAGS) #-fopenmp
endif

SRCS=$(wildcard src/*.cpp) $(wildcard src/**/*.cpp) $(wildcard src/**/**/*.cpp)
THIRD=$(wildcard third/*.cpp) $(wildcard third/**/*.cpp)
OBJECTS=$(patsubst %.cpp,%.o, $(SRCS) $(THIRD))
HEADERS=$(wildcard include/*.hpp) $(wildcard include/*.h) $(wildcard src/*.hpp) $(wildcard src/*.h) $(wildcard src/**/*.hpp)
TOOLS=$(patsubst %.cpp,%, $(wildcard tools/*.cpp))
TESTS=$(patsubst %.cpp,%, $(wildcard tests/*.cpp))
EXAMPLES=$(patsubst %.cpp,%, $(wildcard examples/*.cpp))

all:
	@$(MAKE) showflags
	@$(MAKE) -C $(LIBCDSPATH)
	@$(MAKE) tools tests/jointest
	#@$(MAKE) tests examples

re:
	@$(MAKE) clean
	@$(MAKE) all

showflags:
	@echo " [CFG] OS= $(OS)"
	@echo " [CFG] CPP = $(CPP)"
	@echo " [CFG] FLAGS = $(FLAGS)"
	@echo " [CFG] LDFLAGS = $(LDFLAGS)"
	@echo " [CFG] DEFINES = $(DEFINES)"
	@echo " [CFG] INCLUDES = $(INCLUDES)"
	@echo " [CFG] LIB= $(LIB)"

tools/%: tools/%.cpp libhdt.a
	@echo " [HDT] Compiling tool $<"
	@$(CPP) $(INCLUDES) $(FLAGS) $(DEFINES) $(LDFLAGS) $< -o $(patsubst %.cpp, % ,$<) libhdt.a ${LIB}

tools: libhdt.a $(TOOLS)

examples/%: examples/%.cpp libhdt.a
	@echo " [HDT] Compiling example $<"
	@$(CPP) $(INCLUDES) $(FLAGS) $(DEFINES) $(LDFLAGS) $< -o $(patsubst %.cpp, % ,$<) libhdt.a ${LIB}

examples: libhdt.a $(EXAMPLES)

tests/%: tests/%.cpp libhdt.a
	@echo " [HDT] Compiling test $<"
	@$(CPP) $(INCLUDES) $(FLAGS) $(DEFINES) $(LDFLAGS) $< -o $(patsubst %.cpp, % ,$<) libhdt.a ${LIB}

tests: libhdt.a $(TESTS)

%.o: %.cpp $(HEADERS) Makefile
	@echo " [HDT] Compiling $<"
	@$(CPP) $(INCLUDES) $(FLAGS) $(DEFINES) $(LDFLAGS) -c $< -o $@

libhdt.a: $(OBJECTS) $(HEADERS)
	@echo " [HDT] Linking libhdt.a"
	@rm -Rf libhdt.a
	@ar rcs libhdt.a $(OBJECTS)

doc:
	@echo " [HDT] Generating documentation"
	$(DOXYGEN)

clean:
	@echo " [CLN] Removing object files"
	@rm -f $(OBJECTS) $(TOOLS) $(TESTS) $(EXAMPLES) libhdt.a *~
	@rm -Rf tools/*dSYM tests/*dSYM examples/*dSYM docs/*
