Files
interpreter-cpp/Makefile
2025-06-29 10:13:27 +02:00

75 lines
2.4 KiB
Makefile
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# -------------------------------------------------------------------
# Projectwide 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
# -------------------------------------------------------------------
# Toplevel 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 $@
# -------------------------------------------------------------------
# Autoinclude dependencies
# -------------------------------------------------------------------
-include $(DEPFILES)