Makefile fix
This commit is contained in:
120
Makefile
120
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"
|
||||
|
||||
|
||||
Reference in New Issue
Block a user