Worked on makefile
This commit is contained in:
parent
c7e2eb8c34
commit
6d5e0fd99d
|
|
@ -0,0 +1,3 @@
|
||||||
|
obj/
|
||||||
|
bin/
|
||||||
|
*.o
|
||||||
|
|
@ -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)
|
||||||
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue