blob: 3cffe4f9232b3058cb2a2d1c44e34b772959e056 (
plain) (
blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
|
CC = gcc
CFLAGS = -Wall -Wextra -Werror -std=gnu99 -g -O2
LDFLAGS = -lm
# Debug flags
DEBUG_CFLAGS = -Wall -Wextra -Werror -std=gnu99 -g -O0 -DDEBUG
RELEASE_CFLAGS = -Wall -Wextra -Werror -std=gnu99 -g -O2
# Static analysis tools
CLANG_TIDY = clang-tidy
CPPCHECK = cppcheck
# Memory checking
VALGRIND = valgrind --leak-check=full --show-leak-kinds=all --track-origins=yes
# Directories
SRCDIR = src
INCDIR = include
OBJDIR = obj
BINDIR = bin
TESTDIR = tests
# Files
SOURCES = $(wildcard $(SRCDIR)/*.c)
OBJECTS = $(SOURCES:$(SRCDIR)/%.c=$(OBJDIR)/%.o)
TARGET = $(BINDIR)/baba-yaga
.PHONY: all clean test check style memcheck coverage docs debug release
all: $(TARGET)
$(TARGET): $(OBJECTS) | $(BINDIR)
$(CC) $(OBJECTS) -o $@ $(LDFLAGS)
$(OBJDIR)/%.o: $(SRCDIR)/%.c | $(OBJDIR)
$(CC) $(CFLAGS) -I$(INCDIR) -c $< -o $@
$(BINDIR) $(OBJDIR):
mkdir -p $@
clean:
rm -rf $(OBJDIR) $(BINDIR)
# Debug and release builds
debug: CFLAGS = $(DEBUG_CFLAGS)
debug: clean $(TARGET)
release: CFLAGS = $(RELEASE_CFLAGS)
release: clean $(TARGET)
# Quality checks
check: style memcheck
style:
$(CLANG_TIDY) $(SOURCES) -- -I$(INCDIR)
$(CPPCHECK) --enable=all --std=c99 $(SRCDIR)
memcheck: $(TARGET)
$(VALGRIND) $(TARGET) --test $(TESTDIR)
test: $(TARGET)
@echo "Running tests..."
@for test_file in $(TESTDIR)/*.txt; do \
if [ -f "$$test_file" ]; then \
echo "Testing $$(basename $$test_file)"; \
$(TARGET) -t "$$test_file" || exit 1; \
fi; \
done
@echo "All tests passed!"
coverage: CFLAGS += -fprofile-arcs -ftest-coverage
coverage: LDFLAGS += -lgcov
coverage: clean $(TARGET)
$(TARGET) --test $(TESTDIR)
gcov $(SOURCES)
docs:
doxygen Doxyfile
|