diff --git a/Makefile b/Makefile index d05218b..2426a4d 100644 --- a/Makefile +++ b/Makefile @@ -1,56 +1,98 @@ +# ===================== # Compiler settings -CC=gcc -CFLAGS=-std=c11 -Wall -Wextra -O2 -Iinclude -SHELL=/bin/sh +# ===================== +CC = gcc +CFLAGS = -std=c11 -Wall -Wextra -O2 -Iinclude +# ===================== # Directories -SRCDIR=src -INCDIR=include -OBJDIR=build -DISTDIR=dist -TESTDIR=tests +# ===================== +SRCDIR = src +INCDIR = include +OBJDIR = obj +TESTDIR = tests +TESTBINDIR = $(TESTDIR)/bin -# Platform-specific sources +# ===================== +# Platform selection +# ===================== ifeq ($(OS),Windows_NT) - PLATFORM_SRC=$(SRCDIR)/win32_platform.c - OBJEXT=obj - LIBEXT=dll - RM=del /Q - MKDIR=if not exist "$(1)" mkdir "$(1)" + PLATFORM_SRC = $(SRCDIR)/win32_platform.c + EXEEXT = .exe else - PLATFORM_SRC=$(SRCDIR)/linux_platform.c - OBJEXT=o - LIBEXT=so - RM=rm -f - MKDIR=mkdir -p $(1) + PLATFORM_SRC = $(SRCDIR)/linux_platform.c + EXEEXT = endif -# Sources and objects -SRC=$(PLATFORM_SRC) $(TESTDIR)/main.c -OBJ=$(patsubst %.c,$(OBJDIR)/%.$(OBJEXT),$(SRC)) +# ===================== +# 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 clean run +# ===================== +.PHONY: all test clean -all: $(DISTDIR)/app +# Build everything +all: $(LIB_OBJ) $(TEST_BINS) -# Build main executable -$(DISTDIR)/app: $(OBJ) - @$(call MKDIR,$(DISTDIR)) - $(CC) $(CFLAGS) $(OBJ) -o $@ - -# Compile object files -$(OBJDIR)/%.$(OBJEXT): %.c - @$(call MKDIR,$(dir $@)) +# ===================== +# Compile platform object +# ===================== +$(OBJDIR)/%.o: %.c + @$(MKDIR) $(dir $@) $(CC) $(CFLAGS) -c $< -o $@ -# Run the app -run: $(DISTDIR)/app - $(DISTDIR)/app +# ===================== +# 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) $(OBJ) - -$(RM) $(DISTDIR)/* - @echo "Cleaned build and dist directories" +# ===================== +clean: + -$(RM) -r $(OBJDIR) $(TESTBINDIR) + @echo "Cleaned objects and test binaries" diff --git a/src/win32_platform.c b/src/win32_platform.c index 63605a5..9cafa32 100644 --- a/src/win32_platform.c +++ b/src/win32_platform.c @@ -1,5 +1,6 @@ #include "../include/platform.h" #include +#include void platform_print(void) { diff --git a/tests/main.c b/tests/01_platform_print.c similarity index 100% rename from tests/main.c rename to tests/01_platform_print.c