###############################################################################
#                                                                             #
#     DIRECTORIES                                                             #
#                                                                             #
###############################################################################

# Project root directory, so everything will be relative to it:
DIR_ROOT:= $(dir $(abspath $(MAKEFILE_LIST)))

# Root directory for the source code:
DIR_SOURCES:= $(addsuffix /, $(DIR_ROOT)source)

# Executables will be here.
DIR_BIN:= $(addsuffix /, $(DIR_ROOT))

# Directories for build artifacts (.o and .d files):
DIR_BUILD:= $(addsuffix /, $(DIR_ROOT)build)

INCLUDES:= -I$(DIR_SOURCES)

###############################################################################
#                                                                             #
#     FLAGS                                                                   #
#                                                                             #
###############################################################################

# Compiler flags (for the C++ compiler):
CXXFLAGS:= -std=c++11 -Wall -Os -ffunction-sections -fdata-sections

# Linker flags (SFML libraries):
LDFLAGS:= -lSDL2

###############################################################################
#                                                                             #
#     FILES                                                                   #
#                                                                             #
###############################################################################

SOURCES     := $(shell find $(DIR_SOURCES) -name '*.cpp')
OBJECTS     := $(subst $(DIR_SOURCES), $(DIR_BUILD), $(SOURCES))
OBJECTS     := $(OBJECTS:.cpp=.o)
DEPENDENCIES:= $(OBJECTS:.o=.d)

###############################################################################
#                                                                             #
#     TARGETS                                                                 #
#                                                                             #
###############################################################################

TARGET_NAME:= coffee_crisis_arcade_edition
TARGET_FILE:= $(DIR_BIN)$(TARGET_NAME)

###############################################################################
#                                                                             #
#     OTHER COMMANDS                                                          #
#                                                                             #
###############################################################################

RM:= rm -rf

###############################################################################
#                                                                             #
#     RULES                                                                   #
#                                                                             #
###############################################################################

.PHONY: all a1

all: a1

a1: $(TARGET_FILE)

$(TARGET_FILE): $(OBJECTS)
	mkdir -p $(@D)
	$(CXX) $(SOURCES) $(CXXFLAGS) $(INCLUDES) $(LDFLAGS) -o $(TARGET_FILE)

$(DIR_BUILD)%.o: $(DIR_SOURCES)%.cpp
	mkdir -p $(@D)
	$(CXX) -c $< $(CXXFLAGS) $(INCLUDES) -o $@

-include $(DEPENDENCIES)

###############################################################################
#                                                                             #
#     CLEAN                                                                   #
#                                                                             #
###############################################################################

.PHONY: clean

clean:
	$(RM) $(DIR_BIN) $(DIR_BUILD)

###############################################################################
#                                                                             #
#     PRINT-VARIABLES                                                         #
#                                                                             #
###############################################################################

.PHONY: print-variables

print-variables:
	@echo MAKEFILE_LIST: $(MAKEFILE_LIST)
	
	@echo "DIR_ROOT  :" $(DIR_ROOT)
	@echo "DIR_SOURCES:" $(DIR_SOURCES)
	@echo "DIR_BIN   :" $(DIR_BIN)
	@echo "DIR_BUILD :" $(DIR_BUILD)

	@echo "DIR_IMGUI     :" $(DIR_IMGUI)
	@echo "DIR_IMGUI_SFML:" $(DIR_IMGUI_SFML)
	@echo "INCLUDES      :" $(INCLUDES)

	@echo CXX: $(CXX)
	@echo CXXFLAGS: $(CXXFLAGS)
	@echo LDFLAGS: $(LDFLAGS)

	@echo SOURCES: $(SOURCES)
	@echo OBJECTS: $(OBJECTS)
	@echo DEPENDENCIES: $(DEPENDENCIES)

	@echo TARGET_NAME: $(TARGET_NAME)
	@echo TARGET_FILE: $(TARGET_FILE)

	@echo RM: $(RM)
