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