#################################################################
#           Makefile for arm-linux-gcc                          #
#Author:JingJing                                                #
#Date:2013-10-21                                                  #
#Company:Linksprite                                             #
#################################################################


#define Target
TARGET=snake

#define cpu
CPU=cortex-a8

#define arch
ARCH=armv7-a

#define fpu
FPU=vfpv3-fp16
FLOAT_ABI = hard


ARDUINO_PATH = /usr/share/arduino/hardware/arduino/pcduino
#define include files path
INCLUDE = -I ./Header_Files
INCLUDE += -I /usr/include
INCLUDE += -I $(ARDUINO_PATH)/cores/arduino
INCLUDE += -I $(ARDUINO_PATH)/variants/sunxi



#define source filse path
SRC_PATH = ./Source_Files
ARDUINO_SRC_PATH = $(ARDUINO_PATH)/cores/arduino
CSRC =$(wildcard $(SRC_PATH)/*.c)
CSRC +=$(wildcard $(ARDUINO_SRC_PATH)/*.c)
CPPSRC =$(wildcard $(SRC_PATH)/*.cpp)
CPPSRC +=$(wildcard $(ARDUINO_SRC_PATH)/*.cpp)

#define search path
VPATH = $(SRC_PATH):$(ARDUINO_SRC_PATH) 



#define library path
LIBPATH = -L /usr/lib/arm-linux-gnueabihf

#define library that will to be need by link
LIB = -lncurses

#defien object files path
OBJDIR =./Objs

#define object files
OBJS=$(patsubst %.c,$(OBJDIR)/%.o,$(notdir $(CSRC)))
OBJS+=$(patsubst %.cpp,$(OBJDIR)/%.o,$(notdir $(CPPSRC)))

#define Options
OPT= -Os

#define cpu flags
CPUFLAGS = -mcpu=$(CPU)
CPUFLAGS += -march=$(ARCH)
CPUFLAGS += -mfpu=$(FPU)
CPUFLAGS += -mfloat-abi=$(FLOAT_ABI)
CPUFLAGS += -mlittle-endian


#define Ccompile flags
CFLAGS= $(CPUFLAGS)
CFLAGS+= $(INCLUDE)
CPPFLAGS+= $(OPT)
CFLAGS+= -Wall

#define CPP compile flags
CPPFLAGS= $(CPUFLAGS)
CPPFLAGS+= $(INCLUDE)
CPPFLAGS+= $(OPT)
CPPFLAGS+= -Wall


#define link flags
LDFLAGS = $(CPUFLAGS) 
LDFLAGS += -shared-libgcc
LDFLAGS += -pthread 
LDFLAGS += $(LIBPATH)
LDFLAGS += $(LIB)



#define message out put
MSG_ERRORS_NONE = Errors: none
MSG_BEGIN                = -----------------begin-------------------
MSG_END                  = ------------------end--------------------
MSG_LINKING              = ----------------Linking:-----------------
MSG_BIN_GEN              = ---------------Converting:---------------
MSG_COMPILING            = --------------Compiling :---------------
MSG_CLEANING             = ------------Cleaning project:------------
MSG_CREATING_LIBRARY     = ------------Creating library:------------


#define Tool chain
CC=arm-linux-gnueabihf-gcc
CPP=arm-linux-gnueabihf-g++
LD=arm-linux-ld

REMOVE = rm -f
REMOVEDIR = rm -rf
####################################
#   $@ ----->target file           #    
#   $^ ----->all dependence files  #
#   $< ----->first dependce file   #
####################################
all: begin compile $(TARGET) end

begin:
	@echo $(MSG_BEGIN)

end:
	@echo $(MSG_END)

compile:
	@echo $(MSG_COMPILING)


$(TARGET):$(OBJS) 
	@echo $(MSG_LINKING)
	$(CPP)  $^ -o  $@ $(LDFLAGS)

$(OBJDIR)/%.o: %.c 
	$(CC) -c $(CFLAGS) $^ -o $@ 

$(OBJDIR)/%.o: %.cpp 
	$(CPP) -c $(CPPFLAGS) $^ -o $@ 
        


 .PHONY : clean 
clean : 
	@echo $(MSG_CLEANING)
	$(REMOVE) *.o
	$(REMOVE) $(OBJDIR)/*.o
	$(REMOVE) $(TARGET)
	

# Create object files directory
$(shell mkdir $(OBJDIR)/ 2>/dev/null)
