################################################################################
#
# aml_tvserver
#
################################################################################
OUT_DIR ?= .
BASEDIR := $(shell basename $(CURDIR))
OBJDIR  ?= $(OUT_DIR)
PROTO_DIR := $(OBJDIR)/$(BASEDIR)
LOCAL_PATH = $(shell pwd)
LDFLAGS += -Wl,--no-as-needed -lstdc++ -lpthread -lz -ldl -lrt -L$(STAGING_DIR)/usr/lib
CFLAGS += -Wall -Wno-unknown-pragmas -Wno-format -Wno-format-security\
          -O3 -fexceptions -fnon-call-exceptions -D_GNU_SOURCE \
          -I$(STAGING_DIR)/usr/include -DHAVE_AUDIO

LDFLAGS += -lbinder -llog -lubootenv -lmediahal_resman

$(info VIDEO_BACKEND=$(VIDEO_BACKEND))
ifeq ($(VIDEO_BACKEND),wayland)
    CFLAGS += -DUSE_WAYLAND=1 -I$(PROTO_DIR)
	LDFLAGS += -lwayland-client -ldrm
else ifeq ($(VIDEO_BACKEND),displayadapter)
    CFLAGS += -DUSE_VIDEOCOMPOSER=1
	LDFLAGS += -ldisplayadapter
else
    CFLAGS += -DUSE_AMVIDEO=1
endif

LDFLAGS += -L $(OUT_DIR)/

################################################################################
# libtv.so - src files
################################################################################
tv_SRCS  = \
	$(LOCAL_PATH)/libtv/tvutils/CFile.cpp \
	$(LOCAL_PATH)/libtv/tvutils/ConfigFile.cpp \
	$(LOCAL_PATH)/libtv/tvutils/CSerialPort.cpp \
	$(LOCAL_PATH)/libtv/tvutils/TvConfigManager.cpp \
	$(LOCAL_PATH)/libtv/tvutils/tvutils.cpp \
	$(LOCAL_PATH)/libtv/tvutils/zepoll.cpp \
	$(LOCAL_PATH)/libtv/tvutils/CMsgQueue.cpp \
	$(LOCAL_PATH)/libtv/CHDMIRxManager.cpp \
	$(LOCAL_PATH)/libtv/CTv.cpp \
	$(LOCAL_PATH)/libtv/CTvin.cpp \
	$(LOCAL_PATH)/libtv/CTvDevicesPollDetect.cpp \
	$(LOCAL_PATH)/libtv/CTvAudio.cpp \
	$(LOCAL_PATH)/libtv/CAmVideo.cpp \
	$(LOCAL_PATH)/libtv/CVpp.cpp \
	$(LOCAL_PATH)/libtv/CVrr.cpp \
	$(LOCAL_PATH)/common/CTvLog.cpp \
	$(LOCAL_PATH)/libtv/panel/CTvPanel.cpp \
	$(LOCAL_PATH)/libtv/panel/CTvTconlessFileLoad.cpp \
	$(LOCAL_PATH)/libtv/CTvResman.cpp \
	$(LOCAL_PATH)/libtv/CTvDisplayadapter.cpp \
	$(LOCAL_PATH)/libtv/CTvWayland.cpp \
	$(NULL)

ifeq ($(VIDEO_BACKEND),wayland)
  tv_SRCS += \
    $(PROTO_DIR)/xdg-shell-protocol.c \
    $(PROTO_DIR)/linux-dmabuf-unstable-v1-protocol.c \
    $(PROTO_DIR)/viewporter-protocol.c \
    $(PROTO_DIR)/fullscreen-shell-unstable-v1-protocol.c \
    $(PROTO_DIR)/weston-direct-display-protocol.c
endif

tvcommon_HEADERS = \
	-I$(LOCAL_PATH)/common \
	-I$(LOCAL_PATH)/include \
	$(NULL)

################################################################################
# libtvclient.so - src files
################################################################################
tvclient_SRCS  = \
	$(LOCAL_PATH)/client/TvClient.cpp \
	$(LOCAL_PATH)/client/TvClientWrapper.cpp \
	$(LOCAL_PATH)/common/CTvLog.cpp \
	$(NULL)

################################################################################
# tvservice - src files
################################################################################
tvservice_SRCS  = \
	$(LOCAL_PATH)/service/main_tvservice.cpp \
	$(LOCAL_PATH)/service/TvService.cpp \
	$(NULL)

