# $Id: Makefile.msp430,v 1.35 2011/01/19 07:30:31 adamdunkels Exp $

ifdef nodeid
CFLAGS += -DNODEID=$(nodeid)
endif

.SUFFIXES:

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

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

ifndef CONTIKI_CPU_FAM_DIR
 ifneq (,$(findstring msp430f1,$(MCU)))
  CONTIKI_CPU_FAM_DIR = f1xxx
 endif
endif
ifndef CONTIKI_CPU_FAM_DIR
 ifneq (,$(findstring msp430f5,$(MCU)))
  CONTIKI_CPU_FAM_DIR = f5xxx
 endif
endif
ifndef CONTIKI_CPU_FAM_DIR
 ifneq (,$(findstring msp430f2,$(MCU)))
  CONTIKI_CPU_FAM_DIR = f2xxx f1xxx
 endif
endif
ifndef CONTIKI_CPU_FAM_DIR
 ${error Unhandled MSP430 family: "$(MCU)"}
endif

CONTIKI_CPU_DIRS = $(CONTIKI_CPU_FAM_DIR) . dev

MSP430     = msp430.c flash.c clock.c leds.c leds-arch.c \
             watchdog.c lpm.c mtarch.c rtimer-arch.c
UIPDRIVERS = me.c me_tabs.c slip.c crc16.c
ELFLOADER  = elfloader.c elfloader-msp430.c symtab.c

CONTIKI_TARGET_SOURCEFILES += $(MSP430) \
                              $(SYSAPPS) $(ELFLOADER) \
                              $(UIPDRIVERS)

CONTIKI_SOURCEFILES        += $(CONTIKI_TARGET_SOURCEFILES)

### Compiler definitions

ifdef WERROR
CFLAGSWERROR=-Werror
endif

ifdef IAR
CC	 = icc430
LD       = xlink
AS       = iasm430
AR       = xar
OBJCOPY  = ielftool
STRIP    = strip

ifndef IAR_PATH
# This works with cygwin...
IAR_BIN_PATH := $(shell dirname "`which $(CC)`")
IAR_PATH_C := $(shell dirname "$(IAR_BIN_PATH)")
IAR_PATH := $(shell cygpath -m "$(IAR_PATH_C)")
endif

CFLAGS += --diag_suppress=Pa050 --silent

#defaults on the MSP430X core include file here (xlfn.h)
ifndef CFLAGSNO
CFLAGSNO = --dlib_config "$(IAR_PATH)/LIB/DLIB/dl430xlfn.h" $(CFLAGSWERROR)
# CFLAGSNO = --dlib_config $(IAR_PATH)/LIB/DLIB/dl430xlfn.h -Ohz --multiplier=32 --multiplier_location=4C0 --hw_workaround=CPU40 --core=430X $(CFLAGSWERROR) --data_model large --double=32
endif

LDFLAGSNO += -B -l contiki-$(TARGET).map -s __program_start
# Stack and heap size in hex
ifndef IAR_STACK_SIZE
 IAR_STACK_SIZE=300
endif
# Set this to a positive number (hex) to enable malloc/free with IAR compiler
ifndef IAR_DATA16_HEAP_SIZE
 IAR_DATA16_HEAP_SIZE=100
endif
ifndef IAR_DATA20_HEAP_SIZE
 IAR_DATA20_HEAP_SIZE=0
endif
LDFLAGSNO += -D_STACK_SIZE=$(IAR_STACK_SIZE) -D_DATA16_HEAP_SIZE=$(IAR_DATA16_HEAP_SIZE) -D_DATA20_HEAP_SIZE=$(IAR_DATA20_HEAP_SIZE)

CUSTOM_RULE_C_TO_O = 1
%.o: %.c
	$(TRACE_CC)
	$(Q)$(CC) $(CFLAGS) $< -o $@

define FINALIZE_CYGWIN_DEPENDENCY
sed -e 's/ \([A-Z]\):\\/ \/cygdrive\/\L\1\//' -e 's/\\/\//g' \
	    <$(@:.o=.P) >$(@:.o=.d); \
rm -f $(@:.o=.P)
endef

CUSTOM_RULE_C_TO_OBJECTDIR_O = 1
$(OBJECTDIR)/%.o: %.c | $(OBJECTDIR)
	$(TRACE_CC)
	$(Q)$(CC) $(CFLAGS) $< --dependencies=m $(@:.o=.P) -o $@
ifeq ($(HOST_OS),Windows)
	@$(FINALIZE_CYGWIN_DEPENDENCY)
endif

CUSTOM_RULE_C_TO_CO = 1
%.co: %.c
	$(TRACE_CC)
	$(Q)$(CC) $(CFLAGS) -DAUTOSTART_ENABLE $< -o $@

AROPTS = -o

else

GCC      = 1
CC       = msp430-gcc
LD       = msp430-gcc
AS       = msp430-as
AR       = msp430-ar
NM       = msp430-nm
OBJCOPY  = msp430-objcopy
STRIP    = msp430-strip
BSL      = msp430-bsl

