#compiler settings CC=gcc CFLAGS+=-std=c17 -g -Wall -Werror -Wextra -Wpedantic -Wformat=2 LIBS+=-lm LDFLAGS+= ifeq ($(shell uname),Linux) LDFLAGS=-Wl,--gc-sections else ifeq ($(OS),Windows_NT) LDFLAGS=-Wl,--gc-sections else ifeq ($(shell uname),Darwin) LDFLAGS=-Wl,-dead_strip else @echo "LDFLAGS set failed - what platform is this?" endif #patched in TOY_SOURCEDIR=source #directories TEST_ROOTDIR=../.. TEST_SOURCEDIR=$(TEST_ROOTDIR)/$(TOY_SOURCEDIR) TEST_CASESDIR=. TEST_OUTDIR=out TEST_OBJDIR=obj #file names TEST_SOURCEFILES=$(wildcard $(TEST_SOURCEDIR)/*.c) TEST_CASESFILES=$(wildcard $(TEST_CASESDIR)/bench_*.c) #build the object files, compile the test cases, and run all: clean $(MAKE) TOY_BUCKET_IDEAL=16372 all-override $(MAKE) TOY_BUCKET_IDEAL=32756 all-override $(MAKE) TOY_BUCKET_IDEAL=65524 all-override $(MAKE) TOY_BUCKET_IDEAL=131060 all-override $(MAKE) TOY_BUCKET_IDEAL=262132 all-override all-override: clean $(MAKE) build-source $(MAKE) build-cases $(MAKE) build-link $(MAKE) build-run #targets for each step .PHONY: build-source build-source: $(TEST_OUTDIR) $(TEST_OBJDIR) $(addprefix $(TEST_OBJDIR)/,$(notdir $(TEST_SOURCEFILES:.c=.o))) .PHONY: build-cases build-cases: $(TEST_OUTDIR) $(TEST_OBJDIR) $(addprefix $(TEST_OBJDIR)/,$(notdir $(TEST_CASESFILES:.c=.o))) .PHONY: build-link build-link: $(TEST_OUTDIR) $(TEST_OBJDIR) $(addprefix $(TEST_OUTDIR)/,$(notdir $(TEST_CASESFILES:%.c=%.exe))) .PHONY: build-run build-run: $(addprefix $(TEST_OUTDIR)/,$(notdir $(TEST_CASESFILES:%.c=%.exe))) $(addprefix $(TEST_OUTDIR)/,$(notdir $(TEST_CASESFILES:%.c=%.run))) #compilation steps $(TEST_OBJDIR)/%.o: $(TEST_SOURCEDIR)/%.c $(CC) -DTOY_BUCKET_IDEAL=$(TOY_BUCKET_IDEAL) -c -o $@ $< $(addprefix -I,$(TEST_SOURCEDIR)) $(CFLAGS) -fdata-sections -ffunction-sections $(TEST_OBJDIR)/%.o: $(TEST_CASESDIR)/%.c $(CC) -DTOY_BUCKET_IDEAL=$(TOY_BUCKET_IDEAL) -c -o $@ $< $(addprefix -I,$(TEST_SOURCEDIR) $(TEST_CASESDIR)) $(CFLAGS) -fdata-sections -ffunction-sections $(TEST_OUTDIR)/%.exe: $(TEST_OBJDIR)/%.o @$(CC) -DTOY_BUCKET_IDEAL=$(TOY_BUCKET_IDEAL) -o $@ $< $(addprefix $(TEST_OBJDIR)/,$(notdir $(TEST_SOURCEFILES:.c=.o))) $(CFLAGS) $(LIBS) $(LDFLAGS) strip $@ .PRECIOUS: $(TEST_OUTDIR)/%.run $(TEST_OUTDIR)/%.run: $(TEST_OUTDIR)/%.exe @/usr/bin/time --format "User System\n%U %E" $< #util targets $(TEST_OUTDIR): mkdir $(TEST_OUTDIR) $(TEST_OBJDIR): mkdir $(TEST_OBJDIR) #util commands .PHONY: clean clean: ifeq ($(shell uname),Linux) find . -type f -name '*.o' -delete find . -type f -name '*.a' -delete find . -type f -name '*.exe' -delete find . -type f -name '*.dll' -delete find . -type f -name '*.lib' -delete find . -type f -name '*.so' -delete find . -type f -name '*.dylib' -delete find . -type d -name 'out' -delete find . -type d -name 'obj' -delete else ifeq ($(OS),Windows_NT) $(RM) *.o *.a *.exe *.dll *.lib *.so *.dylib $(RM) out $(RM) obj else ifeq ($(shell uname),Darwin) find . -type f -name '*.o' -delete find . -type f -name '*.a' -delete find . -type f -name '*.exe' -delete find . -type f -name '*.dll' -delete find . -type f -name '*.lib' -delete find . -type f -name '*.so' -delete find . -type f -name '*.dylib' -delete find . -type d -name 'out' -delete find . -type d -name 'obj' -delete else @echo "Deletion failed - what platform is this?" endif