# Makefile for SLS project CC ?= gcc CFLAGS ?= -std=c11 -Wall -Wextra -g -Iinclude LDFLAGS ?= SRCDIR := src OBJDIR := obj BINDIR := bin TESTDIR := tests TARGET := $(BINDIR)/sls TEST_TARGET := $(BINDIR)/sls_tests SOURCES := $(wildcard $(SRCDIR)/*.c) OBJECTS := $(patsubst $(SRCDIR)/%.c,$(OBJDIR)/%.o,$(SOURCES)) TEST_SOURCES := $(wildcard $(TESTDIR)/*.c) TEST_OBJECTS := $(patsubst $(TESTDIR)/%.c,$(OBJDIR)/%.o,$(TEST_SOURCES)) .PHONY: all compile run test clean # Default: build main program all: $(TARGET) # Compile object files build: $(OBJECTS) # Rule to compile .c -> .o $(OBJDIR)/%.o: $(SRCDIR)/%.c | $(OBJDIR) $(CC) $(CFLAGS) -c $< -o $@ # Rule to compile test .c -> .o $(OBJDIR)/%.o: $(TESTDIR)/%.c | $(OBJDIR) $(CC) $(CFLAGS) -c $< -o $@ # Link main program $(TARGET): $(OBJECTS) | $(BINDIR) $(CC) $(LDFLAGS) $^ -o $@ # Run main program run: $(TARGET) @echo "Running $(TARGET)..." ./$(TARGET) # Build test runner executable $(TEST_TARGET): $(TEST_OBJECTS) $(OBJECTS) | $(BINDIR) $(CC) $(LDFLAGS) $^ -o $@ # Run tests test: $(TEST_TARGET) @echo "Running tests..." ./$(TEST_TARGET) # Create directories if missing $(BINDIR): mkdir -p $(BINDIR) $(OBJDIR): mkdir -p $(OBJDIR) # Remove build artifacts clean: rm -rf $(OBJDIR) $(BINDIR)