75 lines
2.4 KiB
Makefile
75 lines
2.4 KiB
Makefile
# -------------------------------------------------------------------
|
||
# Project‐wide settings
|
||
# -------------------------------------------------------------------
|
||
CXX := g++
|
||
CXXFLAGS := -std=c++17 -Wall -Wextra -Iinclude -Isrc -MMD -MP
|
||
LDFLAGS :=
|
||
SRC_DIR := src
|
||
TEST_DIR := test
|
||
BUILD_DIR := build
|
||
OBJ_DIR := $(BUILD_DIR)/objs
|
||
BIN_DIR := $(BUILD_DIR)/bin
|
||
|
||
# -------------------------------------------------------------------
|
||
# Source & object lists
|
||
# -------------------------------------------------------------------
|
||
SRC_CPP := $(shell find $(SRC_DIR) -name '*.cpp')
|
||
TEST_CPP := $(shell find $(TEST_DIR) -name '*.cpp')
|
||
OBJ := $(patsubst $(SRC_DIR)/%.cpp,$(OBJ_DIR)/%.o,$(SRC_CPP))
|
||
TEST_OBJ := $(patsubst $(TEST_DIR)/%.cpp,$(OBJ_DIR)/test/%.o,$(TEST_CPP))
|
||
DEPFILES := $(OBJ:.o=.d) $(TEST_OBJ:.o=.d)
|
||
|
||
# Identify your “real” main.cpp so we can exclude it from tests
|
||
MAIN_SRC := $(SRC_DIR)/main.cpp
|
||
MAIN_OBJ := $(MAIN_SRC:$(SRC_DIR)/%.cpp=$(OBJ_DIR)/%.o)
|
||
SRC_OBJS_NO_MAIN := $(filter-out $(MAIN_OBJ),$(OBJ))
|
||
|
||
# Binaries
|
||
TARGET := $(BIN_DIR)/monkey
|
||
TEST_TARGET := $(BIN_DIR)/monkey_tests
|
||
|
||
# -------------------------------------------------------------------
|
||
# Top‐level rules
|
||
# -------------------------------------------------------------------
|
||
.PHONY: all clean run tests
|
||
all: $(TARGET) $(TEST_TARGET)
|
||
|
||
clean:
|
||
@rm -rf $(BUILD_DIR)
|
||
|
||
# -------------------------------------------------------------------
|
||
# Build & run
|
||
# -------------------------------------------------------------------
|
||
run: $(TARGET)
|
||
@$(TARGET)
|
||
|
||
tests: $(TEST_TARGET)
|
||
@$(TEST_TARGET) $(if $(TEST),--test-case=$(TEST))
|
||
|
||
# -------------------------------------------------------------------
|
||
# Link binaries
|
||
# -------------------------------------------------------------------
|
||
$(TARGET): $(OBJ)
|
||
@mkdir -p $(BIN_DIR)
|
||
$(CXX) $(LDFLAGS) $^ -o $@
|
||
|
||
$(TEST_TARGET): $(SRC_OBJS_NO_MAIN) $(TEST_OBJ)
|
||
@mkdir -p $(BIN_DIR)
|
||
$(CXX) $(LDFLAGS) $^ -o $@
|
||
|
||
# -------------------------------------------------------------------
|
||
# Compile rules
|
||
# -------------------------------------------------------------------
|
||
$(OBJ_DIR)/%.o: $(SRC_DIR)/%.cpp
|
||
@mkdir -p $(@D)
|
||
$(CXX) $(CXXFLAGS) -c $< -o $@
|
||
|
||
$(OBJ_DIR)/test/%.o: $(TEST_DIR)/%.cpp
|
||
@mkdir -p $(@D)
|
||
$(CXX) $(CXXFLAGS) -c $< -o $@
|
||
|
||
# -------------------------------------------------------------------
|
||
# Auto‐include dependencies
|
||
# -------------------------------------------------------------------
|
||
-include $(DEPFILES)
|