GPP      ?= $(CROSS_PREFIX)g++
GCC      ?= $(CROSS_PREFIX)gcc
LIB_NAME :=
RT_ROOT  ?= ../../../runtime
RT_OUT   ?= ./output
OBJ_DIR  := ./obj
BIN_DIR  := $(RT_OUT)

KERNEL_DIR ?= compile_kernel/output/

INC      := -I. -I$(RT_ROOT)/api -I$(RT_ROOT)/include
LDFLAGS  := -L$(RT_ROOT)/output/lib
CPPFLAGS := -fPIC -O2 -Wall -fpermissive -std=c++0x
CFLAGS   := -fPIC -O2 -Wall

ifdef XDEBUG
	LDFLAGS += -lxpurt-debug
else
	LDFLAGS += -lxpurt
endif

# -ldl must behand -lxpurt
LDFLAGS += -lpthread -ldl

targets = $(patsubst %.cpp,$(BIN_DIR)/%,$(wildcard *.cpp))
kernels = $(patsubst %.c,$(OBJ_DIR)/%.o,$(wildcard $(KERNEL_DIR)/*.c))
wrappers= $(patsubst %.c,$(OBJ_DIR)/%.o,$(wildcard wrapper_*.c))
$(warning $(wrappers))

all: $(targets)

$(BIN_DIR)/%: $(OBJ_DIR)/%.o $(kernels) $(wrappers)
	$(GPP) $(INC) $(CPPFLAGS) -o $@ $^ $(LDFLAGS)

$(OBJ_DIR)/$(KERNEL_DIR)/%.o: $(KERNEL_DIR)/%.c dirmake
	$(GCC) -c $(INC) $(CFLAGS) -o $@ $<

$(OBJ_DIR)/%.o: %.cpp dirmake
	$(GPP) -c $(INC) $(CPPFLAGS) -o $@ $<
$(OBJ_DIR)/%.o: %.c dirmake
	$(GCC) -c $(INC) $(CFLAGS) -o $@ $<

dirmake:
	@mkdir -p $(BIN_DIR)
	@mkdir -p $(OBJ_DIR)
	@mkdir -p $(OBJ_DIR)/$(KERNEL_DIR)

clean:
	@rm -f $(targets)
	@rm -rf $(OBJ_DIR)
