CC=g++
C_FLAGS=-Wall -Wextra -pedantic -ggdb -std=c++20
GDB_FLAGS=-ex "b main"
VAL_FLAGS=--leak-check=full --show-leak-kinds=all --track-origins=yes -s

DIR_SRC=src
DIR_BUILD=build
DEPS=m raylib

OUTBIN=$(DIR_BUILD)/bin/main

SRCS=$(shell find $(DIR_SRC) -type f -name '*.cpp')
OBJS=$(patsubst $(DIR_SRC)/%.cpp,$(DIR_BUILD)/obj/%.o,$(SRCS))

DEPS_EXT=$(patsubst %,-l%,$(DEPS))


.PHONY: all build rebuild run dbg val clean


all: $(OUTBIN)
build: $(OUTBIN)
rebuild: clean build

run: $(OUTBIN)
	$(OUTBIN)

$(OUTBIN): $(OBJS)
	@mkdir -p $(@D)
	$(CC) $(OBJS) $(DEPS_EXT) -o $@

$(DIR_BUILD)/obj/%.o: $(DIR_SRC)/%.cpp
	@mkdir -p $(@D)
	$(CC) $(C_FLAGS) -c $< -o $@

dbg: $(OUTBIN)
	gdb $(GDB_FLAGS) $<

val: $(OUTBIN)
	valgrind $(VAL_FLAGS) $<

clean:
	@$(RM) -r $(DIR_BUILD)
