################################################################################
################################################################################
################################################################################
#
# MAKEFILE
# PROJECT: {{{name}}}
#
################################################################################
PROJECT_NAME   = {{{sanitizedName}}}

#-------------------------------------------------------------------------------
#
# ENVIRONMENT CONFIGURATION
#
#-------------------------------------------------------------------------------
SHELL          = sh
REMOVE         = rm -rf
COPY           = cp

#-------------------------------------------------------------------------------
#
# SOURCE FILES
#
#-------------------------------------------------------------------------------
CPPSRC =
CPPSRC += {{{sanitizedName}}}_generated_states.cpp
CPPSRC += {{{sanitizedName}}}_test.cpp

#-------------------------------------------------------------------------------
#
# COMPILER CONFIGURATION
#
#-------------------------------------------------------------------------------
CSTANDARD   = -std=c17
CPPSTANDARD = -std=c++17
OPTIMIZATION= 3

CDEFS =

CPPDEFS =

DEBUG_DEFS =
DEBUG_DEFS += -DDEBUG_OUTPUT

CFLAGS =
CFLAGS += $(CDEFS)

CPPFLAGS = 
CPPFLAGS += -O$(OPTIMIZATION)
CPPFLAGS += $(CPPSTANDARD)
CPPFLAGS += -pthread

#-------------------------------------------------------------------------------
#
# GENERAL PURPOSE COMPILATION
#
#-------------------------------------------------------------------------------
# Define all object files.
COBJ      = $(CSRC:.c=.o) 
AOBJ      = $(ASRC:.S=.o)
COBJARM   = $(CSRCARM:.c=.o)
AOBJARM   = $(ASRCARM:.S=.o)
CPPOBJ    = $(CPPSRC:.cpp=.o) 
CPPOBJARM = $(CPPSRCARM:.cpp=.o)
# Listing files.
LST =
LST += $(CSRC:.c=.lst)
LST += $(CPPSRC:.cpp=.lst)
# Dependency files.
GENDEPFLAGS = -MD -MP -MF .dep/$(@F).d
# Combine all necessary flags and optional flags.
# Add target processor to flags.
ALL_CFLAGS  = $(CFLAGS) $(CPPFLAGS) $(GENDEPFLAGS)

#-------------------------------------------------------------------------------
#
# TARGETS
#
#-------------------------------------------------------------------------------
all:       begin test debug end
test:      {{{sanitizedName}}}_test
debug:     {{{sanitizedName}}}_test_DEBUG
run:       run_{{{sanitizedName}}}_test
run_debug: run_{{{sanitizedName}}}_test_DEBUG

gccversion : 
	@$(CC) --version

begin: gccversion
	@echo
	@echo Building HFSMs within Project: {{{name}}}

end:
	@echo Finished compiling HFSMs
	@echo

clean:
	@echo
	@echo Cleaning Project: {{{name}}}
	$(REMOVE) {{{sanitizedName}}}_test
	$(REMOVE) {{{sanitizedName}}}_test_DEBUG
	$(REMOVE) $(CPPSRC:.cpp=.s) 
	$(REMOVE) $(CPPSRC:.cpp=.d)
	$(REMOVE) $(LST)
	$(REMOVE) .dep


.PRECIOUS : $(CPPOBJ)

$(CPPOBJ) : %.o : %.cpp
	@echo
	@echo Compiling CPP Source: $<
	g++ $(ALL_CFLAGS $< -o $@

{{{sanitizedName}}}_test:
	@echo Compiling {{{sanitizedName}}}_test
	g++ -o {{{sanitizedName}}}_test {{{sanitizedName}}}_test.cpp {{{sanitizedName}}}_generated_states.cpp $(ALL_CFLAGS)
{{{sanitizedName}}}_test_DEBUG:
	@echo Compiling {{{sanitizedName}}}_test_DEBUG
	g++ -o {{{sanitizedName}}}_test_DEBUG {{{sanitizedName}}}_test.cpp {{{sanitizedName}}}_generated_states.cpp $(ALL_CFLAGS) $(DEBUG_DEFS)
run_{{{sanitizedName}}}_test: {{{sanitizedName}}}_test
	@echo
	@echo Running {{{sanitizedName}}}_test
	@echo
	./{{{sanitizedName}}}_test
	@echo
	@echo Finished
run_{{{sanitizedName}}}_test_DEBUG: {{{sanitizedName}}}_test_DEBUG
	@echo
	@echo Running {{{sanitizedName}}}_test_DEBUG
	@echo
	./{{{sanitizedName}}}_test_DEBUG
	@echo
	@echo Finished

-include $(shell mkdir .dep 2>/dev/null) $(wildcard .dep/*)
.PHONY : all begin finish end sizebefore sizeafter gccversion \
build elf hex bin lss sym clean clean_list program
