proj:=dslibc # COMPILER OPTIONS CC:=gcc CFLAGS:=-std=c17 -Wall -Werror -g # DIRECTORIES objdir:=obj srcdir:=src bindir:=bin testdir:=test # FILES srcfiles:=$(wildcard $(srcdir)/*.c) objfiles=$(patsubst $(srcdir)/%.c,$(objdir)/%.o, $(srcfiles)) objfiles:=$(filter-out $(objdir)/main.o, $(objfiles)) testfiles:=$(wildcard $(testdir)/*tests.c) bin:=$(bindir)/$(proj) testbins:=$(patsubst $(testdir)/%.c,$(bindir)/%, $(testfiles)) # TARGETS .PHONY: build build: $(objdir) $(bindir) $(bin) .PHONY: clean clean: -rm -r $(bindir) $(objdir) .PHONY: test test: build $(testbins) @for test in $(testbins); do ./$$test; done .phony: run run: build @$(bin) .PHONY: info info: @echo "srcfiles: $(srcfiles)" @echo "objfiles: $(objfiles)" @echo "testfiles: $(testfiles)" @echo "testbins: $(testbins)" # Create binary $(bin): $(objfiles) $(srcdir)/main.c $(CC) $(CFLAGS) $^ -o $@ # Create object files $(objdir)/%.o: $(srcdir)/%.c $(CC) $(CFLAGS) -o $@ -c $< # Make test binaries $(bindir)/%: $(testfiles) $(objfiles) $(CC) $(CFLAGS) -o $@ -l criterion $^ # Create Directories $(objdir): mkdir $@ $(bindir): mkdir $@