ifeq ($(OS),Windows_NT)
SHELL = $(ComSpec)
RMDIR = rmdir /s /q
mymkdir = if not exist "$1" mkdir "$1"
else
RMDIR = rm -fr
mymkdir = mkdir -p $1
endif

PROJECT_OBJS = \
<#list project_srcs as file>
<#assign cpp = file?matches("(.*)\\.cpp")>
<#if cpp>
	${build_path}/project/${cpp?groups[1]}.cpp.o \
</#if>
</#list>

PLATFORM_CORE_OBJS = \
<#list platform_core_srcs as file>
<#assign cpp = file?matches("${platform_core_path}/(.*)\\.cpp")>
<#if cpp>
	${build_path}/core/${cpp?groups[1]}.cpp.o \
</#if>
<#assign c = file?matches("${platform_core_path}/(.*)\\.c")>
<#if c>
	${build_path}/core/${c?groups[1]}.c.o \
</#if>
<#assign S = file?matches("${platform_core_path}/(.*)\\.S")>
<#if S>
	${build_path}/core/${S?groups[1]}.S.o \
</#if>
</#list>

PLATFORM_VARIANT_OBJS = \
<#list platform_variant_srcs as file>
<#assign cpp = file?matches("${platform_variant_path}/(.*)\\.cpp")>
<#if cpp>
	${build_path}/variant/${cpp?groups[1]}.cpp.o \
</#if>
<#assign c = file?matches("${platform_variant_path}/(.*)\\.c")>
<#if c>
	${build_path}/variant/${c?groups[1]}.c.o \
</#if>
<#assign S = file?matches("${platform_variant_path}/(.*)\\.S")>
<#if S>
	${build_path}/variant/${S?groups[1]}.S.o \
</#if>
</#list>

LIBRARIES_OBJS = \
<#list libraries_srcs as file>
<#assign cpp = file?matches("${libraries_path}/(.*?)/.*?/(.*)\\.cpp")>
<#if !cpp>
<#assign cpp = file?matches("${platform_path}/libraries/(.*?)/(.*)\\.cpp")>
</#if>
<#if cpp>
	${build_path}/libraries/${cpp?groups[1]}/${cpp?groups[2]}.cpp.o \
</#if>
<#assign c = file?matches("${libraries_path}/(.*?)/.*?/(.*)\\.c")>
<#if !c>
<#assign c = file?matches("${platform_path}/libraries/(.*?)/(.*)\\.c")>
</#if>
<#if c>
	${build_path}/libraries/${c?groups[1]}/${c?groups[2]}.c.o \
</#if>
</#list>

TARGETS = \
<#if recipe_objcopy_hex_pattern??>
	${build_path}/${project_name}.hex \
</#if>
<#if recipe_objcopy_epp_pattern??>
	${build_path}/${project_name}.eep \
</#if>
<#if recipe_objcopy_bin_pattern??>
	${build_path}/${project_name}.bin \
</#if>

all: $(TARGETS)

<#if recipe_objcopy_hex_pattern??>
${build_path}/${project_name}.hex: ${build_path}/${project_name}.elf
	${recipe_objcopy_hex_pattern}

</#if>
<#if recipe_objcopy_epp_pattern??>
${build_path}/${project_name}.eep: ${build_path}/${project_name}.elf
	${recipe_objcopy_eep_pattern}

</#if>
<#if recipe_objcopy_bin_pattern??>
${build_path}/${project_name}.bin: ${build_path}/${project_name}.elf
	${recipe_objcopy_bin_pattern}

</#if>
${build_path}/${project_name}.elf: $(PROJECT_OBJS) $(LIBRARIES_OBJS) ${build_path}/core.a
	${recipe_c_combine_pattern}

${build_path}/core.a:	$(PLATFORM_CORE_OBJS) $(PLATFORM_VARIANT_OBJS)

clean:
	$(RMDIR) ${build_path}

size:
	${recipe_size_pattern}

<#list project_srcs as file>
<#assign cpp = file?matches("(.*)\\.cpp")>
<#if cpp>
${build_path}/project/${cpp?groups[1]}.cpp.o: ../../${file} ${build_path}/project/${cpp?groups[1]}.cpp.d
	@$(call mymkdir,$(dir $@))
	${recipe_cpp_o_pattern}

${build_path}/project/${cpp?groups[1]}.cpp.d: ;

