export SHELLOPTS := igncr

CPUR  := -march=armv7-r -marm -mlittle-endian -mfloat-abi=soft
CPUM  := -march=armv7-m -mcpu=cortex-m3 -mthumb  -mlittle-endian -mfloat-abi=soft -mrestrict-it
AOPT  := -g -Wall -Wa,--gdwarf2 -xassembler-with-cpp -c
COPT  := -std=c99 -g -O0 -fno-jump-tables -ffunction-sections -fdata-sections -Wall -c
LOPT  := -g -Wall -Wl,--nmagic -nodefaultlibs -nostartfiles -Wl,--gc-sections -Wl,--entry=_start
LIBS  := -lgcc -lc
TMP   := ./tmp
VPATH := . ..

CCGRP := arm-none-eabi-
NAME  := coverage

.PHONY: all

all: $(NAME).elf $(NAME)_cm.elf $(NAME)_flash.elf $(NAME).eca $(NAME).c.eca

$(TMP):
	mkdir $(TMP)

$(TMP)/%.o: %.c $(MAKEFILE_LIST)
	$(CCGRP)gcc $(COPT) $(CPUR) -o $@ $<

$(TMP)/%.thumb2.o: %.c $(MAKEFILE_LIST)
	$(CCGRP)gcc $(COPT) $(CPUM) -o $@ $<

$(TMP)/%.o: %.cpp $(MAKEFILE_LIST)
	$(CCGRP)g++ $(COPT) $(CPUR) -o $@ $<

$(TMP)/%.o: %.sx  $(MAKEFILE_LIST)
	$(CCGRP)gcc $(AOPT) $(CPUR) -o $@ $<

$(TMP)/%.thumb2.o: %.sx  $(MAKEFILE_LIST)
	$(CCGRP)gcc $(AOPT) $(CPUM) -o $@ $<

$(TMP)/crt0.flash.o: crt0.sx  $(MAKEFILE_LIST)
	$(CCGRP)gcc $(AOPT) $(CPUR) -D FLASHSTART -o $@ $<


$(TMP)/flash.ld:   cortex-r5.lds $(MAKEFILE_LIST) | $(TMP)
	$(CCGRP)cpp -P -o $@ $< -D FLASHSTART -D RAMSTART=0x08000000 -D RAMSIZE=32K -D FLASHSIZE=128K

$(TMP)/sram.ld:    cortex-r5.lds $(MAKEFILE_LIST) | $(TMP)
	$(CCGRP)cpp -P -o $@ $< -D RAMSTART=0x08000000 -D RAMSIZE=32K

$(TMP)/sram_cm.ld: cortex-r5.lds $(MAKEFILE_LIST) | $(TMP)
	$(CCGRP)cpp -P -o $@ $< -D RAMSTART=0x20000000 -D RAMSIZE=32K


$(NAME)_flash.elf:     $(addprefix $(TMP)/,flash.ld   crt0.flash.o main.o $(NAME).o)
	$(CCGRP)gcc $(LOPT) $(CPUR) -o $@ -T $^ -Wl,--start-group $(LIBS) -Wl,--end-group

$(NAME).elf:           $(addprefix $(TMP)/,sram.ld    crt0.o main.o $(NAME).o)
	$(CCGRP)gcc $(LOPT) $(CPUR) -o $@ -T $^ -Wl,--start-group $(LIBS) -Wl,--end-group

$(NAME)_cm.elf:        $(addprefix $(TMP)/,sram_cm.ld crt0.thumb2.o main.thumb2.o $(NAME).thumb2.o)
	$(CCGRP)gcc $(LOPT) $(CPUM) -o $@ -T $^ -lm -lgcc


# Create files for extended code analysis using t32cast
ECAOPT  := -m32

%.eca: %.c | $(TMP)
	$(ECAGRP)t32cast $(ECAOPT) -o $(addprefix ../,$@) $^

%.c.eca: %.c | $(TMP)
	$(ECAGRP)t32cast $(ECAOPT) -o $(addprefix ../,$@) $^

clean:
	-rm -fvr $(TMP)
	-rm -fv *.elf
	-rm -fv ../*.eca

