CC                    := gcc
BIN                   := demo

BUILD_DIR             := ./build
BUILD_DIR_ABS         := $(abspath $(BUILD_DIR))

KERNEL_DIR            := ./FreeRTOS

INCLUDE_DIRS          := -I./include
INCLUDE_DIRS          += -I$(KERNEL_DIR)/include
INCLUDE_DIRS          += -I$(KERNEL_DIR)/portable/ThirdParty/GCC/Posix
INCLUDE_DIRS          += -I$(KERNEL_DIR)/portable/ThirdParty/GCC/Posix/utils

SOURCE_FILES          := $(wildcard src/*.c)
SOURCE_FILES          += $(wildcard src/menu/*.c)
SOURCE_FILES          += $(wildcard src/util/*.c)
SOURCE_FILES          += $(wildcard src/control/core/*.c)
SOURCE_FILES          += $(wildcard src/control/fsm/*.c)
SOURCE_FILES          += $(wildcard src/control/modes/**/*.c)
SOURCE_FILES          += $(wildcard $(KERNEL_DIR)/*.c)
# Memory manager (use malloc() / free())
SOURCE_FILES          += $(KERNEL_DIR)/portable/MemMang/heap_3.c
# posix port
SOURCE_FILES          += $(KERNEL_DIR)/portable/ThirdParty/GCC/Posix/utils/wait_for_event.c
SOURCE_FILES          += $(KERNEL_DIR)/portable/ThirdParty/GCC/Posix/port.c

ifdef DEBUG
CFLAGS                := -ggdb3 -O0 -Wall -Wextra -Werror
LDFLAGS               := -ggdb3 -pthread -O0
else
CFLAGS                := -O3 -Wall -Wextra -Werror
LDFLAGS               := -pthread -O3
endif
CPPFLAGS              := $(INCLUDE_DIRS) -DBUILD_DIR=\"$(BUILD_DIR_ABS)\"

OBJ_FILES             := $(SOURCE_FILES:%.c=$(BUILD_DIR)/%.o)
DEP_FILES             := $(OBJ_FILES:%.o=%.d)

.PHONY: all clean

all: $(BIN)

$(BIN): $(BUILD_DIR)/$(BIN)

$(BUILD_DIR)/$(BIN): $(OBJ_FILES)
	mkdir -p $(@D)
	$(CC) $(LDFLAGS) $^ -o $@ $(LDLIBS)

-include $(DEP_FILES)

$(BUILD_DIR)/%.o: %.c Makefile
	mkdir -p $(@D)
	$(CC) $(CPPFLAGS) $(CFLAGS) -MMD -c $< -o $@

clean:
	rm -rf $(BUILD_DIR)
