# Компилятор и директория проекта
ifeq ($(OS), Windows_NT)
	# С возможностью сборки x32
	ifeq ($(MAKECMDGOALS), x32)
		CC = C:/MinGW/bin/g++.exe
	else
		CC = C:/MinGW64/bin/g++.exe
	endif
	PROJECT_DIR = $(shell echo %cd%)
	PATH_SEPARATOR = \\
	# Имя исполняемого файла
	EXECUTABLE = $(notdir $(strip $(PROJECT_DIR))).exe
else
	CC = g++
	PROJECT_DIR = $(shell pwd)
	PATH_SEPARATOR = /
	# Имя исполняемого файла
	EXECUTABLE = $(notdir $(strip $(PROJECT_DIR)))
endif

# Опции компилятора
CFLAGS += -c
CFLAGS += -I./include
CFLAGS += -I../dependencies/GLFW/include
CFLAGS += -I../dependencies/glad/include
CFLAGS += -I../dependencies/glm
CFLAGS += -I../dependencies/stb
CFLAGS += -I../dependencies/tinyobjloader

# Опции линкера
LDFLAGS += --std=c++11
# Архитектурозависимые опции линкера
ifeq ($(OS), Windows_NT)
	# GLFW в зависимости от архитектуры
	ifeq ($(MAKECMDGOALS), x32)
		LDFLAGS += -L../dependencies/GLFW/lib-mingw
	else
		LDFLAGS += -L../dependencies/GLFW/lib-mingw-w64
	endif

	LDFLAGS += -static
	LDFLAGS += -lglfw3dll
	LDFLAGS += -lopengl32
else
	LDFLAGS += -lglfw
	LDFLAGS += -lGL
endif

# Библиотека GLAD
GLAD := ../dependencies/glad/src/glad.c
GLAD_O := $(GLAD:.c=.o)

# Файлы из директории src
SOURCES_C = $(wildcard src/*.c)
SOURCES_CPP = $(wildcard src/*.cpp) 

# Директория с объектными файлами
OBJ_DIR := Obj
# Объектные файлы
OBJECTS = $(addprefix $(OBJ_DIR)/,$(SOURCES_C:src/%.c=%.o) $(SOURCES_CPP:src/%.cpp=%.o))

# Для x32 сборки под Windows
ifeq ($(OS), Windows_NT)
	ifeq ($(MAKECMDGOALS), x32)
x32: all
	endif
endif

# Цель по умолчанию, зависит от EXECUTABLE
all: $(EXECUTABLE)

# Цель сборки исполняемого файла, зависит от OBJ_DIR, OBJECTS и GLAD_O
$(EXECUTABLE): $(OBJ_DIR) $(OBJECTS) $(GLAD_O)
	$(CC)  $(OBJECTS)  $(GLAD_O) $(LDFLAGS) -o $@

# Цель для сборки GLAD
$(GLAD_O): $(GLAD)
	$(CC) $(CFLAGS) $< -o $@

# Цель для создания директории с объектными файлами
$(OBJ_DIR):
	@mkdir $(OBJ_DIR)

# Цель сборки объектных файлов
$(OBJ_DIR)/%.o: src/%.c
	$(CC) $(CFLAGS) $< -o $@
$(OBJ_DIR)/%.o: src/%.cpp
	$(CC) $(CFLAGS) $< -o $@

# Цель вывода всех файлов, учавствтующих в сборке
list:
	@echo "В сборке участвуют:" $(OBJECTS)

# Очистка
ifeq ($(OS), Windows_NT)
clean: $(OBJ_DIR)
	@rmdir /s /q $(OBJ_DIR)
else
clean: $(OBJ_DIR)
	@rm -f $(EXECUTABLE) $(OBJECTS)
endif