-include ${build_path}/project/${cpp?groups[1]}.cpp.d 

</#if>
</#list>

<#list platform_core_srcs as file>
<#assign cpp = file?matches("${platform_core_path}/(.*)\\.cpp")>
<#if cpp>
${build_path}/core/${cpp?groups[1]}.cpp.o: ${file} ${build_path}/core/${cpp?groups[1]}.cpp.d
	@$(call mymkdir,$(dir $@))
	${recipe_cpp_o_pattern}
	${recipe_ar_pattern}

${build_path}/core/${cpp?groups[1]}.cpp.d: ;

-include ${build_path}/core/${cpp?groups[1]}.cpp.d

</#if>
<#assign c = file?matches("${platform_core_path}/(.*)\\.c")>
<#if c>
${build_path}/core/${c?groups[1]}.c.o: ${file} ${build_path}/core/${c?groups[1]}.c.d
	@$(call mymkdir,$(dir $@))
	${recipe_c_o_pattern}
	${recipe_ar_pattern}
	
${build_path}/core/${c?groups[1]}.c.d: ;

-include ${build_path}/core/${c?groups[1]}.c.d

</#if>
<#assign S = file?matches("${platform_core_path}/(.*)\\.S")>
<#if S>
${build_path}/core/${S?groups[1]}.S.o: ${file}
	@$(call mymkdir,$(dir $@))
	${recipe_S_o_pattern}
	${recipe_ar_pattern}

</#if>
</#list>

<#list platform_variant_srcs as file>
<#assign cpp = file?matches("${platform_variant_path}/(.*)\\.cpp")>
<#if cpp>
${build_path}/variant/${cpp?groups[1]}.cpp.o: ${file} ${build_path}/variant/${cpp?groups[1]}.cpp.d
	@$(call mymkdir,$(dir $@))
	${recipe_cpp_o_pattern}
	${recipe_ar_pattern}

${build_path}/variant/${cpp?groups[1]}.cpp.d: ;

-include ${build_path}/variant/${cpp?groups[1]}.cpp.d

</#if>
<#assign c = file?matches("${platform_variant_path}/(.*)\\.c")>
<#if c>
${build_path}/variant/${c?groups[1]}.c.o: ${file} ${build_path}/variant/${c?groups[1]}.c.d
	@$(call mymkdir,$(dir $@))
	${recipe_c_o_pattern}
	${recipe_ar_pattern}
	
${build_path}/variant/${c?groups[1]}.c.d: ;

-include ${build_path}/variant/${c?groups[1]}.c.d

</#if>
<#assign S = file?matches("${platform_variant_path}/(.*)\\.S")>
<#if S>
${build_path}/variant/${S?groups[1]}.S.o: ${file}
	@$(call mymkdir,$(dir $@))
	${recipe_S_o_pattern}
	${recipe_ar_pattern}

</#if>
</#list>

<#list libraries_srcs as file>
<#assign cpp = file?matches("${libraries_path}/(.*?)/.*?/(.*)\\.cpp")>
<#if !cpp>
<#assign cpp = file?matches("${platform_path}/libraries/(.*?)/(.*)\\.cpp")>
</#if>
<#if cpp>
${build_path}/libraries/${cpp?groups[1]}/${cpp?groups[2]}.cpp.o: ${file} ${build_path}/libraries/${cpp?groups[1]}/${cpp?groups[2]}.cpp.d
	@$(call mymkdir,$(dir $@))
	${recipe_cpp_o_pattern}

${build_path}/libraries/${cpp?groups[1]}/${cpp?groups[2]}.cpp.d: ;

-include ${build_path}/libraries/${cpp?groups[1]}/${cpp?groups[2]}.cpp.d

</#if>
<#assign c = file?matches("${libraries_path}/(.*?)/.*?/(.*)\\.c")>
<#if !c>
<#assign c = file?matches("${platform_path}/libraries/(.*?)/(.*)\\.c")>
</#if>
<#if c>
${build_path}/libraries/${c?groups[1]}/${c?groups[2]}.c.o: ${file} ${build_path}/libraries/${c?groups[1]}/${c?groups[2]}.c.d
	@$(call mymkdir,$(dir $@))
	${recipe_c_o_pattern}

${build_path}/libraries/${c?groups[1]}/${c?groups[2]}.c.d: ;

-include ${build_path}/libraries/${c?groups[1]}/${c?groups[2]}.c.d

</#if>
</#list>