CC           =  gcc
LD           =  $(CC)
CFLAGS       =  -std=gnu17 -Wall -Wextra -Wno-unused-parameter -ggdb
CPPFLAGS     += -Iinclude
LDFLAGS      +=
ifndef DEBUG
CFLAGS       += -O2
CPPFLAGS     += -DNDEBUG
else
CPPFLAGS     += -DDEBUG -fsanitize=address,undefined
LDFLAGS      += -fsanitize=address,undefined
endif
BUILDDIR	  =  build

SOURCES = $(wildcard src/*.c)
TEST_SOURCES = $(wildcard test/*.c)
OBJECTS = $(addprefix $(BUILDDIR)/,$(SOURCES:.c=.o))
DEPS	= $(addprefix $(BUILDDIR)/,$(SOURCES:.c=.d)) $(addprefix $(BUILDDIR)/,$(TEST_SOURCES:.c=.d))
LIB     = liblilalloc.a
TEST_BINS = $(patsubst test/%.c,$(BUILDDIR)/test/%,$(TEST_SOURCES))

.PHONY: all
all:  $(BUILDDIR)/$(LIB)


$(BUILDDIR)/%.o: %.c Makefile
	mkdir -p $(@D)
	$(CC) $(CPPFLAGS) $(CFLAGS) -MMD -MP -c -o $@ $<

$(BUILDDIR)/$(LIB): $(OBJECTS)
	ar crs $@ $^

$(BUILDDIR)/test/%: test/%.c $(BUILDDIR)/$(LIB)
	mkdir -p $(@D)
	$(CC) $(CPPFLAGS) $(CFLAGS) $(LDFLAGS) -MMD -MP -o $@ $< $(BUILDDIR)/$(LIB)

.PHONY: test
test: $(TEST_BINS)
	@set -e; \
	for test_bin in $(TEST_BINS); do \
		echo "Running $$test_bin:" ; \
		./$$test_bin; \
		echo ; \
	done

.PHONY: clean
clean:
	rm -rf $(BUILDDIR)

ifeq (,$(findstring clean, $(MAKECMDGOALS)))
-include $(DEPS)
endif
