CXX=g++
FLAGS=-g -Wall -Wextra -std=gnu++2a
LIBS=-pthread

BIN_DIR=bin
OBJ_DIR=build
SRC_DIR=.
INC_DIR=common
INCLUDE=-I$(INC_DIR)

HEADERS=$(wildcard $(SRC_DIR)/*.hpp) $(wildcard $(INC_DIR)/*.hpp)
SOURCES=$(wildcard $(SRC_DIR)/*.cpp)
INC_SOURCES=$(wildcard $(INC_DIR)/*.cpp)
OBJECTS=$(SOURCES:$(SRC_DIR)/%.cpp=$(OBJ_DIR)/%.o) $(INC_SOURCES:$(INC_DIR)/%.cpp=$(OBJ_DIR)/%.o)
EXECUTABLE=$(BIN_DIR)/$(shell basename `pwd`)

all: $(EXECUTABLE)

$(EXECUTABLE): $(OBJECTS) | $(BIN_DIR)/.
	$(CXX) $(FLAGS) $^ -o $@ $(LIBS)

$(OBJ_DIR)/%.o: $(SRC_DIR)/%.cpp $(HEADERS) | $(OBJ_DIR)/.
	$(CXX) -c $(FLAGS) $(INCLUDE) $< -o $@

$(OBJ_DIR)/%.o: $(INC_DIR)/%.cpp $(HEADERS) | $(OBJ_DIR)/.
	$(CXX) -c $(FLAGS) $(INCLUDE) $< -o $@

# Create dependency directories
.PRECIOUS: %/.
%/.:
	mkdir -p $(dir $@)

.PHONY: lint
lint:
	cpplint --filter=-build/c++11,-build/header_guard common/*.hpp common/*.cpp *.hpp *.cpp

.PHONY: clean
clean:
	rm -rf $(BIN_DIR) $(OBJ_DIR)
