# SPDX-FileCopyrightText: 2023-2026 Contributors to ddcutil-service <https://github.com/digitaltrails/ddcutil-service>
# SPDX-License-Identifier: GPL-2.0-or-later
#
# Makefile with portable install, dependency tracking, and full features.

# ------------------------------------------------------------
#  User-settable variables - override with env variables
# ------------------------------------------------------------
CC       ?= gcc
PREFIX   ?= $(HOME)/.local
OPT_LEVEL?= -Og

# Set DDCUTIL_DEV=yes to use a local development build of libddcutil
DDCUTIL_DEV ?= no
DDCUTIL_DIR ?= $(HOME)/Downloads/ddcutil-2.2.7-rc1

# ------------------------------------------------------------
#  Installation paths
# ------------------------------------------------------------
BIN_DIR     = $(PREFIX)/bin
SERVICES_DIR = $(PREFIX)/share/dbus-1/services
MAN_DIR     = $(PREFIX)/share/man
MAN1_DIR    = $(MAN_DIR)/man1
MAN7_DIR    = $(MAN_DIR)/man7

SERVICE_FILE = com.ddcutil.DdcutilService.service

# ------------------------------------------------------------
#  Compiler and linker flags
# ------------------------------------------------------------
# gio-2.0 (always needed)
CFLAGS_GIO   := $(shell pkg-config --cflags gio-2.0)
LDLIBS_GIO   := $(shell pkg-config --libs gio-2.0)

# ------------------------------------------------------------
# ddcutil – system options or local development options/paths
#-------------------------------------------------------------
ifeq ($(DDCUTIL_DEV), yes)
    CFLAGS_DDCUTIL  := -isystem $(DDCUTIL_DIR)/src/public
    LDLIBS_DDCUTIL  := -L $(DDCUTIL_DIR)/src/.libs -lddcutil
else
    CFLAGS_DDCUTIL  := $(shell pkg-config --cflags ddcutil)
    LDLIBS_DDCUTIL  := $(shell pkg-config --libs ddcutil)
endif

# Common flags
CFLAGS    += -g -std=gnu11 -Werror -Wall -Wformat-security $(OPT_LEVEL)
CFLAGS    += $(CFLAGS_GIO) $(CFLAGS_DDCUTIL)

# Dependency tracking (generates .d files)
DEPFLAGS   = -MMD -MP
CFLAGS    += $(DEPFLAGS)

LDFLAGS   +=
LDLIBS    += $(LDLIBS_GIO) $(LDLIBS_DDCUTIL)

# ------------------------------------------------------------
#  Source files and objects
# ------------------------------------------------------------
SERVICE_SRC = ddcutil-service.c
SERVICE_OBJ = $(SERVICE_SRC:.c=.o)
CLIENT_SRC  = ddcutil-client.c
CLIENT_OBJ  = $(CLIENT_SRC:.c=.o)

# Dependency files (generated by -MMD)
DEPS = $(SERVICE_OBJ:.o=.d) $(CLIENT_OBJ:.o=.d)

# ------------------------------------------------------------
#  Targets
# ------------------------------------------------------------
.PHONY: all
all: ddcutil-service ddcutil-client

$(SERVICE_OBJ): ddcutil-service-introspection-xml.h com.ddcutil.DdcutilService.xml

# Link the service
ddcutil-service: $(SERVICE_OBJ)
	$(CC) $(LDFLAGS) $^ $(LDLIBS) -o $@

# Link the client
ddcutil-client: $(CLIENT_OBJ)
	$(CC) $(LDFLAGS) $^ $(LDLIBS) -o $@

# Implicit rule builds .o from .c using $(CC) $(CFLAGS) -c

# Include dependency files (ignored if missing)
-include $(DEPS)

# ------------------------------------------------------------
#  Installation targets (with DESTDIR support)
# ------------------------------------------------------------
.PHONY: install
install: ddcutil-service $(SERVICE_FILE) ddcutil-service.1 ddcutil-service.7
	mkdir -p $(DESTDIR)$(SERVICES_DIR) $(DESTDIR)$(BIN_DIR)
	mkdir -p $(DESTDIR)$(MAN1_DIR) $(DESTDIR)$(MAN7_DIR)
	# Install and patch the DBus service file (portable sed, no -i)
	sed 's|/usr/bin/|$(BIN_DIR)/|' $(SERVICE_FILE) > $(SERVICE_FILE).tmp
	install -m 644 $(SERVICE_FILE).tmp $(DESTDIR)$(SERVICES_DIR)/$(SERVICE_FILE)
	rm -f $(SERVICE_FILE).tmp
	# Install the service binary
	install -m 755 ddcutil-service $(DESTDIR)$(BIN_DIR)/
	# Install man pages (they exist, so no conditional needed)
	install -m 644 ddcutil-service.1 $(DESTDIR)$(MAN1_DIR)/
	install -m 644 ddcutil-service.7 $(DESTDIR)$(MAN7_DIR)/

.PHONY: install-client
install-client: ddcutil-client ddcutil-client.1
	mkdir -p $(DESTDIR)$(BIN_DIR) $(DESTDIR)$(MAN1_DIR)
	install -m 755 ddcutil-client $(DESTDIR)$(BIN_DIR)/
	install -m 644 ddcutil-client.1 $(DESTDIR)$(MAN1_DIR)/

.PHONY: install-all
install-all: install install-client

.PHONY: uninstall
uninstall:
	rm -f $(DESTDIR)$(BIN_DIR)/ddcutil-service
	rm -f $(DESTDIR)$(BIN_DIR)/ddcutil-client
	rm -f $(DESTDIR)$(SERVICES_DIR)/$(SERVICE_FILE)
	rm -f $(DESTDIR)$(MAN1_DIR)/ddcutil-service.1
	rm -f $(DESTDIR)$(MAN7_DIR)/ddcutil-service.7
	rm -f $(DESTDIR)$(MAN1_DIR)/ddcutil-client.1

.PHONY: clean
clean:
	rm -f ddcutil-service ddcutil-client $(SERVICE_OBJ) $(CLIENT_OBJ) $(DEPS)
