cube

A rotating 3D wireframe cube rendered in the terminal
git clone https://github.com/michaelneuper/cube.git
README | Files | Log | Refs | LICENSE

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)