.SUFFIXES:

ifdef IAR
${info Using IAR...}
#IAR_PATH =  C:/Program\ Files/IAR\ Systems/Embedded\ Workbench\ 5.4\ Evaluation
ifeq ($(IAR_PATH),)
  ${error IAR_PATH not defined! You must specify IAR root directory}
endif
endif

### Define the CPU directory
CONTIKI_CPU=$(CONTIKI)/cpu/stm32w108

### Define the source files we have in the STM32W port

CONTIKI_CPU_DIRS = . dev hal simplemac hal/micro/cortexm3 hal/micro/cortexm3/stm32w108

STM32W_C = leds-arch.c leds.c clock.c watchdog.c uart1.c uart1-putchar.c slip_uart1.c slip.c\
		stm32w-radio.c stm32w_systick.c uip_arch.c rtimer-arch.c adc.c micro.c sleep.c \
		micro-common.c micro-common-internal.c clocks.c mfg-token.c nvm.c flash.c rand.c

STM32W_S = spmr.s79 context-switch.s79 

ifdef IAR
STM32W_C += low_level_init.c
STM32W_S += cstartup_M.s
else
STM32W_C += crt_stm32w108.c
endif

ifdef ELF_LOADER
ELFLOADER  = elfloader-arch.c symtab.c
endif


# .s and .s79 not specified here because in Makefile.include only .c and .S suffixes are replaced with .o.
CONTIKI_TARGET_SOURCEFILES += $(STM32W_C) \
                              $(SYSAPPS) $(ELFLOADER) \
                              $(TARGETLIBS)

CONTIKI_SOURCEFILES        += $(CONTIKI_TARGET_SOURCEFILES)

ifdef IAR
TARGET_LIBFILES = $(CONTIKI_CPU)/simplemac/library/simplemac-library.a
else
 ifdef PRINTF_FLOAT
 TARGET_LIBFILES = $(CONTIKI_CPU)/simplemac/library/simplemac-library.a $(CONTIKI_CPU)/hal/micro/cortexm3/e_stdio_thumb2.a 
 else
 TARGET_LIBFILES = $(CONTIKI_CPU)/simplemac/library/simplemac-library.a $(CONTIKI_CPU)/hal/micro/cortexm3/e_stdio_intonly_thumb2.a
 endif
endif
#									`$(CC) -print-file-name=thumb2/libc.a` `$(CC) -print-file-name=thumb2/libgcc.a`

### Compiler definitions
ifdef IAR
CC       = iccarm
LD       = ilinkarm
AS       = iasmarm
AR       = iarchive
OBJCOPY  = ielftool
STRIP    = strip
ifndef DEBUG
OPTI = -Ohz --no_unroll
endif
CFLAGSNO = --endian=little --cpu=Cortex-M3 -e --diag_suppress Pa050 -D BOARD_HEADER=\"board.h\" \
			-D BOARD_MB851 -D "PLATFORM_HEADER=\"hal/micro/cortexm3/compiler/iar.h\""  -D CORTEXM3 \
			-D CORTEXM3_STM32W108 -D PHY_STM32W108XX -D DISABLE_WATCHDOG -D ENABLE_ADC_EXTENDED_RANGE_BROKEN \
			-D __SOURCEFILE__=\"$*.c\" -lC $(OBJECTDIR) \
			-I $(IAR_PATH)/arm/inc --dlib_config=DLib_Config_Normal.h

CFLAGS  += $(CFLAGSNO) $(OPTI)
AROPTS  = --create
ASFLAGS = -s+ -w+ --cpu Cortex-M3 -L$(OBJECTDIR)
LDFLAGS += --redirect _Printf=_PrintfSmall --redirect _Scanf=_ScanfSmall --map=contiki-$(TARGET).map
 ifndef COFFEE
  LDFLAGS+= --config $(CONTIKI_CPU)/hal/micro/cortexm3/stm32w108/iar-cfg.icf
 endif
OBJOPTS = --bin

else
# GCC
CC	 = arm-none-eabi-gcc
LD       = arm-none-eabi-gcc
AS	 = arm-none-eabi-gcc
NM	 = arm-none-eabi-nm
AR       = arm-none-eabi-ar
OBJCOPY  = arm-none-eabi-objcopy
STRIP    = arm-none-eabi-strip
SIZE     = arm-none-eabi-size
ifndef DEBUG
OPTI = -Os -ffunction-sections 
endif

