OUTPUT_FILES := libccdataserver_client.so libccdataserver_client.a ccdataserver
TEST_FILES := ccds_debug
PLUGIN_FILES := libdebug_plugin.so

DEBUG_ASAN := 0

ifeq ($(DEBUG_ASAN),1)
ASAN_CFLAGS := -fsanitize=address -fno-omit-frame-pointer -fsanitize-recover=address
ASAN_LDFLAGS := -lasan
endif

CFLAGS	:= -Wall -g -O0 -fPIC $(ASAN_CFLAGS)
LDFLAGS := $(ASAN_LDFLAGS)
OUT_DIR ?= ./build
TARGET_DIR ?= $(OUT_DIR)


LIBDSCLIENT_SRCS := \
	client/dataserver_client.c\

LIBDSCLIENT_OBJS := $(patsubst %.c,$(OUT_DIR)/%.o,$(LIBDSCLIENT_SRCS))

DATASERVER_SRCS := \
	server/dataserver_rb.c\
	server/dataserver_reader.c\
	server/dataserver_reader_vbi.c\
	server/dataserver_reader_random.c\
	server/dataserver_reader_userdata.c\
	server/dataserver_process.c\
	server/dataserver_utils.c\
	server/dataserver_inner.c\
	server/dataserver_socketserver.c\
	server/main.c\

DATASERVER_OBJS := $(patsubst %.c,$(OUT_DIR)/%.o,$(DATASERVER_SRCS))
DATASERVER_CFLAGS := -Iclient -Iserver
DATASERVER_LDFLAGS := -lpthread -ldl -lrt
DATASERVER_CFLAGS += -DDS_SUPPORT_IP
DATASERVER_CFLAGS += -DSUPPORT_SHM

TEST_SRCS := \
	client/test/debug_client.c\

TEST_OBJS := $(patsubst %.c,$(OUT_DIR)/%.o,$(TEST_SRCS))
TEST_CFLAGS := -Iclient
TEST_LDFLAGS := -L$(OUT_DIR) -lccdataserver_client -lpthread

PLUGIN_SRCS :=\
	server/plugin/debug_plugin.c\

PLUGIN_OBJS := $(patsubst %.c,$(OUT_DIR)/%.o,$(PLUGIN_SRCS))
PLUGIN_CFLAGS := -Iserver
PLUGIN_LDFLAGS :=

all: $(OUTPUT_FILES) $(TEST_FILES) $(PLUGIN_FILES)

$(OUT_DIR)/%.o: %.c
	mkdir -p $(dir $@)
	$(CC) -c -o $@ $< $(CFLAGS)

$(OUT_DIR)/server/%.o: server/%.c
	mkdir -p $(dir $@)
	$(CC) -c -o $@ $< $(CFLAGS) $(DATASERVER_CFLAGS)

libccdataserver_client.so: $(LIBDSCLIENT_OBJS)
	$(CC) -shared -o $(OUT_DIR)/$@ $^ $(LDFLAGS) $(DSCLIENT_LDFLAGS)

libccdataserver_client.a: $(LIBDSCLIENT_OBJS)
	$(AR) rsc $(OUT_DIR)/$@ $^

ccdataserver: $(DATASERVER_OBJS)
	$(CC) -o $(OUT_DIR)/$@ $^ $(LDFLAGS) $(DATASERVER_LDFLAGS)

$(OUT_DIR)/client/test/%.o: client/test/%.c
	mkdir -p $(dir $@)
	$(CC) -c -o $@ $< $(CFLAGS) $(TEST_CFLAGS)

ccds_debug: $(TEST_OBJS) libccdataserver_client.so
	$(CC) -o $(OUT_DIR)/$@ $(TEST_OBJS) $(LDFLAGS) $(TEST_LDFLAGS)

libdebug_plugin.so: $(PLUGIN_OBJS)
	$(CC) -shared -o $(OUT_DIR)/$@ $^ $(LDFLAGS) $(PLUGIN_LDFLAGS)

install: $(OUTPUT_FILES)
	install -d $(TARGET_DIR)/usr/include/ccdatabase
	install -d $(TARGET_DIR)/usr/lib
	install -d $(TARGET_DIR)/usr/bin
	install -m 0644 ./client/dataserver_client.h $(TARGET_DIR)/usr/include/ccdatabase
	install -m 0644 ./client/dataserver_message.h $(TARGET_DIR)/usr/include/ccdatabase
	install -m 0644 ./client/dataserver_cmd_resp.h $(TARGET_DIR)/usr/include/ccdatabase
	install -m 0644 ./client/dataserver_event.h $(TARGET_DIR)/usr/include/ccdatabase
	install -m 0644 ./client/dataserver_data_vbi.h $(TARGET_DIR)/usr/include/ccdatabase
	install -m 0644 ./client/dataserver_data_userdata.h $(TARGET_DIR)/usr/include/ccdatabase
	install -m 0644 $(OUT_DIR)/libccdataserver_client.a $(TARGET_DIR)/usr/lib
	install -m 0755 $(OUT_DIR)/libccdataserver_client.so $(TARGET_DIR)/usr/lib
	install -m 0755 $(OUT_DIR)/ccdataserver $(TARGET_DIR)/usr/bin
	install -m 0755 $(OUT_DIR)/ccds_debug $(TARGET_DIR)/usr/bin

clean:
	find $(OUT_DIR) -name \*.o -exec rm -f {} \;

.PHONY: all install clean
