# ==============================================================================
# Fortress Chat - common library (libfccommon.a)
# ==============================================================================
# Self-contained: knows where the fortress headers and the user-local libsodium
# headers/libs live. Build:   make
# Test:                       make test
# ==============================================================================

CC := gcc
AR := ar

# Locate the repository include dir (../../include) relative to this Makefile.
ROOT_DIR    := ../..
INCLUDE_DIR := $(ROOT_DIR)/include
LOCAL_INC   := $(HOME)/.local/include
LOCAL_LIB   := $(HOME)/.local/lib

BUILD_DIR := build
OBJ_DIR   := $(BUILD_DIR)/obj
BIN_DIR   := $(BUILD_DIR)/bin
LIBRARY   := $(BUILD_DIR)/libfccommon.a

# Hardened, but without the library's -Wconversion / -Wswitch-enum strictness.
CFLAGS := -std=c11
CFLAGS += -I$(INCLUDE_DIR) -I. -I$(LOCAL_INC)
CFLAGS += -Wall -Wextra -Werror -O2
CFLAGS += -fstack-protector-strong -D_FORTIFY_SOURCE=2
CFLAGS += $(EXTRA_CFLAGS)

LDFLAGS := -L$(LOCAL_LIB) $(EXTRA_LDFLAGS)
LIBS    := -lsodium

SOURCES := fc_util.c fc_proto.c fc_transport.c
OBJECTS := $(patsubst %.c,$(OBJ_DIR)/%.o,$(SOURCES))

TEST_SOURCES := $(wildcard tests/*.c)
TEST_BINS    := $(patsubst tests/%.c,$(BIN_DIR)/%,$(TEST_SOURCES))

.PHONY: all clean test dirs

all: dirs $(LIBRARY)

dirs:
	@mkdir -p $(OBJ_DIR) $(BIN_DIR)

$(LIBRARY): $(OBJECTS)
	@echo "[AR] $@"
	@$(AR) rcs $@ $^

$(OBJ_DIR)/%.o: %.c
	@echo "[CC] $<"
	@$(CC) $(CFLAGS) -c -o $@ $<

# Tests reuse the frozen library's struct definitions (header-only) plus
# libfccommon; the only runtime dependency is libsodium.
$(BIN_DIR)/%: tests/%.c $(LIBRARY)
	@echo "[CC] test $<"
	@$(CC) $(CFLAGS) -o $@ $< $(LIBRARY) $(LDFLAGS) $(LIBS)

test: all $(TEST_BINS)
	@echo "Running fccommon tests..."
	@for t in $(TEST_BINS); do \
		echo "=== $$t ==="; \
		$$t || exit 1; \
	done
	@echo "All fccommon tests passed!"

clean:
	@rm -rf $(BUILD_DIR)
