ifndef CONTIKI
  $(error CONTIKI not defined! You must specify where CONTIKI resides!)
endif

OBJECTDIR = obj_$(TARGET)
CFLAGS += -DCONTIKI_TARGET=$(TARGET)

ifeq ($(TARGET),)
  -include Makefile.target
  ifeq ($(TARGET),)
    $(warning TARGET not defined, using native target)
    TARGET=native
  else
    $(warning using saved target '$(TARGET)')
  endif
endif

usage:
	@echo "make MAKETARGETS... [TARGET=(TARGET)] [savetarget] [targets]"

targets:
	@ls -1 $(CONTIKI)/platform | grep -v CVS

savetarget:
	-@rm -f Makefile.target
	@echo >Makefile.target "TARGET = $(TARGET)"

ifeq (${wildcard $(OBJECTDIR)},)
DUMMY := ${shell mkdir $(OBJECTDIR)}
endif

include $(CONTIKI)/core/net/rime/Makefile.rime
SYSTEM  = process.c procinit.c service.c autostart.c
THREADS = mt.c
LIBS    = memb.c timer.c list.c etimer.c #crtk.c
CFS     = cfs.c cfs-ram.c
CTK     = ctk.c
UIP     = uip.c uiplib.c resolv.c tcpip.c psock.c hc.c uip-split.c \
          uip-fw.c uip-fw-service.c uipbuf.c uip_arp.c uiplib.c tcpdump.c \
          uip-neighbor.c uip-udp-packet.c rawpacket-udp.c
NET     = $(UIP) uaodv.c uaodv-rt.c

CTKVNC  = $(CTK) ctk-vncserver.c libconio.c vnc-server.c vnc-out.c \
          ctk-vncfont.c
CTKTERM = $(CTK) libconio.c ctk-term.c ctk-term-in.c ctk-term-out.c \
          ctk-termtelnet.c

CONTIKIFILES = $(SYSTEM) $(CFS) $(LIBS) $(NET) $(DHCP)

CONTIKI_SOURCEFILES += $(CONTIKIFILES)

CONTIKIDIRS = ${addprefix $(CONTIKI)/core/,dev lib net net/rime sys \
                 cfs ctk lib/ctk loader . }

CONTIKI_OBJECTFILES = ${addprefix $(OBJECTDIR)/,$(CONTIKI_SOURCEFILES:.c=.o)}

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

### Include application makefiles

ifdef APPS
  APPDIRS += $(addprefix $(CONTIKI)/apps/, $(APPS))
  APPINCLUDES = $(foreach APP, $(APPS), $(CONTIKI)/apps/$(APP)/Makefile.$(APP))
  -include $(APPINCLUDES)
  CONTIKI_SOURCEFILES += $(APP_SOURCES) $(DSC_SOURCES)
endif

### Include target makefile (TODO Unsafe?)
include $(CONTIKI)/platform/$(TARGET)/Makefile.$(TARGET)

### Automatic dependency generation

ifneq ($(MAKECMDGOALS),clean)
-include $(addprefix $(OBJECTDIR)/,$(CONTIKI_SOURCEFILES:.c=.d) \
				   $(PROJECT_SOURCEFILES:.c=.d))
endif


clean:
	rm -f *~ *core core *.srec \
	*.lst *.map \
        *.cprg *.bin *.data contiki*.a *.firmware core-labels.S *.ihex *.ini \
        *.ce *.co
	-rm -rf $(OBJECTDIR)

ifndef CUSTOM_RULE_C_TO_CE
%.ce: %.c
	$(CC) $(CFLAGS) -DAUTOSTART_ENABLE -c $< -o $@
	$(STRIP) --strip-unneeded -g -x $@
endif

ifndef CUSTOM_RULE_C_TO_OBJECTDIR_O
$(OBJECTDIR)/%.o: %.c
	$(CC) $(CFLAGS) -c $< -o $@
endif

ifndef CUSTOM_RULE_C_TO_O
%.o: %.c
	$(CC) $(CFLAGS) -c $< -o $@
endif

ifndef CUSTOM_RULE_C_TO_CO
%.co: %.c
	$(CC) $(CFLAGS) -DAUTOSTART_ENABLE -c $< -o $@
endif

ifndef AROPTS
  AROPTS = rcf
endif

ifndef CUSTOM_RULE_ALLOBJS_TO_TARGETLIB
contiki-$(TARGET).a: $(CONTIKI_OBJECTFILES)
	$(AR) $(AROPTS) $@ $^
endif

ifndef CCDEP
  CCDEP = $(CC)
endif
ifndef CDEPFLAGS
  CDEPFLAGS = $(CFLAGS)
endif

ifndef CUSTOM_RULE_C_TO_OBJECTDIR_D
$(OBJECTDIR)/%.d: %.c
	@set -e; rm -f $@; \
	$(CCDEP) -MM $(CDEPFLAGS) $< > $@.$$$$; \
	sed 's,\($*\)\.o[ :]*,$(OBJECTDIR)/\1.o $@ : ,g' < $@.$$$$ > $@; \
	rm -f $@.$$$$
endif

# The line below is needed so that GNU make does not remove the
# generated file.
.PRECIOUS: %.$(TARGET)

ifndef LD
  LD = $(CC)
endif

ifndef CUSTOM_RULE_LINK
%.$(TARGET):	%.co $(PROJECT_OBJECTFILES) $(PROJECT_LIBRARIES) contiki-$(TARGET).a
	$(LD) $(LDFLAGS) $(TARGET_STARTFILES) $(filter-out %.a,$^) $(filter %.a,$^) $(TARGET_LIBFILES) -o $@
endif

# The target below looks weird, but I had to add the @ to avoid complaints
# from GNU make about "*** No rule to make target `XXX'.  Stop."
%: %.$(TARGET)
	@