#-*-Makefile-*- vim:syntax=make
#$Id: pxa27x.rules,v 1.11 2008/06/12 23:25:01 kusy Exp $

define STM32_HELP

 STM32 extras:

   debug    : compile with minimal optimization and debug symbols
   debugopt : compile with debug symbols

 Programmer extras:

   openocd  : Use openocd to install

endef
HELP += $(STM_HELP)

GAS = arm-none-eabi-gcc -c # This ensures .c and .s compiled object are compatible
OBJCOPY = arm-none-eabi-objcopy 
OBJDUMP = arm-none-eabi-objdump
SET_ID = tos-set-symbols
XDB_SYMBOL_EXTRACT = dwarf2bd
NCC = ncc
LIBS = -lm -lvectors-stm32 -lstm32fw -lstm32-usbserial
AR = arm-none-eabi-ar
ARFLAGS = cr


AMADDR = ActiveMessageAddressC\$$addr
BUILDDIR ?= build/$(PLATFORM)
MAIN_EXE = $(BUILDDIR)/main.exe
MAIN_BIN = $(BUILDDIR)/main.bin
INSTALL_BIN = $(MAIN_BIN).out$(if $(NODEID),-$(NODEID),)
PLATFORM_DIR = $(TOSDIR)/platforms/emote
CHIP_DIR = $(TOSDIR)/chips/stm32
LIBRARY_DIRS = -L$(PLATFORM_DIR)/vectors -L$(PLATFORM_DIR) -L$(CHIP_DIR)/fwlib -L$(CHIP_DIR)/usb-serial
INCLUDE_DIRS = -I$(PLATFORM_DIR)
#ASSEMBLY_FILES += $(PLATFORM_DIR)/mmu_table.s $(PLATFORM_DIR)/util.s 
#ASSEMBLY_OBJS =  $(BUILDDIR)/asms.o
LIBRARY_OBJS  =  $(PLATFORM_DIR)/vectors/stm32-vector.o

OPTFLAGS ?= -O3 -g
CFLAGS += -mcpu=cortex-m3 -mthumb -g
PFLAGS += -Wall -Wshadow $(NESC_FLAGS)
PFLAGS += -target=$(PLATFORM) -fnesc-cfile=$(BUILDDIR)/app.c
PFLAGS += $(LIBRARY_DIRS)
ifdef MSG_SIZE
PFLAGS += -DTOSH_DATA_LENGTH=$(MSG_SIZE)
endif
ifdef DEFAULT_LOCAL_GROUP
PFLAGS += -DDEFINED_TOS_AM_GROUP=$(DEFAULT_LOCAL_GROUP)
endif

LDFLAGS += $(INCLUDE_DIRS) $(LIBRARY_DIRS)

DEFAULT_PROGRAM ?= openocd


BUILDLESS_DEPS += bytes

# Use the 'if' function instead of the 'ifdef' construct because ifdef freaks
# out with call in there.  I don't know why.
$(if $(PROGRAM),,$(call TOSMake_include,stm32/$(DEFAULT_PROGRAM).extra))

# Build storage file if volumes.xml present
ifneq ($(wildcard $(VOLUME_FILE)), )
build_storage: $(BUILDDIR)/StorageVolumes.h

exe0: build_storage

VOLUME_ALLOCATOR_FLAGS ?= 
$(BUILDDIR)/StorageVolumes.h: $(VOLUME_FILE)
	$(VOLUME_ALLOCATOR) $(VOLUME_ALLOCATOR_FLAGS) $(PLATFORMDIR) <$(VOLUME_FILE) >$@ || rm -f $@

PFLAGS += -I$(BUILDDIR)
else

build_storage: 

endif

ifndef BUILD_DEPS
  ifeq ($(filter $(BUILDLESS_DEPS),$(GOALS)),)
    BUILD_DEPS = bin bytes $(POST_BUILD_EXTRA_DEPS)
  endif
endif

setid: FORCE
	@cmd () { echo "$$@"; $$@; }; if [ x = x$(NODEID) ]; then cmd $(OBJCOPY) --output-target=binary $(MAIN_EXE) $(INSTALL_BIN); else cmd $(SET_ID) --objcopy $(OBJCOPY) --objdump $(OBJDUMP) --target binary $(MAIN_EXE) $(INSTALL_BIN) TOS_NODE_ID=$(NODEID) $(AMADDR)=$(NODEID); fi


bin: exe FORCE
	@cmd () { echo "$$@"; $$@; }; if [ "${PROGRAM}" = "xflash" ]; then $(XDB_SYMBOL_EXTRACT) $(MAIN_EXE); fi

exe: exe0 bytes FORCE
	@:

#exe0: builddir asms $(BUILD_EXTRA_DEPS) FORCE
exe0: builddir library $(BUILD_EXTRA_DEPS) FORCE
	@echo "    compiling $(COMPONENT) to a $(PLATFORM) binary"
	$(NCC) -o $(MAIN_EXE) $(OPTFLAGS) $(PFLAGS) $(CFLAGS) $(WIRING_CHECK_FLAGS) $(COMPONENT).nc $(LIBS) $(LDFLAGS) $(ASSEMBLY_OBJS) $(LIBRARY_OBJS)
ifdef WIRING_CHECK_FILE
	@nescc-wiring $(WIRING_CHECK_FILE)
endif
	@echo "    compiled $(COMPONENT) to $(MAIN_EXE)"

builddir: FORCE
	mkdir -p $(BUILDDIR)

bytes: FORCE
	@$(OBJDUMP) -h $(MAIN_EXE) | perl -ne '$$b{$$1}=hex $$2 if /^\s*\d+\s*\.(text|data|bss)\s+(\S+)/; END { printf("%16d bytes in ROM\n%16d bytes in RAM\n",$$b{text}+$$b{data},$$b{data}+$$b{bss}); }'

asms: 
	$(GAS) $(ASSEMBLY_FILES) -o $(BUILDDIR)/asms.o 

library:
	cd $(PLATFORM_DIR)/vectors; make;
	cd $(CHIP_DIR)/fwlib; make;
	cd $(CHIP_DIR)/usb-serial; make;
