ifndef ROOT
ROOT := $(dir $(lastword $(MAKEFILE_LIST)))..
endif

CCPATH = /usr/local/bin/
COMMON = ./gr_common
BUILD  = ./gr_build

OBJFILES = ./gr_sketch.o $(COMMON)/intvect.o $(COMMON)/lowlevel.o 
LIBFILES = $(COMMON)/lib/libc.a $(COMMON)/lib/libg.a $(COMMON)/lib/libgcc.a $(COMMON)/lib/libm.a $(COMMON)/lib/librxduino.a $(COMMON)/lib/libsim.a $(COMMON)/lib/libstdc++.a $(COMMON)/lib/libsupc++.a $(COMMON)/lib/libtkdnhal.a $(COMMON)/lib/libtkdnip.a 
CCINC = -I$(BUILD) -I$(COMMON) -I$(COMMON)/include -I$(COMMON)/include/rxduino -I$(COMMON)/include/tkdnhal -I$(COMMON)/lib 
CPPINC = -I$(BUILD) -I$(COMMON) -I$(COMMON)/include -I$(COMMON)/include/rxduino -I$(COMMON)/include/tkdnhal -I$(COMMON)/lib 
TARGET = sketch
CC  = $(CCPATH)rx-elf-gcc -Wall -g -O2 $(CCINC) $(MRUBY_INC)
CPP = $(CCPATH)rx-elf-gcc -Wall -g -O2 $(CPPINC)$(MRUBY_INC)
AS  = $(CCPATH)rx-elf-as 
LNK = $(CCPATH)rx-elf-ld
#CNV = $(CCPATH)rx-elf-objcopy --srec-forceS3 --srec-len 32 -O srec
CNV = $(CCPATH)rx-elf-objcopy -O binary
DMP = $(CCPATH)rx-elf-objdump
OBJS = $(COMMON)/gstart.o $(OBJFILES) $(LIBFILES) 
LFLAGS = -L$(COMMON)/lib/ -lrxduino -lstdc++ -lsupc++ -lc -lsim -lgcc -lm -ltkdnhal -nostartfiles
MAKEFILE = makefile
ROMSCRIPT=$(COMMON)/gr_sakura.gsi

make = make --no-print-directory 

################# mruby --
MRUBY_ROOT = $(ROOT)/mruby-master
MRUBY_EXCEPT1 = \
  $(MRUBY_ROOT)/src/dump.c \
  $(MRUBY_ROOT)/src/codegen.c 
#  $(MRUBY_ROOT)/src/sprintf.c  

TMP_MRUBY_SOURCES = \
  $(filter-out $(MRUBY_EXCEPT1),$(wildcard $(MRUBY_ROOT)/src/*.c)) \
  $(MRBLIB)

MRBLIB = $(MRUBY_ROOT)/build/host/mrblib/mrblib.c

#  $(wildcard $(MRUBY_ROOT)/ext/ecrobot/*.c)

USER_CLIB = mrubylib.c
USER_RLIB = mrubylib.rbtmp

MRUBY_SOURCES = $(TMP_MRUBY_SOURCES) $(USER_CLIB)

MRUBY_INC =-I$(MRUBY_ROOT)/include 

# mruby compiler
ifeq ($(OS),Windows_NT)
MRBC = $(MRUBY_ROOT)/bin/mrbc.exe
else
MRBC = $(MRUBY_ROOT)/bin/mrbc
endif

CP = cp

MRUBY_OBJECT = $(subst .c,.o,$(MRUBY_SOURCES))

ALLOBJS = $(MRUBY_OBJECT) $(OBJS) 


################# mruby --

.PHONY: all clean

all:	$(USER_CLIB) $(MRBC) $(MRUBY_OBJECT) mrblib rom
# Compile C source from merged mruby source
$(USER_CLIB) : $(USER_RLIB) $(MRBC)
	$(MRBC) -Bmrubylib -o$(USER_CLIB) $(USER_RLIB);

$(MRBC) : $(MRUBY_ROOT)/src/opcode.h $(MRUBY_ROOT)/src/codegen.c $(MRUBY_ROOT)/src/parse.y
	$(MAKE) -C $(MRUBY_ROOT)/tools/mrbc $(MRBC_MAKE_FLAGS)

# merge mruby sources
TARGET_RUBY_SOURCES = \
        $(wildcard *.rb)
$(USER_RLIB) : $(TARGET_RUBY_SOURCES)
	cat $(TARGET_RUBY_SOURCES) > $@

rom:	$(OBJS) $(MAKEFILE) $(ROMSCRIPT) 
	$(LNK) -Map $(BUILD)/$(TARGET).map $(ALLOBJS) -T $(ROMSCRIPT) $(LFLAGS) -o $(TARGET).elf
	$(CNV) $(TARGET).elf  $(TARGET).bin
	rm -f *.o
	rm -f $(TARGET).elf

#gstart.o:	gstart.s
#	$(AS) -o gstart.o gstart.s

.c.o: 
	@echo compile c source
	$(CC) -DHAVE_STRING_H -DDISABLE_GEMS $(CFLAGS) -c $< -o $@

.cpp.o:
	@echo compile cpp source
	$(CPP) $(CFLAGS) -c $< -o $@

mrblib : $(MRBLIB)
	$(CP)   $(MRBLIB) .

clean:

	rm -f $(USER_CLIB) $(USER_RLIB) $(TARGET).bin $(MRUBY_OBJECT)
