# ===================== # Compiler settings # ===================== CC = gcc CFLAGS = -std=c11 -Wall -Wextra -O2 -Iinclude # ===================== # Directories # ===================== SRCDIR = src INCDIR = include OBJDIR = obj TESTDIR = tests TESTBINDIR = $(TESTDIR)/bin # ===================== # Platform selection # ===================== ifeq ($(OS),Windows_NT) PLATFORM_SRC = $(SRCDIR)/win32_platform.c EXEEXT = .exe else PLATFORM_SRC = $(SRCDIR)/linux_platform.c EXEEXT = endif # ===================== # Tools # ===================== RM = rm -f MKDIR = mkdir -p # ===================== # Library (platform backend) # ===================== LIB_SRC = $(PLATFORM_SRC) LIB_OBJ = $(patsubst %.c,$(OBJDIR)/%.o,$(LIB_SRC)) # ===================== # Test / final binaries # ===================== TEST_SRCS = $(wildcard $(TESTDIR)/*.c) TEST_BINS = $(patsubst $(TESTDIR)/%.c,$(TESTBINDIR)/%$(EXEEXT),$(TEST_SRCS)) # ===================== # Targets # ===================== .PHONY: all test clean # Build everything all: $(LIB_OBJ) $(TEST_BINS) # ===================== # Compile platform object # ===================== $(OBJDIR)/%.o: %.c @$(MKDIR) $(dir $@) $(CC) $(CFLAGS) -c $< -o $@ # ===================== # Build each binary # ===================== $(TESTBINDIR)/%$(EXEEXT): $(TESTDIR)/%.c $(LIB_OBJ) @$(MKDIR) $(TESTBINDIR) $(CC) $(CFLAGS) $< $(LIB_OBJ) -o $@ # ===================== # Test runner # ===================== test: all @echo "Running binaries..." @SUCCESS=0; FAILURE=0; \ for bin in $(TEST_BINS); do \ echo "--------------------------------"; \ echo "Running $$bin"; \ "./$$bin"; \ EC=$$?; \ NAME=$$(basename "$$bin"); \ if [ $$EC -eq 0 ]; then \ printf "\033[0;32m%s: EXIT %d (SUCCESS)\033[0m\n" "$$NAME" "$$EC"; \ SUCCESS=$$((SUCCESS+1)); \ else \ printf "\033[0;31m%s: EXIT %d (FAILURE)\033[0m\n" "$$NAME" "$$EC"; \ FAILURE=$$((FAILURE+1)); \ fi; \ done; \ echo ""; \ echo "SUCCESS: $$SUCCESS"; \ echo "FAILURE: $$FAILURE"; \ if [ $$FAILURE -ne 0 ]; then exit 1; fi # ===================== # Clean # ===================== clean: -$(RM) -r $(OBJDIR) $(TESTBINDIR) @echo "Cleaned objects and test binaries"