# $Id: Makefile.cooja,v 1.23 2008/10/05 15:43:09 fros4943 Exp $

## The COOJA Simulator Contiki platform Makefile
##
## This makefile should normally never be called directly, but
## rather from inside the COOJA simulator.
## The purpose of this file is to compile a shared library that
## can be loaded into the Java part of COOJA.

ifndef WINDIR
  ifdef OS
    ifneq (,$(findstring Windows,$(OS)))
      WINDIR := Windows
    endif
  endif
endif

### Check input COOJA parameters

ifndef CONTIKI
  $(error CONTIKI not defined!)
endif

### Assuming quickstart if no type ID set
ifndef TYPEID
QUICKSTART=1
endif

### Quickstart simulator
ifdef QUICKSTART

# Check that target file exists
have_file := $(wildcard $(MAKECMDGOALS).c)
ifeq ($(strip $(have_file)),)
$(error Quick-start error. Can't find file "$(MAKECMDGOALS).c")
endif

# Create COOJA JAR rule
$(CONTIKI)/tools/cooja/dist/cooja.jar:
	@echo "Creating COOJA Java archive..."
	(cd $(CONTIKI)/tools/cooja && ant jar)

# Quickstart rule
$(MAKECMDGOALS): $(CONTIKI)/tools/cooja/dist/cooja.jar
	java -jar $(CONTIKI)/tools/cooja/dist/cooja.jar -quickstart=$(MAKECMDGOALS).c -contiki=$(CONTIKI)

endif ## QUICKSTART

OUTPUT_DIR = obj_cooja
LIBFILE = $(OUTPUT_DIR)/$(TYPEID).library
ARFILE = $(OUTPUT_DIR)/$(TYPEID).a
MAPFILE = $(OUTPUT_DIR)/$(TYPEID).map
MAINFILE = $(OUTPUT_DIR)/$(TYPEID).co

### Define COOJA core interfaces
COOJA = $(CONTIKI)/platform/$(TARGET)
CONTIKI_TARGET_DIRS = . dev lib sys cfs net

COOJA_BASE	= simEnvChange.c irq.c cooja_mt.c cooja_mtarch.c

COOJA_INTFS	= beep.c button-sensor.c ip.c leds-arch.c moteid.c \
		    pir-sensor.c rs232.c vib-sensor.c \
		    clock.c log.c radio-sensor.c cfs-cooja.c

CORE_FILES = random.c sensors.c leds.c serial.c symbols.c

CONTIKI_TARGET_SOURCEFILES = \
$(COOJA_BASE) $(COOJA_INTFS) $(CORE_FILES) $(PROJECT_SOURCEFILES)

CONTIKI_SOURCEFILES += $(CONTIKI_TARGET_SOURCEFILES)

.SUFFIXES:

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

### Compiler arguments
CFLAGSNO = $(EXTRA_CC_ARGS) -Wall -g -I/usr/local/include
CFLAGS   = $(CFLAGSNO)

### Define custom targets
REDEF_PRINTF=1
$(LIBFILE): $(MAINFILE) $(PROJECT_OBJECTFILES) $(ARFILE)
ifdef SYMBOLS
	@echo Generating symbols
	# Recreate symbols file and relink with final memory layout (twice)
	${CONTIKI}/tools/make-symbols-nm $(LIBFILE)
	$(CC) $(CFLAGS) -c symbols.c -o $(OBJECTDIR)/symbols.o
	$(LINK_COMMAND_1) $^ $(LINK_COMMAND_2)
	${CONTIKI}/tools/make-symbols-nm $(LIBFILE)
	$(CC) $(CFLAGS) -c symbols.c -o $(OBJECTDIR)/symbols.o
endif ## SYMBOLS
	
ifdef REDEF_PRINTF
	@echo Redefining printf
	-$(foreach OBJ,$^, objcopy --redefine-sym printf=log_printf $(OBJ); )		
	-$(foreach OBJ,$^, objcopy --redefine-sym puts=log_puts $(OBJ); )		
	-$(foreach OBJ,$^, objcopy --redefine-sym putchar=log_putchar $(OBJ); )		
endif ## REDEF_PRINTF
	
	$(LINK_COMMAND_1) $^ $(LINK_COMMAND_2)

$(ARFILE): ${addprefix $(OBJECTDIR)/, $(CONTIKI_SOURCEFILES:.c=.o)}
	$(AR_COMMAND_1) $^ $(AR_COMMAND_2)

symbols.c:
	# Create initial symbol files if not existing
	${CONTIKI}/tools/make-empty-symbols