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