GPP       ?= $(CROSS_PREFIX)g++
AR        := $(CROSS_PREFIX)ar
LIB_NAME  := libxpurt
RT_ROOT   ?= ../
RT_OUT    ?= ../output
OBJ_DIR   := ./obj
LIB_DIR   := $(RT_OUT)/lib
SO_DIR    := $(RT_OUT)/so
BIN_DIR   := $(RT_OUT)/bin
KL2_RT_EN ?= 0
INC       := -I. -I$(RT_ROOT)/include
CFLAGS    := -fPIC -O2 -Werror -std=c++0x -fvisibility=hidden

ifeq ($(KL2_SOC_EN), 1)
	CFLAGS += -DKL2_SOC
endif

ifdef XPU_UNITEST
	CFLAGS += -DXPU_UNITEST
endif

ifdef CROSS_SYSROOT
	CFLAGS += --sysroot=$(CROSS_SYSROOT)
endif

CFLAGS += -DENABLE_CGPU

#CFLAGS += -DXPURT_VERSION_MAJOR=$(__XPURT_VERSION_MAJOR)
#CFLAGS += -DXPURT_VERSION_MINOR=$(__XPURT_VERSION_MINOR)
#CFLAGS += -DXPURT_COMMIT=\"$(__XPURT_COMMIT)\"

LDFLAGS  := -ldl -lpthread \
            -lstdc++ \
            -Wl,--no-undefined \
            -specs=$(RT_ROOT)/script/linker.specs

ifeq ($(KL2_RT_EN), 1)
	LDFLAGS += -DKL2_RT -lssl -lcrypto
	#LDFLAGS += -DKL2_RT -I/usr/local/openssl/include -L/usr/local/openssl/lib -lssl -lcrypto
endif


targets = $(LIB_DIR)/$(LIB_NAME).a \
          $(LIB_DIR)/$(LIB_NAME)-ut.a \
          $(LIB_DIR)/$(LIB_NAME)-debug.a \
          $(LIB_DIR)/$(LIB_NAME)-debug-ut.a \
          $(SO_DIR)/$(LIB_NAME).so \
          $(SO_DIR)/$(LIB_NAME)-debug.so

all: $(targets)

$(LIB_DIR)/$(LIB_NAME).a: $(patsubst %.cpp, $(OBJ_DIR)/%.o, $(wildcard *.cpp))
	$(AR) -r -o $@ $^

$(LIB_DIR)/$(LIB_NAME)-ut.a: $(patsubst %.cpp, $(OBJ_DIR)/%-ut.o, $(wildcard *.cpp))
	$(AR) -r -o $@ $^

$(LIB_DIR)/$(LIB_NAME)-debug.a: $(patsubst %.cpp, $(OBJ_DIR)/%-debug.o, $(wildcard *.cpp))
	$(AR) -r -o $@ $^

$(LIB_DIR)/$(LIB_NAME)-debug-ut.a: $(patsubst %.cpp, $(OBJ_DIR)/%-debug-ut.o, $(wildcard *.cpp))
	$(AR) -r -o $@ $^

$(SO_DIR)/$(LIB_NAME).so: $(patsubst %.cpp, $(OBJ_DIR)/%.o, $(wildcard *.cpp))
	$(GPP) $(INC) $(CFLAGS) -shared -o $@ $^ $(LDFLAGS) -Wl,-soname,$(LIB_NAME).so

$(SO_DIR)/$(LIB_NAME)-debug.so: $(patsubst %.cpp, $(OBJ_DIR)/%-debug.o, $(wildcard *.cpp))
	$(GPP) $(INC) $(CFLAGS) -shared -o $@ $^ $(LDFLAGS) -Wl,-soname,$(LIB_NAME)-debug.so

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

$(OBJ_DIR)/%-ut.o: %.cpp dirmake
	$(GPP) -c $(INC) $(CFLAGS) -DXPU_UNITEST -o $@  $< $(LDFLAGS)

$(OBJ_DIR)/%-debug.o: %.cpp dirmake
	$(GPP) -c $(INC) $(CFLAGS) -DDEBUG_XPU_RUNTIME -o $@  $< $(LDFLAGS)

$(OBJ_DIR)/%-debug-ut.o: %.cpp dirmake
	$(GPP) -c $(INC) $(CFLAGS) -DDEBUG_XPU_RUNTIME -DXPU_UNITEST -o $@  $< $(LDFLAGS)

dirmake:
	@mkdir -p $(LIB_DIR)
	@mkdir -p $(SO_DIR)
	@mkdir -p $(OBJ_DIR)

clean:
	rm -f $(OBJ_DIR)/*.o Makefile.bak
	rm -rf $(OBJ_DIR)
	rm -f $(targets)

rebuild: clean build