CFLAGSNO = -mthumb -mcpu=cortex-m3 -fsigned-char -D "PLATFORM_HEADER=\"hal/micro/cortexm3/compiler/gnu.h\"" \
			-D BOARD_HEADER=\"board.h\" -g -Wall -Wno-strict-aliasing -mlittle-endian \
			-D BOARD_MB851   -D CORTEXM3 -D CORTEXM3_STM32W108 -D PHY_STM32W108XX -D DISABLE_WATCHDOG -D ENABLE_ADC_EXTENDED_RANGE_BROKEN \
			-D __SOURCEFILE__=\"$*.c\"
CFLAGS  += $(CFLAGSNO) $(OPTI)
ASFLAGS = -mthumb -mcpu=cortex-m3 -fsigned-char -c -g -Wall -Os -ffunction-sections \
	    -mlittle-endian -fshort-enums -x assembler-with-cpp -Wa,-EL
LDFLAGS += -mcpu=cortex-m3 \
	    -mthumb  \
	    -Wl,-T -Xlinker $(CONTIKI_CPU)/hal/micro/cortexm3/stm32w108/gnu.ld \
	    -Wl,-static \
			-u Default_Handler \
	    -nostartfiles \
	    -Wl,-Map -Xlinker contiki-$(TARGET).map
	    
ifndef ELF_LOADER
 # Do not use garbage collection when the elfloader is used.
 LDFLAGS += -Wl,--gc-sections
endif 
 
SIZEFLAGS = -A
OBJOPTS = -O binary

endif


ifndef IAR

ifdef COFFEE_ADDRESS
 COFFEE = 1
endif

# Default values for coffee section start.
ifndef COFFEE_ADDRESS
 COFFEE_ADDRESS = 0x8010c00
endif

ifeq ($(COFFEE),1)
 CONTIKI_TARGET_SOURCEFILES += cfs-coffee.c cfs-coffee-arch.c
 CFLAGS += -DCOFFEE_ADDRESS=$(COFFEE_ADDRESS)
 
 #If $make invokation passed starting address use phony target to force synchronization of source to .coffeefiles section
 #Warning: recompilation will not be forced if the starting address is then dropped, with dire consequences:
 # -->Source that uses COFFEE_FILES and read macros for conditional compilation will be left hanging!
 # -->Object modules that used .coffeefiles will overlap the .data section.
 # -->$make clean is safest.
#ifeq ($(origin COFFEE_ADDRESS), command line)
# ifeq ($(COFFEE_FILES), 2)      #safest to force recompilation even if eeprom address is changed, might have been switched from flash
   .PHONY : coffee
   coffee:
   $(OBJECTDIR)/cfs-coffee-arch.o    : coffee      #cfs-coffee-arch uses COFFEE_FILES, COFFEE_ADDRESS
   $(OBJECTDIR)/cfs-coffee.o         : coffee      #core routine requires recompilation

else
 # Coffee starts at the end of the flash, before NVM section.
 COFFEE_ADDRESS = 0x801F400
endif

LDFLAGS+= -Wl,--section-start=.coffee=$(COFFEE_ADDRESS)

else #IAR

 ifeq ($(COFFEE),1)
  LDFLAGS+= --config $(CONTIKI_CPU)/hal/micro/cortexm3/stm32w108/iar-cfg-coffee.icf
 endif
 
endif




FLASHER = $(CONTIKI)/tools/stm32w/stm32w_flasher/linux/stm32w_flasher

# Check if we are running under Windows
ifdef OS
  ifneq (,$(findstring Windows,$(OS)))
  	FLASHER = $(CONTIKI)/tools/stm32w/stm32w_flasher/win/stm32w_flasher    
  endif   
endif


ifndef PORT
# Flash with jlink
FLASHEROPTS = -f -r
else
# Flash on serial port with on-board bootloader
FLASHEROPTS = -f -i rs232 -p $(PORT) -r
 ifdef BTM
#if already in bootloader mode
  FLASHEROPTS += -b
 endif 
endif
			

### Custom rules

OBJECTDIR = obj_$(TARGET)

