# hyprtile-remoteviewer - simple C Makefile
#
# Usage:
#   make
#   make WAYLAND_WLR=1
#   make clean
#   make install PREFIX=/usr/local

PREFIX ?= /usr/local
CC ?= cc
PKG_CONFIG ?= pkg-config

BUILD_DIR ?= build
TARGET := $(BUILD_DIR)/hyprtile-remoteviewer
PROTO_DIR := protocols
GEN_PROTO_DIR := $(BUILD_DIR)/protocols
WAYLAND_SCANNER ?= wayland-scanner


CSTD ?= -std=c11
WARN ?= -Wall -Wextra -Wpedantic
OPT ?= -O2 -g
CPPFLAGS ?=
CFLAGS ?= $(CSTD) $(WARN) $(OPT)
LDFLAGS ?=

COMMON_SRCS := \
	src/main.c \
	src/log.c \
	src/host.c \
	src/window_share_hyprland.c \
	src/capture.c \
	src/audio_capture.c \
	src/av_muxer.c \
	src/capture_dummy.c \
	src/stream.c \
	src/stream_stdout.c \
	src/stream_tcp.c \
	src/vp9_encoder.c \
	src/ffmpeg_vp9_vaapi_encoder.c \
	src/encoder.c \
	src/input_protocol.c \
	src/input_tcp_server.c \
	src/web_server.c \
	src/signaling_stub.c \
	../app_i18n.c \
	../app_json.c

WAYLAND_WLR ?= 0

ifeq ($(WAYLAND_WLR),1)
  WLR_PROTO_SRC := \
    $(GEN_PROTO_DIR)/wlr-screencopy-unstable-v1-protocol.c \
    $(GEN_PROTO_DIR)/wlr-virtual-pointer-unstable-v1-protocol.c \
    $(GEN_PROTO_DIR)/virtual-keyboard-unstable-v1-protocol.c
  SRCS := $(COMMON_SRCS) src/capture_wayland_wlr.c src/input_pointer_wlr.c $(WLR_PROTO_SRC)
  CPPFLAGS += -DHTR_EXPERIMENTAL_WAYLAND_WLR=1
  PKG_DEPS := vpx wayland-client openssl xkbcommon
else
  SRCS := $(COMMON_SRCS) src/capture_wayland_stub.c src/input_pointer_stub.c
  CPPFLAGS += -DHTR_EXPERIMENTAL_WAYLAND_WLR=0
  PKG_DEPS := vpx openssl
endif

CPPFLAGS += -Iinclude -I$(GEN_PROTO_DIR) -I.. -D_POSIX_C_SOURCE=200809L
CFLAGS += $(shell $(PKG_CONFIG) --cflags $(PKG_DEPS) 2>/dev/null)
LDLIBS += $(shell $(PKG_CONFIG) --libs $(PKG_DEPS) 2>/dev/null)

OBJS := $(SRCS:%.c=$(BUILD_DIR)/%.o)
DEPS := $(OBJS:.o=.d)

.PHONY: all clean install uninstall print-config check-deps protocols

all: check-deps $(TARGET)

check-deps:
	@$(PKG_CONFIG) --exists $(PKG_DEPS) || { \
		echo "Missing build dependencies: $(PKG_DEPS)" >&2; \
		echo "Install the development packages, e.g. libvpx-dev, libssl-dev and optionally wayland-client dev headers." >&2; \
		exit 1; \
	}


protocols: \
	$(GEN_PROTO_DIR)/wlr-screencopy-unstable-v1-client-protocol.h \
	$(GEN_PROTO_DIR)/wlr-screencopy-unstable-v1-protocol.c \
	$(GEN_PROTO_DIR)/wlr-virtual-pointer-unstable-v1-client-protocol.h \
	$(GEN_PROTO_DIR)/wlr-virtual-pointer-unstable-v1-protocol.c \
	$(GEN_PROTO_DIR)/virtual-keyboard-unstable-v1-client-protocol.h \
	$(GEN_PROTO_DIR)/virtual-keyboard-unstable-v1-protocol.c

$(GEN_PROTO_DIR)/%-client-protocol.h: $(PROTO_DIR)/%.xml
	@mkdir -p $(@D)
	$(WAYLAND_SCANNER) client-header $< $@

$(GEN_PROTO_DIR)/%-protocol.c: $(PROTO_DIR)/%.xml
	@mkdir -p $(@D)
	$(WAYLAND_SCANNER) private-code $< $@

$(TARGET): $(OBJS)
	@mkdir -p $(@D)
	$(CC) $(LDFLAGS) -o $@ $^ $(LDLIBS)

$(BUILD_DIR)/src/capture_wayland_wlr.o: src/capture_wayland_wlr.c $(GEN_PROTO_DIR)/wlr-screencopy-unstable-v1-client-protocol.h
	@mkdir -p $(@D)
	$(CC) $(CPPFLAGS) $(CFLAGS) -MMD -MP -c $< -o $@

$(BUILD_DIR)/src/input_pointer_wlr.o: src/input_pointer_wlr.c $(GEN_PROTO_DIR)/wlr-virtual-pointer-unstable-v1-client-protocol.h $(GEN_PROTO_DIR)/virtual-keyboard-unstable-v1-client-protocol.h
	@mkdir -p $(@D)
	$(CC) $(CPPFLAGS) $(CFLAGS) -MMD -MP -c $< -o $@

$(BUILD_DIR)/%.o: %.c
	@mkdir -p $(@D)
	$(CC) $(CPPFLAGS) $(CFLAGS) -MMD -MP -c $< -o $@

install: $(TARGET)
	install -d $(DESTDIR)$(PREFIX)/bin
	install -m 0755 $(TARGET) $(DESTDIR)$(PREFIX)/bin/hyprtile-remoteviewer

uninstall:
	rm -f $(DESTDIR)$(PREFIX)/bin/hyprtile-remoteviewer

clean:
	rm -rf $(BUILD_DIR)

print-config:
	@echo "CC=$(CC)"
	@echo "WAYLAND_WLR=$(WAYLAND_WLR)"
	@echo "PKG_DEPS=$(PKG_DEPS)"
	@echo "CFLAGS=$(CFLAGS)"
	@echo "CPPFLAGS=$(CPPFLAGS)"
	@echo "LDFLAGS=$(LDFLAGS)"
	@echo "LDLIBS=$(LDLIBS)"

-include $(DEPS)
