# Makefile for SLS_C project
CC ?= gcc
CFLAGS ?= -std=c11 -Wall -Wextra -g
LDFLAGS ?=

SRCDIR := src
OBJDIR := obj
BINDIR := bin
TESTDIR := tests

TARGET := $(BINDIR)/sls_c

SOURCES := $(wildcard $(SRCDIR)/*.c)
OBJECTS := $(patsubst $(SRCDIR)/%.c,$(OBJDIR)/%.o,$(SOURCES))

TEST_SOURCES := $(wildcard $(TESTDIR)/test_*.c)
TEST_BINS := $(patsubst $(TESTDIR)/test_%.c,$(BINDIR)/test_%,$(TEST_SOURCES))

.PHONY: all compile run test clean

all: $(TARGET)

compile: $(OBJECTS)

$(OBJDIR)/%.o: $(SRCDIR)/%.c | $(OBJDIR)
	$(CC) $(CFLAGS) -c $< -o $@

$(TARGET): $(OBJECTS) | $(BINDIR)
	$(CC) $(LDFLAGS) $^ -o $@

run: $(TARGET)
	@echo "Running $(TARGET)..."
	./$(TARGET)

# Build test binaries from tests/test_*.c and run them
$(BINDIR)/test_%: $(TESTDIR)/test_%.c | $(BINDIR)
	$(CC) $(CFLAGS) $< -o $@

test: $(TEST_BINS)
	@echo "Running tests..."
	@for t in $(TEST_BINS); do \
		echo "== $$t =="; \
		./$$t || { echo "Test $$t failed"; exit 1; }; \
	done
	@echo "All tests passed."

$(BINDIR):
	mkdir -p $(BINDIR)

$(OBJDIR):
	mkdir -p $(OBJDIR)

clean:
	rm -rf $(OBJDIR) $(BINDIR)