ssubst = ${patsubst %.s,%.o,${patsubst %.s79,%.o,$(1)}}

CONTIKI_OBJECTFILES += ${addprefix $(OBJECTDIR)/,${call ssubst, $(STM32W_S)}}

vpath %.s79 $(CONTIKI_CPU)/hal/micro/cortexm3
vpath %.s $(CONTIKI_CPU)/hal/micro/cortexm3


ifdef IAR
# Check if we are in cygwin environment, so we must have paths like /cygdrive/c/... (checking TERM doesn't always work.)
ifneq (,$(findstring cygdrive,$(shell pwd)))
 ${info Cygwin detected.}
 SEDCOMMAND = sed -e '1s,\($(OBJECTDIR)\\$*\)\.o: \(.\):,\1.o : /cygdrive/\l\2,g' -e '1!s,\($(OBJECTDIR)\\$*\)\.o: \(.\):, /cygdrive/\l\2,g' -e 's,\\\([^ ]\),/\1,g' -e 's,$$, \\,' -e '$$s, \\$$,,' < $(@:.o=.P) > $(@:.o=.d)
else
 SEDCOMMAND = sed -e '1s,\($(OBJECTDIR)\\$*\)\.o:,\1.o : ,g' -e '1!s,\($(OBJECTDIR)\\$*\)\.o:, ,g' -e 's,\\\([^ ]\),/\1,g' -e 's,$$, \\,' -e '$$s, \\$$,,' < $(@:.o=.P) > $(@:.o=.d)
endif


CUSTOM_RULE_C_TO_OBJECTDIR_O = 1
$(OBJECTDIR)/%.o: %.c
	$(CC) $(CFLAGS) $< --dependencies=m $(@:.o=.P) -o $@
	@$(SEDCOMMAND); rm -f $(@:.o=.P)
	@$(FINALIZE_DEPENDENCY)
	
CUSTOM_RULE_C_TO_CO = 1
%.co: %.c
	$(CC) $(CFLAGS) -DAUTOSTART_ENABLE $< -o $@
else #IAR

CUSTOM_RULE_C_TO_CE = 1
%.ce: %.c
	$(CC) $(CFLAGS) -fno-merge-constants -fno-function-sections -DAUTOSTART_ENABLE -c $< -o $@
	$(STRIP) --strip-unneeded -g -x $@

CUSTOM_RULE_LINK = 1

.PHONY: symbols.c symbols.h
ifdef CORE
ifeq ($(wildcard $(CORE)),)
 ${error $(CORE) doesn't exist}
endif
symbols.c:
	$(NM) $(CORE) | awk -f $(CONTIKI)/tools/mknmlist > symbols.c	
else
symbols.c symbols.h:
	@$(CONTIKI)/tools/make-empty-symbols
endif

%.$(TARGET): %.co $(PROJECT_OBJECTFILES) $(PROJECT_LIBRARIES) contiki-$(TARGET).a $(OBJECTDIR)/symbols.o
	$(LD) $(LDFLAGS) $(TARGET_STARTFILES) ${filter-out %.a,$^} -Wl,-\( ${filter %.a,$^} $(TARGET_LIBFILES) -Wl,-\) -o $@
	@echo >> contiki-$(TARGET).map
	@$(SIZE) $(SIZEFLAGS) $@ >> contiki-$(TARGET).map

#%.$(TARGET): %.co $(PROJECT_OBJECTFILES) $(PROJECT_LIBRARIES) $(CONTIKI_OBJECTFILES)
#	$(LD) $(LDFLAGS) $(TARGET_STARTFILES) ${filter-out %.a,$^} ${filter %.a,$^} $(TARGET_LIBFILES) -o $@
#	@echo "\n" >> contiki-$(TARGET).map
#	@$(SIZE) $(SIZEFLAGS) $@ >> contiki-$(TARGET).map


endif #IAR

$(OBJECTDIR)/%.o: %.s79
	$(AS) $(ASFLAGS) -o $@ $<
	
$(OBJECTDIR)/%.o: %.s
	$(AS) $(ASFLAGS) -o $@ $<	
	
%.bin: %.$(TARGET)
	$(OBJCOPY) $(OBJOPTS) $< $@ 
	
%.flash: %.bin
	$(FLASHER) $(FLASHEROPTS) $<