# Директории SRC_DIR = src INC_DIR = inc LIB_DIR = lib BUILD_DIR = build # Исполняемый файл EXECUTABLE = exec # Компилятор и флаги CXX = g++ # Флаги препроцессора CPPFLAGS = -I$(INC_DIR) # Флаги компилятора для C CFLAGS = -pthread -Wall -Wextra -ggdb3 -O0 # Флаги компилятора, специфичные для C++ CXXFLAGS = $(CFLAGS) -std=c++17 # Флаги компоновщика LDFLAGS = -pthread -L$(LIB_DIR) # Библиотеки LDLIBS = -pthread -lm # Файлы SOURCES = $(wildcard $(SRC_DIR)/*.cpp) OBJECTS = $(patsubst $(SRC_DIR)/%.cpp,$(BUILD_DIR)/%.o,$(SOURCES)) # Форматтер # Обрабатывает C/C++ файлы в src и inc. Если astyle не найден — выдаёт предупреждение, но не прерывает. ASTYLE := $(shell command -v astyle 2>/dev/null || true) SRC_FILES := $(wildcard $(SRC_DIR)/*.c $(SRC_DIR)/*.cpp $(SRC_DIR)/*.h $(SRC_DIR)/*.hpp) INC_FILES := $(wildcard $(INC_DIR)/*.c $(INC_DIR)/*.cpp $(INC_DIR)/*.h $(INC_DIR)/*.hpp) # ========== # Основная цель all: $(BUILD_DIR) $(EXECUTABLE) # Создание директории для сборки $(BUILD_DIR): mkdir -p $(BUILD_DIR) # Сборка исполняемого файла $(EXECUTABLE): $(OBJECTS) $(CXX) $(LDFLAGS) $(OBJECTS) -o $(EXECUTABLE) $(LDLIBS) # Компиляция объектных файлов $(BUILD_DIR)/%.o: $(SRC_DIR)/%.cpp | $(BUILD_DIR) $(CXX) $(CXXFLAGS) $(CPPFLAGS) -c $< -o $@ format: ifneq ($(ASTYLE),) @echo "Running astyle..." @$(ASTYLE) --options=.astylerc $(SRC_FILES) $(INC_FILES) else @echo "astyle not found — skipping format" endif # Очистка clean: rm -rf $(EXECUTABLE) $(BUILD_DIR) .PHONY: all clean