#-*-Makefile-*- vim:syntax=make
#$Id: avr.rules,v 1.28 2009/12/02 17:48:21 razvanm Exp $

define AVR_HELP

 AVR extras:

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

 Programmer options:

   dapa         : (default) use parallel port programmer
   mib510,<dev> : use MIB510/MIB520 serial port programming board at port <dev>
   eprb,<host>	: use EPRB (MIB600) at hostname <host>
   avrisp,<dev> : use AVRISP serial programmer at port <dev>

   The dev or host parameter for the programmer option need not be specified,
   in which case it is expected to be defined as in an environment variable of
   the same name in all caps (such as MIB510, EPRB, or AVRISP).

endef
HELP += $(AVR_HELP)

ifdef MAKE_DEPUTY_FLAG
        NCC_SAFE_TINYOS_FLAGS = -DSAFE_TINYOS -I$(TOSDIR)/lib/safe -fnesc-deputy -fnesc-deputy-args='-I$(TOSDIR)/lib/safe/include --FLIDs=build/$(PLATFORM)/flids.txt --envmachine -DSAFE_TINYOS --nolib '
else
        NCC_SAFE_TINYOS_FLAGS =
endif

OBJCOPY = avr-objcopy
OBJDUMP = avr-objdump
SET_ID = tos-set-symbols
PROGRAMMER ?= uisp
NCC = ncc
LIBS = -lm

# Use __ as the separator - requires nesC 1.2.9 or later
ifneq ($(filter sim,$(GOALS)),sim)
ifneq ($(filter sim-sf,$(GOALS)),sim-sf)
	PFLAGS += -fnesc-separator=__
endif
endif
AMADDR = ActiveMessageAddressC__addr
BUILDDIR ?= build/$(PLATFORM)
MAIN_EXE = $(BUILDDIR)/main.exe
MAIN_SREC = $(BUILDDIR)/main.srec
MAIN_IHEX = $(BUILDDIR)/main.ihex
INSTALL_SREC = $(MAIN_SREC).out$(if $(NODEID),-$(NODEID),)
VOLUMEFILE = volumes-at45db.xml
VOLUME_ALLOCATOR ?= tos-storage-at45db
VOLUME_ALLOCATOR_FLAGS ?=

PFLAGS += -Wall -Wshadow $(NESC_FLAGS)
PFLAGS += -target=$(PLATFORM) -fnesc-cfile=$(BUILDDIR)/app.c -board=$(SENSORBOARD)
ifdef MSG_SIZE
PFLAGS += -DTOSH_DATA_LENGTH=$(MSG_SIZE)
endif
ifdef DEFAULT_LOCAL_GROUP
PFLAGS += -DDEFINED_TOS_AM_GROUP=$(DEFAULT_LOCAL_GROUP)
endif

AVRGCCMAJOR = $(shell avr-gcc -v 2>&1 | grep "gcc version" | sed -n 's/gcc version \([2-5]\)\.\([0-9]\)\.\([0-9]\).*/\1/p')
ifeq ($(AVRGCCMAJOR),4)
  PFLAGS += --param max-inline-insns-single=100000
else
  PFLAGS += -finline-limit=100000
endif

ifeq ($(PROGRAMMER),avrdude)
  ifeq ($(findstring Darwin, $(shell uname)), Darwin)
    AVRDUDE_CONF ?= /opt/local/etc/avrdude.conf
  endif
  AVRDUDE_CONF ?= /etc/avrdude/avrdude.conf
  ifeq ($(shell [ -f /bin/cygwin1.dll ] && echo cygwin),cygwin)
    AVRDUDE_CONF := $(shell cygpath -m $(AVRDUDE_CONF))
  endif
  PROGRAMMER_EXTRA_FLAGS += -C$(AVRDUDE_CONF)
#  PROGRAMMER_EXTRA_FLAGS += -v -v
endif

ifdef DEFAULT_PROGRAM_AVR
DEFAULT_PROGRAM = $(DEFAULT_PROGRAM_AVR)
endif
DEFAULT_PROGRAM ?= dapa



BUILDLESS_DEPS += bytes 

ifndef NOWIRING
include $(TINYOS_MAKE_PATH)/wiring.extra
endif

# 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,avr/$(DEFAULT_PROGRAM).extra))

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

exe0: build_storage

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

PFLAGS += -I$(BUILDDIR)
else

build_storage:

endif

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

setid: FORCE
	@cmd () { echo "$$@"; $$@; }; if [ x = x$(NODEID) ]; then cmd cp $(MAIN_SREC) $(INSTALL_SREC); else cmd $(SET_ID) $(MAIN_SREC) $(INSTALL_SREC) TOS_NODE_ID=$(NODEID) $(AMADDR)=$(NODEID) ; fi

delsetid: FORCE
	rm -f $(subst .srec.,.exe.,$(INSTALL_SREC)) $(INSTALL_SREC) 

srec: exe FORCE
	$(OBJCOPY) --output-target=srec $(MAIN_EXE) $(MAIN_SREC)

tos_buildinfo: ihex build_buildinfo FORCE
  @:
  
tosimage: ihex build_tosimage FORCE
	@:

ihex: exe FORCE
	$(OBJCOPY) --output-target=ihex $(MAIN_EXE) $(MAIN_IHEX)

exe: exe0 bytes FORCE
	@:

exe0: builddir $(BUILD_EXTRA_DEPS) FORCE
	@echo "    compiling $(COMPONENT) to a $(PLATFORM) binary"
	$(NCC) -o $(MAIN_EXE) $(NCC_SAFE_TINYOS_FLAGS) $(OPTFLAGS) $(PFLAGS) $(CFLAGS) $(WIRING_CHECK_FLAGS) $(COMPONENT).nc $(LIBS) $(LDFLAGS)
ifdef WIRING_CHECK_FILE
	@nescc-wiring $(WIRING_CHECK_FILE)
endif
ifdef STACK_CHECK
	@echo
	@-tos-ramsize $(PLATFORM) $(MAIN_EXE)
	@echo
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}); }'