# From version 4.6.x, mspgcc does not support generic MCU identifiers such as
# msp430x1611 in contrast to msp430f1611
ifndef CC_MCU
 ifndef MSPGCC_VERSION
  MSPGCC_VERSION := ${shell $(CC) -dumpversion}
 endif
endif
ifndef CC_MCU
 ifneq (,$(findstring 4.4.,$(MSPGCC_VERSION)))
  CC_MCU := ${subst msp430f,msp430x,$(MCU)}
 endif
endif
ifndef CC_MCU
 ifneq (,$(findstring 3.2.,$(MSPGCC_VERSION)))
  CC_MCU := ${subst msp430f,msp430x,$(MCU)}
 endif
endif
ifndef CC_MCU
 CC_MCU := $(MCU)
endif

### Checks for compiler version to enable 20-bit support
ifndef IAR
ifneq (,$(findstring 4.7.,$(shell msp430-gcc -dumpversion)))
ifdef CPU_HAS_MSP430X
  TARGET_MEMORY_MODEL ?= medium
  CFLAGS += -mmemory-model=$(TARGET_MEMORY_MODEL)
  CFLAGS += -ffunction-sections -fdata-sections -mcode-region=far
  LDFLAGS += -mmemory-model=$(TARGET_MEMORY_MODEL) -Wl,-gc-sections
endif
endif
endif

ifndef CFLAGSNO
CFLAGSNO = -Wall -mmcu=$(CC_MCU) $(CFLAGSWERROR)
endif
CFLAGS  += -Os -fno-strict-aliasing
LDFLAGS += -mmcu=$(CC_MCU) -Wl,-Map=contiki-$(TARGET).map

### These flags can reduce the code size and RAM usage with up to 10%
ifeq ($(SMALL),1)
CFLAGS += -ffunction-sections
# CFLAGS += -fdata-sections
LDFLAGS += -Wl,--gc-sections,--undefined=_reset_vector__,--undefined=InterruptVectors,--undefined=_copy_data_init__,--undefined=_clear_bss_init__,--undefined=_end_of_init__
endif # SMALL

endif # IAR

CFLAGS  += $(CFLAGSNO)

PROJECT_OBJECTFILES += ${addprefix $(OBJECTDIR)/,$(CONTIKI_TARGET_MAIN:.c=.o)}

### Compilation rules

%-stripped.o: %.c
	$(CC) $(CFLAGS) -c $< -o $@
	$(STRIP) --strip-unneeded -g -x $@

%.cm: %.co
	$(LD) -i -r --unresolved-symbols=ignore-in-object-files -mmsp430x149 -o $@ $^
	$(STRIP) --strip-unneeded -g -x $@

%-stripped.o: %.o
	$(STRIP) --strip-unneeded -g -x -o $@ $<

%.o: ${CONTIKI_TARGET}/loader/%.S
	$(TRACE_AS)
	$(Q)$(AS) -o $(notdir $(<:.S=.o)) $<

%.firmware:	%.${TARGET}
	mv $< $@

ifdef IAR
%.ihex: %.co $(PROJECT_OBJECTFILES) $(PROJECT_LIBRARIES) contiki-$(TARGET).a
	$(LD) $(LDFLAGSNO) -Fintel-extended $(TARGET_STARTFILES) ${filter-out %.a,$^} ${filter %.a,$^} $(TARGET_LIBFILES) -o $@
else
%.ihex: %.$(TARGET)
	$(OBJCOPY) $^ -O ihex $@
endif

$(CONTIKI)/tools/mspsim/build.xml:
	@echo '----------------'
	@echo 'Could not find the MSPSim build file. Did you run "git submodule update --init"?'
	@echo '----------------'

$(CONTIKI)/tools/mspsim/mspsim.jar: $(CONTIKI)/tools/mspsim/build.xml
	(cd $(CONTIKI)/tools/mspsim && ant jar)

%.mspsim:	%.${TARGET} ${CONTIKI}/tools/mspsim/mspsim.jar
	java -jar ${CONTIKI}/tools/mspsim/mspsim.jar -platform=${TARGET} $<

mspsim-maptable:	contiki-${TARGET}.map
	java -classpath ${CONTIKI}/tools/mspsim/mspsim.jar se.sics.mspsim.util.MapTable $<

core-labels.o: core.${TARGET}
	${CONTIKI}/tools/msp430-make-labels core.${TARGET} > core-labels.S
	$(AS) -o $@ core-labels.S
#	cp core-labels.o app/

core-globals.o: core.${TARGET}
	${CONTIKI}/tools/msp430-make-globals core.${TARGET} > core-globals.S
	$(AS) -o $@ core-globals.S

loader-init.o: ${CONTIKI_TARGET}/loader/loader-init.S
	$(AS) -o $(notdir $(<:.S=.o)) $<
# 	cp loader-init.o build-app/

ifdef CORE
.PHONY: symbols.c symbols.h
symbols.c:
	$(NM) $(CORE) | awk -f $(CONTIKI)/tools/mknmlist > symbols.c
else
symbols.c symbols.h:
	cp ${CONTIKI}/tools/empty-symbols.c symbols.c
	cp ${CONTIKI}/tools/empty-symbols.h symbols.h
endif