CXX			:= g++
RM			:= rm -f
MKDIR		:= mkdir -p
RMDIR		:= rmdir

CXXFLAGS	:= -std=c++11 -O2
LDFLAGS		:= 
CXXINCLUDE	:= -I.

OBJDIR		:= obj
BINDIR		:= bin

Main		:= $(BINDIR)/main
Header		:= defs.h
Objects		:= $(patsubst ./%.cpp, $(OBJDIR)/%.o, $(shell find . -name '*.cpp'))

Dirs		:= $(BINDIR) $(shell echo $(patsubst %/,%,$(dir $(Objects))) | tr ' ' '\n' | sort -u | tr '\n' ' ')

all: $(Main)

$(OBJDIR)/%.o: %.cpp $(Header) | $(Dirs)
	$(CXX) $(CXXFLAGS) $(CXXINCLUDE) -c $< -o $@

$(Main): $(Objects) $(Header) | $(Dirs)
	$(CXX) $(CXXFLAGS) $(CXXINCLUDE) -o $@ $^ $(LDFLAGS)

$(Dirs):
	$(MKDIR) $@

run: $(Main)
	$(Main)

clean:
	$(RM) -r $(OBJDIR)
	$(RM) -r $(BINDIR)

.PHONY: all run clean