################################################################################
# tvtest - src files
################################################################################
tvtest_SRCS  = \
	$(LOCAL_PATH)/test/main_tvtest.c \
	$(NULL)

# ---------------------------------------------------------------------
#  Build rules
BUILD_TARGETS = libtvclient.so libtv.so tvservice tvtest
BUILD_TARGETS_FULLPATH := $(patsubst %, $(OUT_DIR)/%, $(BUILD_TARGETS))

.PHONY: all install clean

libtvclient.so: $(tvclient_SRCS)
	$(CC) $(CFLAGS) $(LDFLAGS) -shared -fPIC $(tvcommon_HEADERS) \
	-o $(OUT_DIR)/$@ $^ $(LDLIBS)

libtv.so: $(tv_SRCS)
	$(CC) $(CFLAGS) $(LDFLAGS) -shared -fPIC $(tvcommon_HEADERS) \
	-I$(LOCAL_PATH)/libtv/tvutils -I$(LOCAL_PATH)/libtv/panel \
	-laudio_client -o $(OUT_DIR)/$@ $^ $(LDLIBS)

tvservice: $(tvservice_SRCS) libtv.so
	$(CXX) $(CXXFLAGS) $(CFLAGS) $(LDFLAGS) $(tvcommon_HEADERS) \
	-I$(LOCAL_PATH)/libtv -I$(LOCAL_PATH)/libtv/tvutils -I$(LOCAL_PATH)/libtv/panel \
	-L$(LOCAL_PATH) -ltv -laudio_client -o $(OUT_DIR)/$@ $(filter-out %.so,$^) $(LDLIBS)

tvtest: $(tvtest_SRCS) libtvclient.so
	$(CC) $(CFLAGS) $(tvcommon_HEADERS) -L$(LOCAL_PATH) \
	-ltvclient $(LDFLAGS) -o $(OUT_DIR)/$@ $(filter-out %.so,$^) $(LDLIBS)

all: $(BUILD_TARGETS)

clean:
	rm -f $(OUT_DIR)/*.o $(BUILD_TARGETS_FULLPATH)
	rm -rf $(STAGING_DIR)/usr/include/tvclient
	rm -rf $(STAGING_DIR)/usr/lib/libtvclient.so
	rm -rf $(TARGET_DIR)/usr/include/tvclient
	rm -rf $(TARGET_DIR)/usr/lib/libtvclient.so
	rm -rf $(TARGET_DIR)/usr/lib/libtv.so
	rm -rf $(TARGET_DIR)/usr/bin/tvtest
	rm -rf $(TARGET_DIR)/usr/bin/tvservice

install:
	install -m 0644 $(OUT_DIR)/libtvclient.so $(TARGET_DIR)/usr/lib
	install -m 0644 $(OUT_DIR)/libtv.so $(TARGET_DIR)/usr/lib/
	install -m 0755 $(OUT_DIR)/tvservice $(TARGET_DIR)/usr/bin/
	install -m 0755 $(OUT_DIR)/tvtest $(TARGET_DIR)/usr/bin/
create-dir:
	mkdir -p $(PROTO_DIR)

define gen_wayland_client
$(PROTO_DIR)/$3-protocol.c : $(STAGING_DIR)/usr/share/wayland-protocols/$1/$2/$3.xml $(PROTO_DIR)/$3-client-protocol.h | create-dir
	wayland-scanner private-code $$< $$@
$(PROTO_DIR)/$3-client-protocol.h : $(STAGING_DIR)/usr/share/wayland-protocols/$1/$2/$3.xml | create-dir
	wayland-scanner client-header $$< $$@
endef

WESTON_DD_XML := $(LOCAL_PATH)/protocol/weston-direct-display.xml
$(PROTO_DIR)/weston-direct-display-client-protocol.h: $(WESTON_DD_XML) | create-dir
	wayland-scanner client-header $< $@

$(PROTO_DIR)/weston-direct-display-protocol.c: $(WESTON_DD_XML) $(PROTO_DIR)/weston-direct-display-client-protocol.h | create-dir
	wayland-scanner private-code $< $@

$(eval $(call gen_wayland_client,stable,xdg-shell,xdg-shell))
$(eval $(call gen_wayland_client,unstable,linux-dmabuf,linux-dmabuf-unstable-v1))
$(eval $(call gen_wayland_client,stable,viewporter,viewporter))
$(eval $(call gen_wayland_client,unstable,fullscreen-shell,fullscreen-shell-unstable-v1))