# WEBOTS_HOME is a sine qua non condition to run this Makefile
ifndef WEBOTS_HOME
  $(error The WEBOTS_HOME environment variable is not defined.)
endif

# WEBOTS_HOME_PATH is commonly defined in the caller Makefile
# but as it is not necessary on non-windows OS, it seems safer to reconstruct it there if required
ifndef WEBOTS_HOME_PATH
  null :=
  space := $(null) $(null)
  WEBOTS_HOME_PATH=$(subst $(space),\ ,$(strip $(subst \,/,$(WEBOTS_HOME))))
endif

TARGET = firmware-1.5.0.hex

# OS determination and OS specific commands
include $(WEBOTS_HOME_PATH)/resources/Makefile.os.include

ifeq ($(OSTYPE),windows)
LIBPATH = $(shell cygpath $(WEBOTS_HOME_PATH)/projects/robots/gctronic/e-puck/transfer)
else
LIBPATH = $(WEBOTS_HOME_PATH)/projects/robots/gctronic/e-puck/transfer
endif

MICROCHIP_PATH = $(LIBPATH)/xc16
export PATH := $(MICROCHIP_PATH)/bin:$(PATH)

CURDIR = $(shell pwd)
BAD_NAME = $(basename $(notdir $(CURDIR)))
NAME = $(word $(words $(BAD_NAME)),$(BAD_NAME))

ifndef C_SOURCES
C_SOURCES = $(shell ls $(NAME).c 2> /dev/null)
endif

TARGET = $(NAME).hex

SUFFIXES += .d
SUFFIX=-pic30

NODEPS = clean
SOURCES = $(C_SOURCES) $(AS_SOURCES)
OBJECTS = $(C_SOURCES:.c=$(SUFFIX).o)
DEPFILES = $(C_SOURCES:.c=$(SUFFIX).d)

CCFLAGS = -Wall -mcpu=30f6014A -I"$(LIBPATH)/libepuck/include"
CCINCLUDE = -I"$(LIBPATH)/library"

ASFLAGS = --processor=30F6014A
ASINCLUDE = -I"$(LIBPATH)/library/codec" -I"$(LIBPATH)/library/uart"

LDFLAGS = --heap=512 --script="$(MICROCHIP_PATH)/support/dsPIC30F/gld/p30F6014A.gld" -L"$(MICROCHIP_PATH)/lib" -L"$(MICROCHIP_PATH)/lib/dsPIC30F" -L"$(LIBPATH)/libepuck"
LDLIBS = -lc-elf -ldsp-elf -lm-elf -lp30F6014A-elf -lpic30-elf -lepuck

ifeq ($(OSTYPE),darwin)
  CC = $(MICROCHIP_PATH)/bin/xc16-gcc
  LD = $(MICROCHIP_PATH)/bin/xc16-ld
  BIN2HEX = $(MICROCHIP_PATH)/bin/xc16-bin2hex
else
  CC = xc16-gcc
  LD = xc16-ld
  BIN2HEX = xc16-bin2hex
endif

ifeq ($(OSTYPE),linux)
  ifeq ($(OSARCH),x86_64)
    ifneq ($(MAKECMDGOALS),clean)
      ifeq ($(shell $(MICROCHIP_PATH)/bin/xc16-gcc --version),)
        $(error xc16-gcc cannot be executed. Installing the gcc:i386 library may help: "sudo apt-get install gcc-4.6-base:i386 libgcc1:i386 libc6:i386")
      endif
    endif
  endif
endif

COF = $(TARGET:.hex=.cof)

release debug profile: $(TARGET)

$(TARGET): $(COF)
	$(BIN2HEX) "$<"

$(COF): $(OBJECTS)
	$(LD) $(LDFLAGS) --start-group $(addsuffix ",$(addprefix ",$(OBJECTS))) $(LDLIBS) --end-group -o "$@"

%$(SUFFIX).d: %.c
	$(CC) $(CCFLAGS) $(CCINCLUDE) -MM -MT "$(patsubst %.c,%.o,$<)" "$<" -MF "$@"

%$(SUFFIX).o: %.c
	$(CC) -c $(CCFLAGS) $(CCINCLUDE) -o "$@" "$<"

ifeq (0, $(words $(findstring $(MAKECMDGOALS), $(NODEPS))))
-include $(DEPFILES)
endif

clean:
	rm -fr $(TARGET) $(COF) $(addsuffix ",$(addprefix ",$(DEPFILES) $(OBJECTS)))
