CC ?= gcc
CFLAGS = -Wall -Wextra -O2 -std=c11
SRCDIR = src
SOURCES = $(SRCDIR)/term.c $(SRCDIR)/parse.c $(SRCDIR)/unify.c $(SRCDIR)/eval.c $(SRCDIR)/main.c
LIB_SOURCES = $(SRCDIR)/term.c $(SRCDIR)/parse.c $(SRCDIR)/unify.c $(SRCDIR)/eval.c
BUILDDIR = build
TARGET = $(BUILDDIR)/proact

all: $(TARGET)

$(BUILDDIR):
	mkdir -p $(BUILDDIR)

$(TARGET): $(SOURCES) $(SRCDIR)/proact.h | $(BUILDDIR)
	$(CC) $(CFLAGS) -I$(SRCDIR) $(SOURCES) -o $(TARGET)

test: test/test_proact.c $(LIB_SOURCES) $(SRCDIR)/proact.h | $(BUILDDIR)
	$(CC) $(CFLAGS) -I$(SRCDIR) $(LIB_SOURCES) test/test_proact.c -o $(BUILDDIR)/test_proact
	./$(BUILDDIR)/test_proact

coverage: test/test_proact.c $(LIB_SOURCES) $(SRCDIR)/proact.h | $(BUILDDIR)
	$(CC) -Wall -Wextra -std=c11 -O0 --coverage -I$(SRCDIR) $(LIB_SOURCES) test/test_proact.c -o $(BUILDDIR)/test_proact_cov
	ulimit -s unlimited && ./$(BUILDDIR)/test_proact_cov
	lcov --capture --directory . --output-file $(BUILDDIR)/coverage.info --ignore-errors inconsistent
	lcov --remove $(BUILDDIR)/coverage.info '*/test/*' --output-file $(BUILDDIR)/coverage.info --ignore-errors unused
	lcov --list $(BUILDDIR)/coverage.info

clean:
	rm -rf $(BUILDDIR)
	rm -f $(SRCDIR)/*.gcda $(SRCDIR)/*.gcno

.PHONY: all test coverage clean
