cube/Makefile (2229B)
##### CONFIG ################################################################### CC = clang # dirs SRCDIR = src TESTDIR = test BINDIR = bin OBJDIR = build APP_SRCS = $(SRCDIR)/cube.c \ $(SRCDIR)/ncdraw.c MAIN_SRC = $(SRCDIR)/main.c TEST_SRCS = $(TESTDIR)/test.c \ $(TESTDIR)/test_cube.c APP_OBJS = $(APP_SRCS:$(SRCDIR)/%.c=$(OBJDIR)/%.o) MAIN_OBJ = $(MAIN_SRC:$(SRCDIR)/%.c=$(OBJDIR)/%.o) TEST_OBJS = $(TEST_SRCS:$(TESTDIR)/%.c=$(OBJDIR)/%.o) # targets TARGET = cube TEST_RUNNER = test_runner TARGET_BIN = $(BINDIR)/$(TARGET) TEST_BIN = $(BINDIR)/$(TEST_RUNNER) ##### FLAGS #################################################################### CPPFLAGS += -Isrc CFLAGS += -Wall -Wextra -std=c11 FSANITIZE = -fsanitize=address,undefined # options-only flags LDFLAGS += NCURSES = -lncurses CUNIT = -lcunit LDLIBS_APP = $(NCURSES) LDLIBS_TEST = $(NCURSES) $(CUNIT) # macOS Homebrew (headers and libs) UNAME_S := $(shell uname -s) ifeq ($(UNAME_S),Darwin) BREW_PREFIX := $(shell brew --prefix 2>/dev/null || echo /opt/homebrew) CPPFLAGS += -I$(BREW_PREFIX)/include LDLIBS_TEST += -L$(BREW_PREFIX)/lib endif # build types ifeq ($(DEBUG_BUILD),1) CFLAGS += -O1 -g -DDEBUG $(FSANITIZE) LDFLAGS += $(FSANITIZE) else CFLAGS += -O3 endif ##### RULES #################################################################### .PHONY: all debug run test clean all: $(BINDIR) $(TARGET_BIN) debug: @$(MAKE) DEBUG_BUILD=1 all run: @$(MAKE) DEBUG_BUILD=1 all @./$(TARGET_BIN) test: @$(MAKE) DEBUG_BUILD=1 _test _test: $(BINDIR) $(TEST_BIN) @echo "--- Running Unit Tests (debug build) ---" @./$(TEST_BIN) $(BINDIR): mkdir -p $(BINDIR) # App: main + logic $(TARGET_BIN): $(MAIN_OBJ) $(APP_OBJS) $(CC) $^ $(LDFLAGS) -o $@ $(LDLIBS_APP) # Tests: logic (no main) + test runner/suites $(TEST_BIN): $(APP_OBJS) $(TEST_OBJS) $(CC) $^ $(LDFLAGS) -o $@ $(LDLIBS_TEST) # compile into `build/` $(OBJDIR)/%.o: $(SRCDIR)/%.c mkdir -p $(dir $@) $(CC) $(CPPFLAGS) $(CFLAGS) -c $< -o $@ $(OBJDIR)/%.o: $(TESTDIR)/%.c mkdir -p $(dir $@) $(CC) $(CPPFLAGS) $(CFLAGS) -c $< -o $@ clean: rm -rf $(BINDIR) $(OBJDIR)