
OUTPUT = output/lib
OUTPUT_INCLUDE = output/include
        
#找到tools文件下的所有目录
ALL_DIRS = $(shell find -L ./tools -maxdepth 1 -type d -printf '%P\n' | sed 1d | xargs -I{} basename {})
# $(info $(ALL_DIRS))

LIBDB_APP_VERSION:="1.0.6"
LIBDB_UTILS_VERSION:="1.0.0"
LIBDB_HARDWARE_VERSION:="1.0.0"

TARGET=libdb_control.so
SUB_TARGET_UTILS=libbmser_utils.so
SUB_TARGET_HARDWARE=libbmser_hardware.so

ifdef WITH_DEBUG
  CFLAGS += -g
else
  CFLAGS += -DNDEBUG -g
endif

CUR_DIR=.
CFLAGS += -Werror -Wall -Wno-cpp -fPIC -D_GNU_SOURCE -O0
#SOURCES=$(shell find -L -name "*.c")
SOURCES=${CUR_DIR}/tools/db_control/*.c 

UTILS_SOURCE=${CUR_DIR}/tools/cjson/*.c \
             ${CUR_DIR}/tools/clua/*.c \
             ${CUR_DIR}/tools/utility/*.c \
			 ${CUR_DIR}/tools/mqtt/*.c \
			 ${CUR_DIR}/tools/utils/*.c \
			 ${CUR_DIR}/tools/sqlite_api/*.c \
			 ${CUR_DIR}/tools/dev/*.c \
			 ${CUR_DIR}/tools/toolks/fifo.c\
			 ${CUR_DIR}/tools/toolks/timer.c\
			 ${CUR_DIR}/tools/toolks/bmser_ring/*.c\
			 ${CUR_DIR}/tools/toolks/bmser_ring/port/*.c \
			 ${CUR_DIR}/tools/canrbus/*.c 

HADRWARE_SOURCE=${CUR_DIR}/tools/can/*.c \
		${CUR_DIR}/hal/serial/linux/*.c\
		${CUR_DIR}/hal/io/linux/*.c

INC_DIR= -I${CUR_DIR}\
	-I${CUR_DIR}/os_adp \
	-I${CUR_DIR}/tools/db_control \
	-I${CUR_DIR}/tools/mqtt \
	-I${CUR_DIR}/tools/dev \
	-I${CUR_DIR}/tools/utils \
	-I${CUR_DIR}/tools/utils/inc \
	-I${CUR_DIR}/tools/mosquitto \
	-I${CUR_DIR}/tools/cjson \
	-I${CUR_DIR}/tools/clua \
	-I${CUR_DIR}/tools/utility \
	-I${CUR_DIR}/tools/sqlite_api \
	-I${CUR_DIR}/tools/toolks/bmser_ring \
	-I${CUR_DIR}/tools/toolks/bmser_ring/port \
	-I${CUR_DIR}/tools/can\
	-I${CUR_DIR}/hal/serial\
	-I${CUR_DIR}/hal/io \
	-I${CUR_DIR}/tools/canrbus/inc \
	-I${CUR_DIR}/tools/canrbus

ifeq ($(BMSER_SW_PLATFORM), imx6ull)
INC_DIR+= -I$(STAGING_DIR)/usr/include
endif

ifeq ($(BMSER_SW_PLATFORM), imx6ull)	
LIB_DIR += -L$(STAGING_DIR)/usr/lib
endif

#cc编译需要自己在家目录上增加依赖库和头文件路径
ifeq ($(CC), cc)
LIB_DIR += -L$(HOME)/output/lib
INC_DIR += -I$(HOME)/output/include
endif

LDFLAGS += -lpthread -lsqlite3 -lmodbus -llua -lmosquitto -luv -lm
TARGET_LDFLAGS += ${LDFLAGS} -lbmser_utils -lbmser_hardware

ifeq ($(BMSER_SW_PLATFORM), imx6ull)
	LDFLAGS += -DBMSER_SW_PLATFORM_IMX6ULL
else
	LDFLAGS += -DBMSER_SW_PLATFORM_RK3568
endif

.PHONY: all clean output
all: output

$(SUB_TARGET_UTILS):
	$(CC) -shared $(CFLAGS) $(INC_DIR) $(LIB_DIR) -o $@ $(UTILS_SOURCE) $(LDFLAGS)

$(SUB_TARGET_HARDWARE):
	$(CC) -shared $(CFLAGS) $(INC_DIR) $(LIB_DIR) -o $@ $(HADRWARE_SOURCE)

$(TARGET): $(SUB_TARGET_UTILS) $(SUB_TARGET_HARDWARE)
	$(CC) -shared $(CFLAGS) $(INC_DIR) $(LIB_DIR) -o $(TARGET) $(SOURCES) $(TARGET_LDFLAGS) -DAPP_VERSION=\"$(USER_CONFIG_APP_VERSION)\"

output: $(SUB_TARGET_UTILS) $(SUB_TARGET_HARDWARE) $(TARGET)
	mkdir -p $(OUTPUT)
	mkdir -p $(OUTPUT_INCLUDE)
	$(foreach dir,$(ALL_DIRS),$(shell mkdir -p $(OUTPUT_INCLUDE)/$(dir)))
	mkdir -p $(OUTPUT_INCLUDE)/can
	mkdir -p $(OUTPUT_INCLUDE)/io
	mkdir -p $(OUTPUT_INCLUDE)/serial
	@cp ${CUR_DIR}/*.so $(OUTPUT)
	@cp ${CUR_DIR}/tools/db_control/*.h $(OUTPUT_INCLUDE)/db_control/
	@cp ${CUR_DIR}/tools/cjson/*.h $(OUTPUT_INCLUDE)/cjson/
	@cp ${CUR_DIR}/tools/mqtt/*.h $(OUTPUT_INCLUDE)/mqtt
	@cp ${CUR_DIR}/tools/dev/*.h $(OUTPUT_INCLUDE)/dev/
	@cp ${CUR_DIR}/tools/utility/*.h $(OUTPUT_INCLUDE)/utility
	@cp ${CUR_DIR}/tools/utils/*.h $(OUTPUT_INCLUDE)/utils
	@cp ${CUR_DIR}/tools/sqlite_api/*.h $(OUTPUT_INCLUDE)/sqlite_api
	@cp ${CUR_DIR}/tools/toolks/*.h $(OUTPUT_INCLUDE)/toolks
	@cp ${CUR_DIR}/tools/toolks/bmser_ring/*.h $(OUTPUT_INCLUDE)/toolks
	@cp ${CUR_DIR}/tools/can/*.h $(OUTPUT_INCLUDE)/can
	@cp ${CUR_DIR}/hal/io/*.h $(OUTPUT_INCLUDE)/io
	@cp ${CUR_DIR}/hal/serial/*.h $(OUTPUT_INCLUDE)/serial
	@cp ${CUR_DIR}/tools/canrbus/*.h $(OUTPUT_INCLUDE)/canrbus

clean:
	find . -name '*.o' -type f -print -exec rm -rf {} \;
	find . -name '*.a' -type f -print -exec rm -rf {} \;
	rm -f $(TARGET) $(SUB_TARGET_UTILS) $(SUB_TARGET_HARDWARE)
	rm -rf output
