Worked on makefile

This commit is contained in:
Kyler Olsen 2025-11-02 22:14:33 -07:00
parent c7e2eb8c34
commit 6d5e0fd99d
4 changed files with 35 additions and 22 deletions

3
SLS_C/.gitignore vendored Normal file
View File

@ -0,0 +1,3 @@
obj/
bin/
*.o

View File

@ -1,6 +1,7 @@
# Makefile for SLS_C project # Makefile for SLS project
CC ?= gcc CC ?= gcc
CFLAGS ?= -std=c11 -Wall -Wextra -g CFLAGS ?= -std=c11 -Wall -Wextra -g -Iinclude
LDFLAGS ?= LDFLAGS ?=
SRCDIR := src SRCDIR := src
@ -8,47 +9,56 @@ OBJDIR := obj
BINDIR := bin BINDIR := bin
TESTDIR := tests TESTDIR := tests
TARGET := $(BINDIR)/sls_c TARGET := $(BINDIR)/sls
TEST_TARGET := $(BINDIR)/sls_tests
SOURCES := $(wildcard $(SRCDIR)/*.c) SOURCES := $(wildcard $(SRCDIR)/*.c)
OBJECTS := $(patsubst $(SRCDIR)/%.c,$(OBJDIR)/%.o,$(SOURCES)) OBJECTS := $(patsubst $(SRCDIR)/%.c,$(OBJDIR)/%.o,$(SOURCES))
TEST_SOURCES := $(wildcard $(TESTDIR)/test_*.c) TEST_SOURCES := $(wildcard $(TESTDIR)/*.c)
TEST_BINS := $(patsubst $(TESTDIR)/test_%.c,$(BINDIR)/test_%,$(TEST_SOURCES)) TEST_OBJECTS := $(patsubst $(TESTDIR)/%.c,$(OBJDIR)/%.o,$(TEST_SOURCES))
.PHONY: all compile run test clean .PHONY: all compile run test clean
# Default: build main program
all: $(TARGET) all: $(TARGET)
compile: $(OBJECTS) # Compile object files
build: $(OBJECTS)
# Rule to compile .c -> .o
$(OBJDIR)/%.o: $(SRCDIR)/%.c | $(OBJDIR) $(OBJDIR)/%.o: $(SRCDIR)/%.c | $(OBJDIR)
$(CC) $(CFLAGS) -c $< -o $@ $(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) $(TARGET): $(OBJECTS) | $(BINDIR)
$(CC) $(LDFLAGS) $^ -o $@ $(CC) $(LDFLAGS) $^ -o $@
# Run main program
run: $(TARGET) run: $(TARGET)
@echo "Running $(TARGET)..." @echo "Running $(TARGET)..."
./$(TARGET) ./$(TARGET)
# Build test binaries from tests/test_*.c and run them # Build test runner executable
$(BINDIR)/test_%: $(TESTDIR)/test_%.c | $(BINDIR) $(TEST_TARGET): $(TEST_OBJECTS) $(OBJECTS) | $(BINDIR)
$(CC) $(CFLAGS) $< -o $@ $(CC) $(LDFLAGS) $^ -o $@
test: $(TEST_BINS) # Run tests
test: $(TEST_TARGET)
@echo "Running tests..." @echo "Running tests..."
@for t in $(TEST_BINS); do \ ./$(TEST_TARGET)
echo "== $$t =="; \
./$$t || { echo "Test $$t failed"; exit 1; }; \
done
@echo "All tests passed."
# Create directories if missing
$(BINDIR): $(BINDIR):
mkdir -p $(BINDIR) mkdir -p $(BINDIR)
$(OBJDIR): $(OBJDIR):
mkdir -p $(OBJDIR) mkdir -p $(OBJDIR)
# Remove build artifacts
clean: clean:
rm -rf $(OBJDIR) $(BINDIR) rm -rf $(OBJDIR) $(BINDIR)

View File

@ -6,6 +6,6 @@
#include <stdio.h> #include <stdio.h>
int main(void) { int main(void) {
printf("Hello, world!"); printf("Hello, world!\n");
return 0; return 0;
} }

View File

@ -13,19 +13,19 @@ int main(void) {
for (int i = 0; i < lexer_reports.count; i++) { for (int i = 0; i < lexer_reports.count; i++) {
switch (lexer_reports.tests[i].status) { switch (lexer_reports.tests[i].status) {
case TEST_ERROR: case TEST_ERROR:
printf("\x1b[91mTest errored: %s\n\t%s\n", lexer_reports.tests[i].name, lexer_reports.tests[i].error.message); printf("\x1b[91mTest errored: %s\n\t%s\n\x1b[0m", lexer_reports.tests[i].name, lexer_reports.tests[i].error.message);
break; break;
case TEST_ERROR_FAIL: case TEST_ERROR_FAIL:
printf("\x1b[35mTest failed (errored): %s\n\t%s\n", lexer_reports.tests[i].name, lexer_reports.tests[i].error.message); printf("\x1b[35mTest failed (errored): %s\n\t%s\n\x1b[0m", lexer_reports.tests[i].name, lexer_reports.tests[i].error.message);
break; break;
case TEST_LOGIC_FAIL: case TEST_LOGIC_FAIL:
printf("\x1b[31mTest failed: %s\n\t%s\n", lexer_reports.tests[i].name, lexer_reports.tests[i].message); printf("\x1b[31mTest failed: %s\n\t%s\n\x1b[0m", lexer_reports.tests[i].name, lexer_reports.tests[i].message);
break; break;
case TEST_PASS: case TEST_PASS:
printf("\x1b[32mTest passed: %s\n", lexer_reports.tests[i].name); printf("\x1b[32mTest passed: %s\n\x1b[0m", lexer_reports.tests[i].name);
break; break;
case TEST_NOT_IMPLEMENTED: case TEST_NOT_IMPLEMENTED:
printf("\x1b[34mTest not implemented: %s\n", lexer_reports.tests[i].name); printf("\x1b[34mTest not implemented: %s\n\x1b[0m", lexer_reports.tests[i].name);
break; break;
} }
} }