99 lines
2.2 KiB
Makefile
99 lines
2.2 KiB
Makefile
# =====================
|
|
# 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"
|
|
|