CC = gcc
CXX = g++

CPPFLAGS = -std=c++20 -g   -Wall -Wextra -Wpedantic  #-O3 -ffast-math 
CFLAGS = -g -Wall -Wextra -Wpedantic #-O3 -ffast-math
LDFLAGS = -g -Wall -Wextra -Wpedantic  #-O3 -ffast-math
LDLIBS =


SRC_DIR = src
OBJ_DIR = obj
BIN_DIR = bin



EXE = $(BIN_DIR)/main

C_SRC := $(wildcard $(SRC_DIR)/*.c) #GET LIST OF ALL C FILES
CPP_SRC := $(wildcard $(SRC_DIR)/*.cpp) #GET LIST OF ALL CPP FILES

#SRC := $(C_SRC) $(CPP_SCR)


C_OBJ := $(patsubst $(SRC_DIR)/%.c, $(OBJ_DIR)/%.o, $(C_SRC)) #MAKE LIST OF ALL C OBJECT FILES THAT NEED TO BE BUILT
CPP_OBJ := $(patsubst $(SRC_DIR)/%.cpp, $(OBJ_DIR)/%.o, $(CPP_SRC)) #MAKE LIST OF ALL CPP OBJECT FILES THAT NEED TO BE BUILT 

OBJ := $(C_OBJ) $(CPP_OBJ)


all: $(EXE)

$(EXE): $(OBJ) | $(BIN_DIR)
	$(CXX) $(LDFLAGS) $^ $(LDLIBS) -o $@

$(OBJ_DIR)/%.o: $(SRC_DIR)/%.c | $(OBJ_DIR)
	$(CC) $(CFLAGS) -c $< -o $@


$(OBJ_DIR)/%.o: $(SRC_DIR)/%.cpp | $(OBJ_DIR)
	$(CXX) $(CPPFLAGS) $(CXXFLAGS) -c $< -o $@

$(BIN_DIR) $(OBJ_DIR):
	mkdir -p $@


clean:
	@$(RM) -rv $(BIN_DIR) $(OBJ_DIR)

.PHONY: all clean

