#########################
EXECS = gcc_led_rti

.PHONY : all
all : $(EXECS).elf

#########################
# Tools
#########################
CC=$(MACH)gcc
AS=$(MACH)as
LD=$(MACH)gcc
## nm - list symbols from object files
NM=$(MACH)nm
## The gnu objcopy utility copies the contents of an object file to another
OBJCOPY=$(MACH)objcopy
OBJDUMP=$(MACH)objdump
READELF=$(MACH)readelf

CP = cp
RM = rm -f

#########################
# Build switchers
#########################
LDSCRIPT ?= sys_link.ld

MACH ?= arm-none-eabi-

INC =-Iinclude

CPUMODE= -mcpu=cortex-r4 -mbig-endian -mthumb -mthumb-interwork
CPUMODE+= -mfpu=vfpv3-d16 -mfloat-abi=hard

CPUIMODE= -mcpu=cortex-r4 -mbig-endian -marm -mthumb-interwork
CPUIMODE+= -mfpu=vfpv3-d16 -mfloat-abi=hard

CFLAGS= $(CPUMODE) -gdwarf-2 -ffast-math -fomit-frame-pointer -std=c99
CFLAGS+= -mstructure-size-boundary=8 -fno-strict-aliasing

CIFLAGS= $(CPUIMODE) -gdwarf-2 -ffast-math -fomit-frame-pointer -std=c99
CIFLAGS+= -mstructure-size-boundary=8 -fno-strict-aliasing

ASFLAGS= $(CPUMODE) -Wa,-gdwarf2 -x assembler-with-cpp

#LIBS=lib/TI_F021_API_CortexR4_BE_V3D16_complete.lib
LIBS=lib/TI_F021_API_CortexR4_BE_V3D16_stripped.lib

LDFLAGS= $(CPUMODE) -nostartfiles -Wl,-Map,$(EXECS).map,-T,$(LDSCRIPT),-n

#########################
# C sources & objects
#########################
C_SRC  = flash_api/TI_Fapi_UserDefinedFunctions.c \
         source/esm.c \
         source/gio.c \
         source/notification.c \
         source/pinmux.c \
         source/rti.c \
         source/sys_main.c \
         source/sys_pcr.c \
         source/sys_phantom.c \
         source/sys_pmm.c \
         source/sys_selftest.c \
         source/sys_startup.c \
         source/system.c \
         source/rti_int.c \
         rtos/process.c

C_OBJ = $(C_SRC:.c=.o)

#########################
# C interrupt services
#########################
CI_SRC  = 

CI_OBJ = $(CI_SRC:.c=.o)

#########################
# Asm sources & objects
#########################
ASM_SRC = source/dabort.S \
          source/sys_core.S \
          source/sys_intvecs.S \
          source/sys_mpu.S \
          source/sys_pmu.S \
          rtos/int.S

ASM_OBJ	= $(ASM_SRC:.S=.o)

OBJ = $(C_OBJ) $(CI_OBJ) $(ASM_OBJ)

$(C_OBJ): %.o: %.c
	@echo Compiling $<
	@$(CC) -c $(CFLAGS) $(INC) $< -o $@
	
$(CI_OBJ): %.o: %.c
	@echo Compiling interrupt module $<
	$(CC) -c $(CIFLAGS) $(INC) $< -o $@

$(ASM_OBJ): %.o: %.S
	@echo Assembling $<
	@$(CC) -c $(ASFLAGS) $(INC) $< -o $@

$(EXECS).elf : $(OBJ) $(LDSCRIPT)
	@echo Linking $@
	@$(LD) -o $@ $(LDFLAGS) $(OBJ) $(LIBS)

.PHONY : debug
debug:
	@$(OBJDUMP) -S $(EXECS).elf > debug/$(EXECS).dumpS
	@$(OBJDUMP) -t $(EXECS).elf > debug/$(EXECS).sym
	@$(OBJDUMP) -d $(EXECS).elf > debug/$(EXECS).asm
	@$(READELF) -e $(EXECS).elf > debug/$(EXECS)_headers.txt
	@$(READELF) -x 1 $(EXECS).elf > debug/$(EXECS).hex1
	@$(READELF) -x 2 $(EXECS).elf > debug/$(EXECS).hex2
	@$(READELF) -x 3 $(EXECS).elf > debug/$(EXECS).hex3
	@$(READELF) -x 4 $(EXECS).elf > debug/$(EXECS).hex4
	@$(READELF) -x 5 $(EXECS).elf > debug/$(EXECS).hex5
	@$(READELF) -x 6 $(EXECS).elf > debug/$(EXECS).hex6

.PHONY : clean
clean :
	@$(RM) $(EXECS)
	@$(RM) $(OBJ)
	@$(RM) compiler.log assembler.log linker.log
	@$(RM) debug/$(EXECS).sym
	@$(RM) debug/$(EXECS).asm
	@$(RM) debug/$(EXECS)_headers.txt
	@$(RM) debug/$(EXECS).hex1
	@$(RM) debug/$(EXECS).hex2
	@$(RM) debug/$(EXECS).hex3
	@$(RM) debug/$(EXECS).hex4
	@$(RM) debug/$(EXECS).hex5
	@$(RM) debug/$(EXECS).hex6

