MKDIR := mkdir RMDIR := rm -r RM := rm CC := gcc BINDIR := ./bin TESTDIR := ./test SRCDIRS := ./ SRCS := $(foreach fd, $(SRCDIRS), $(wildcard $(fd)/*.c)) OBJS := $(patsubst %.c,$(BINDIR)/%.o,$(SRCS)) ARCFIND := $(BINDIR)/arcfind EXES := $(ARCFIND) CFLAGS := $(addprefix -I,$(SRCDIRS)) $(XTRAFLAGS) LDLIBS := ARCFIND_O := $(addprefix ./bin/, main.o) all: $(EXES) .PHONY: all $(BINDIR)/%.o: %.c | $(BINDIR) $(CC) $(CFLAGS) -c -o $@ $^ $(LDLIBS) include $(DEPS) $(ARCFIND): $(ARCFIND_O) | $(BINDIR) $(CC) $(CFLAGS) -o $@ $^ $(LDLIBS) # TODO: one good rule for the test bins $(BINDIR): $(MKDIR) $@ $(TESTDIR): $(MKDIR) $@ debug: $(MAKE) XTRAFLAGS:="-g -fsanitize=undefined -fsanitize-undefined-trap-on-error -fno-omit-frame-pointer -O0 -DDEBUG -Wuninitialized" .PHONY: debug release: $(MAKE) XTRAFLAGS:="-O3" .PHONY: release clean: -$(RM) $(OBJS) -$(RM) $(EXES) .PHONY: clean