# To launch with debug messages: G_MESSAGES_DEBUG=all ./librefront

SRC_DIR := src

COMMON_SRC     := $(shell find $(SRC_DIR)/common -name '*.c')
SERVER_SRC     := $(shell find $(SRC_DIR)/server -name '*.c')
CLIENT_SRC     := $(shell find $(SRC_DIR)/client -name '*.c')

COMMON_OBJ     := $(patsubst $(SRC_DIR)/%.c, build/%.o, $(COMMON_SRC))
SERVER_OBJ     := $(patsubst $(SRC_DIR)/%.c, build/%.o, $(SERVER_SRC))
CLIENT_OBJ     := $(patsubst $(SRC_DIR)/%.c, build/%.o, $(CLIENT_SRC))

COMMON_DEP     := $(COMMON_OBJ:.o=.d)
SERVER_DEP     := $(SERVER_OBJ:.o=.d)
CLIENT_DEP     := $(CLIENT_OBJ:.o=.d)

CC      := gcc
LD      := gcc
STD     := gnu23
RM      := rm -f

DEBUG   ?= 1

COMMON_CFLAGS  := -std=$(STD) -Werror -Wextra -Wall -MMD -MP -I$(SRC_DIR) `pkg-config --cflags glib-2.0`
COMMON_LDFLAGS := -std=$(STD) -lm `pkg-config --libs glib-2.0 sdl3 sdl3-image`

ifeq ($(DEBUG),1)
	COMMON_CFLAGS  += -g -DDEBUG
	COMMON_LDFLAGS += -g
else
	COMMON_CFLAGS  += -O2 -DNDEBUG
endif


CLIENT_CFLAGS := $(COMMON_CFLAGS) # `pkg-config --cflags sdl3`
CLIENT_LDFLAGS := $(COMMON_LDFLAGS) # `pkg-config --libs sdl3`

SERVER_CFLAGS := $(COMMON_CFLAGS)
SERVER_LDFLAGS := $(COMMON_LDFLAGS)

CLIENT := librefront
SERVER := librefront-headless

.PHONY: all clean format

all: $(CLIENT) $(SERVER)

$(CLIENT): $(COMMON_OBJ) $(CLIENT_OBJ)
	$(LD) $^ -o $@ $(CLIENT_LDFLAGS)

$(SERVER): $(COMMON_OBJ) $(SERVER_OBJ)
	$(LD) $^ -o $@ $(SERVER_LDFLAGS)

build/common/%.o: $(SRC_DIR)/common/%.c
	@mkdir -p $(dir $@)
	$(CC) -c $< -o $@ $(COMMON_CFLAGS)

build/client/%.o: $(SRC_DIR)/client/%.c
	@mkdir -p $(dir $@)
	$(CC) -c $< -o $@ $(CLIENT_CFLAGS)

build/server/%.o: $(SRC_DIR)/server/%.c
	@mkdir -p $(dir $@)
	$(CC) -c $< -o $@ $(SERVER_CFLAGS)

clean:
	$(RM) -r build/ $(CLIENT) $(SERVER) perf.data* massif.out*

format:
	find $(SRC_DIR) -type f \( -name '*.c' -o -name '*.h' \) \
		-exec sh -c 'tmp=$$(mktemp) || tmp=/tmp/indent.$$$$; \
				indent -gnu "$$1" -o "$$tmp" && mv "$$tmp" "$$1"' _ {} \;

-include $(COMMON_DEP)
-include $(CLIENT_DEP)
-include $(SERVER_DEP)
