######## Build options ########

verbose = 0

######## Build setup ########

# SRCROOT should always be the current directory
SRCROOT         = $(CURDIR)

# .o directory
ODIR            = obj

# Source VPATHS
VPATH           += $(SRCROOT)/Source
VPATH	        += $(SRCROOT)/Source/portable/MemMang
VPATH	        += $(SRCROOT)/Source/portable/GCC/POSIX
VPATH			+= $(SRCROOT)/src/Core
VPATH			+= $(SRCROOT)/src/GPIO
VPATH			+= $(SRCROOT)/src/GPS

# FreeRTOS Objects
C_FILES			+= croutine.c
C_FILES			+= event_groups.c
C_FILES			+= list.c
C_FILES			+= queue.c
C_FILES			+= tasks.c
C_FILES			+= timers.c

# portable Objects
C_FILES			+= heap_3.c
C_FILES			+= port.c

# common Objects
COMMON_SOURCE_LIST=$(shell cat ../common/sourcelist.txt)
C_FILES+=$(COMMON_SOURCE_LIST:%.c=../common/%.c)

# Main Object
SRC_SOURCES+=$(shell find -L src/ -name '*.c' -not -name 'vc.c')
C_FILES			+= $(SRC_SOURCES)

# Include Paths
INCLUDES        += -I$(SRCROOT)/Source/include
INCLUDES        += -I$(SRCROOT)/Source/portable/GCC/POSIX/
INCLUDES        += -I$(SRCROOT)/src/Core
INCLUDES        += -I$(SRCROOT)/../common/includes/
INCLUDES        += -I$(SRCROOT)

# Generate OBJS names
OBJS = $(patsubst %.c,%.o,$(C_FILES))
OBJS += src/Core/vc.o

######## C Flags ########

# Warnings
CWARNS += -W
CWARNS += -Wall
# CWARNS += -Werror
CWARNS += -Wextra
CWARNS += -Wformat
CWARNS += -Wmissing-braces
CWARNS += -Wno-cast-align
CWARNS += -Wparentheses
CWARNS += -Wshadow
CWARNS += -Wno-sign-compare
CWARNS += -Wswitch
CWARNS += -Wuninitialized
CWARNS += -Wunknown-pragmas
CWARNS += -Wunused-function
CWARNS += -Wunused-label
CWARNS += -Wunused-parameter
CWARNS += -Wunused-value
CWARNS += -Wunused-variable
CWARNS += -Wmissing-prototypes
CWARNS += -Wno-implicit-fallthrough # in nuklear

CFLAGS += -DDEBUG=1
CFLAGS += -g -DUSE_STDIO=1 -D__GCC_POSIX__=1 -lX11 -lm -lGL -lm -lGLU -lpulse-simple -lpulse
ifneq ($(shell uname), Darwin)
CFLAGS += -pthread
endif

# MAX_NUMBER_OF_TASKS = max pthreads used in the POSIX port. 
# Default value is 64 (_POSIX_THREAD_THREADS_MAX), the minimum number required by POSIX.
CFLAGS += -DMAX_NUMBER_OF_TASKS=300 -DSIMULATOR

CFLAGS += $(INCLUDES) $(CWARNS) -O2

######## Makefile targets ########

# Rules
.PHONY : all
all: vc.h setup FreeRTOS-Sim

.PHONY : setup
setup:
# Make obj directory
	@mkdir -p $(ODIR)

# Fix to place .o files in ODIR
_OBJS = $(patsubst %,$(ODIR)/%,$(OBJS))

dir_guard=@mkdir -p $(@D)

$(ODIR)/src/Core/vc.o: src/Core/vc.c vc.h
	$(dir_guard)
	@echo "[CC] version information vc.c"
ifeq ($(verbose),1)
	$(CC) $(CFLAGS) src/Core/vc.c -c -o $(ODIR)/src/Core/vc.o
else
	@$(CC) $(CFLAGS) src/Core/vc.c -c -o $(ODIR)/src/Core/vc.o
endif

$(ODIR)/%.o: %.c
	$(dir_guard)
# If verbose, print gcc execution, else hide
ifeq ($(verbose),1)
	@echo "[CC] $<"
	$(CC) $(CFLAGS) -c -o $@ $<
else
	@echo "[CC] $(notdir $<)"
	@$(CC) $(CFLAGS) -c -o $@ $<
endif

.PHONY: vc.h
vc.h: ../../.git/logs/HEAD
	@echo "// This file is generated by Makefile." > vc.h
	@echo "// Do not edit this file!" >> vc.h
	@echo "const char* vc_get_version(void);" >> vc.h
	@echo >> vc.h
	@git log -1 --format="format:#define GIT_VERSION \"%h\"" >> vc.h
	@echo >> vc.h
	@echo >> vc.h
	@echo [GEN] vc.h

FreeRTOS-Sim: $(_OBJS)
	@echo "[LK] $@"
ifeq ($(verbose),1)
	$(CC) $(CFLAGS) $^ $(LINKFLAGS) $(LIBS) -o $@
else
	@$(CC) $(CFLAGS) $^ $(LINKFLAGS) $(LIBS) -o $@
endif
	@echo "[:)] Happiness :)"

.PHONY : clean
clean:
	@-rm -rf $(ODIR) FreeRTOS-Sim common/
	@echo "[RM] Cleanuped °o°"