From c95e1596016060c7a13ff831cd3e59efb9232fc1 Mon Sep 17 00:00:00 2001 From: dawidg81 Date: Fri, 13 Feb 2026 10:20:09 +0100 Subject: Updated Makefile --- Makefile | 299 +++++++++++++++++++++++++++++++++++++++++++++++++++++---------- 1 file changed, 253 insertions(+), 46 deletions(-) (limited to 'Makefile') diff --git a/Makefile b/Makefile index bb8c22a..73fd5cd 100644 --- a/Makefile +++ b/Makefile @@ -1,66 +1,273 @@ -# Makefile for Graphics Demo (MinGW/Windows) -# Usage: make -# Make sure to set SDL2_PATH to your SDL2 installation directory +# Makefile for libgraffik +# Smart build system with interactive backend and example selection -# Detect SDL2 path - adjust this to where you installed SDL2 -SDL2_PATH ?= C:/SDL2 +# Colors for output +COLOR_RESET = \033[0m +COLOR_BOLD = \033[1m +COLOR_GREEN = \033[32m +COLOR_BLUE = \033[34m +COLOR_YELLOW = \033[33m +COLOR_RED = \033[31m # Compiler -CXX = g++ +CXX ?= g++ + +# Directories +LIB_DIR = lib +EXAMPLES_DIR = examples +BUILD_DIR = build # Compiler flags -CXXFLAGS = -std=c++11 -Wall -Wextra -DUSE_SDL +CXXFLAGS = -std=c++11 -Wall -Wextra -I$(LIB_DIR) + +# Library source +LIB_SOURCE = $(LIB_DIR)/graphics.cpp + +# Detect platform +ifeq ($(OS),Windows_NT) + PLATFORM = Windows + EXE_EXT = .exe + RM = del /Q + RMDIR = rmdir /S /Q + MKDIR = mkdir + PATH_SEP = \\ +else + PLATFORM = Linux + EXE_EXT = + RM = rm -f + RMDIR = rm -rf + MKDIR = mkdir -p + PATH_SEP = / +endif + +# Available backends +AVAILABLE_BACKENDS = sdl win32 x11 + +# Backend-specific settings +ifeq ($(BACKEND),sdl) + BACKEND_DEFINE = -DUSE_SDL + ifeq ($(PLATFORM),Windows) + SDL2_PATH ?= C:/SDL2 + INCLUDES = -I$(SDL2_PATH)/include -I$(SDL2_PATH)/include/SDL2 + LDFLAGS = -L$(SDL2_PATH)/lib + LIBS = -lmingw32 -lSDL2main -lSDL2 -mwindows + else + INCLUDES = $(shell sdl2-config --cflags 2>/dev/null || echo "-I/usr/include/SDL2") + LDFLAGS = $(shell sdl2-config --libs 2>/dev/null || echo "-lSDL2") + LIBS = $(LDFLAGS) + endif +else ifeq ($(BACKEND),win32) + BACKEND_DEFINE = -DUSE_WIN32 + INCLUDES = + LDFLAGS = + LIBS = -lgdi32 -luser32 +else ifeq ($(BACKEND),x11) + BACKEND_DEFINE = -DUSE_X11 + INCLUDES = -I/usr/include + LDFLAGS = -L/usr/lib + LIBS = -lX11 +endif -# Include directories -INCLUDES = -I$(SDL2_PATH)/include -I$(SDL2_PATH)/include/SDL2 +# Find all example files +EXAMPLE_FILES = $(wildcard $(EXAMPLES_DIR)/*.cpp) +EXAMPLE_NAMES = $(basename $(notdir $(EXAMPLE_FILES))) -# Library directories and libraries -LDFLAGS = -L$(SDL2_PATH)/lib -LIBS = -lmingw32 -lSDL2main -lSDL2 -mwindows +# Default target - show menu +.PHONY: all +all: menu + +# Interactive menu +.PHONY: menu +menu: + @echo "$(COLOR_BOLD)$(COLOR_BLUE)╔════════════════════════════════════════╗$(COLOR_RESET)" + @echo "$(COLOR_BOLD)$(COLOR_BLUE)║ libgraffik Build System ║$(COLOR_RESET)" + @echo "$(COLOR_BOLD)$(COLOR_BLUE)╚════════════════════════════════════════╝$(COLOR_RESET)" + @echo "" + @echo "$(COLOR_BOLD)Platform:$(COLOR_RESET) $(COLOR_GREEN)$(PLATFORM)$(COLOR_RESET)" + @echo "" + @echo "$(COLOR_BOLD)Usage:$(COLOR_RESET)" + @echo " make build BACKEND= EXAMPLE=" + @echo "" + @echo "$(COLOR_BOLD)Available Backends:$(COLOR_RESET)" + @echo " $(COLOR_GREEN)sdl$(COLOR_RESET) - SDL2 (cross-platform)" + @echo " $(COLOR_YELLOW)win32$(COLOR_RESET) - Win32 API (Windows only)" + @echo " $(COLOR_YELLOW)x11$(COLOR_RESET) - X11 (Linux only)" + @echo "" + @echo "$(COLOR_BOLD)Available Examples:$(COLOR_RESET)" + @for example in $(EXAMPLE_NAMES); do \ + echo " $(COLOR_BLUE)$$example$(COLOR_RESET)"; \ + done + @echo "" + @echo "$(COLOR_BOLD)Examples:$(COLOR_RESET)" + @echo " make build BACKEND=sdl EXAMPLE=sample1" + @echo " make build BACKEND=x11 EXAMPLE=sample2" + @echo "" + @echo "$(COLOR_BOLD)Quick Build:$(COLOR_RESET)" + @echo " make quick - Interactive mode" + @echo " make clean - Clean build files" + @echo "" -# Source files -SOURCES = sample1.cpp graphics.cpp -OBJECTS = $(SOURCES:.cpp=.o) +# Interactive quick build +.PHONY: quick +quick: + @echo "$(COLOR_BOLD)$(COLOR_GREEN)Select Backend:$(COLOR_RESET)" + @echo "1) SDL2 (recommended, cross-platform)" +ifeq ($(PLATFORM),Windows) + @echo "2) Win32 (Windows native)" +else + @echo "2) X11 (Linux native)" +endif + @read -p "Enter choice [1-2]: " choice; \ + if [ "$$choice" = "1" ]; then \ + BACKEND_CHOICE="sdl"; \ + elif [ "$$choice" = "2" ]; then \ + if [ "$(PLATFORM)" = "Windows" ]; then \ + BACKEND_CHOICE="win32"; \ + else \ + BACKEND_CHOICE="x11"; \ + fi; \ + else \ + echo "$(COLOR_RED)Invalid choice$(COLOR_RESET)"; \ + exit 1; \ + fi; \ + echo ""; \ + echo "$(COLOR_BOLD)$(COLOR_GREEN)Select Example:$(COLOR_RESET)"; \ + i=1; \ + for example in $(EXAMPLE_NAMES); do \ + echo "$$i) $$example"; \ + i=$$((i+1)); \ + done; \ + read -p "Enter choice [1-$(words $(EXAMPLE_NAMES))]: " choice; \ + EXAMPLE_CHOICE=$$(echo "$(EXAMPLE_NAMES)" | cut -d' ' -f$$choice); \ + if [ -z "$$EXAMPLE_CHOICE" ]; then \ + echo "$(COLOR_RED)Invalid choice$(COLOR_RESET)"; \ + exit 1; \ + fi; \ + echo ""; \ + echo "$(COLOR_BOLD)Building $$EXAMPLE_CHOICE with $$BACKEND_CHOICE backend...$(COLOR_RESET)"; \ + $(MAKE) build BACKEND=$$BACKEND_CHOICE EXAMPLE=$$EXAMPLE_CHOICE -# Output executable -TARGET = sample.exe +# Build target +.PHONY: build +build: validate + @echo "$(COLOR_BOLD)$(COLOR_GREEN)Building $(EXAMPLE) with $(BACKEND) backend...$(COLOR_RESET)" + @$(MKDIR) $(BUILD_DIR) 2>/dev/null || true + $(CXX) $(CXXFLAGS) $(BACKEND_DEFINE) $(INCLUDES) \ + $(EXAMPLES_DIR)/$(EXAMPLE).cpp $(LIB_SOURCE) \ + -o $(BUILD_DIR)/$(EXAMPLE)$(EXE_EXT) \ + $(LDFLAGS) $(LIBS) + @echo "$(COLOR_BOLD)$(COLOR_GREEN)✓ Build successful!$(COLOR_RESET)" + @echo "$(COLOR_BOLD)Output:$(COLOR_RESET) $(BUILD_DIR)/$(EXAMPLE)$(EXE_EXT)" +ifeq ($(BACKEND),sdl) +ifeq ($(PLATFORM),Windows) + @if [ -f "$(LIB_DIR)/SDL2.dll" ]; then \ + cp $(LIB_DIR)/SDL2.dll $(BUILD_DIR)/ 2>/dev/null || copy $(LIB_DIR)$(PATH_SEP)SDL2.dll $(BUILD_DIR)$(PATH_SEP) 2>nul || true; \ + echo "$(COLOR_BLUE)✓ SDL2.dll copied to build directory$(COLOR_RESET)"; \ + elif [ -f "$(SDL2_PATH)/bin/SDL2.dll" ]; then \ + cp $(SDL2_PATH)/bin/SDL2.dll $(BUILD_DIR)/ 2>/dev/null || copy $(SDL2_PATH)$(PATH_SEP)bin$(PATH_SEP)SDL2.dll $(BUILD_DIR)$(PATH_SEP) 2>nul || true; \ + echo "$(COLOR_BLUE)✓ SDL2.dll copied from SDL2 installation$(COLOR_RESET)"; \ + fi +endif +endif + @echo "" + @echo "$(COLOR_BOLD)Run with:$(COLOR_RESET)" + @echo " ./$(BUILD_DIR)/$(EXAMPLE)$(EXE_EXT)" -# Default target -all: $(TARGET) +# Validate inputs +.PHONY: validate +validate: +ifndef BACKEND + @echo "$(COLOR_RED)Error: BACKEND not specified$(COLOR_RESET)" + @echo "Run 'make' or 'make quick' for interactive mode" + @exit 1 +endif +ifndef EXAMPLE + @echo "$(COLOR_RED)Error: EXAMPLE not specified$(COLOR_RESET)" + @echo "Run 'make' or 'make quick' for interactive mode" + @exit 1 +endif + @if ! echo "$(AVAILABLE_BACKENDS)" | grep -w "$(BACKEND)" > /dev/null; then \ + echo "$(COLOR_RED)Error: Invalid backend '$(BACKEND)'$(COLOR_RESET)"; \ + echo "Available: $(AVAILABLE_BACKENDS)"; \ + exit 1; \ + fi + @if [ ! -f "$(EXAMPLES_DIR)/$(EXAMPLE).cpp" ]; then \ + echo "$(COLOR_RED)Error: Example '$(EXAMPLE)' not found$(COLOR_RESET)"; \ + echo "Available examples:"; \ + for ex in $(EXAMPLE_NAMES); do echo " $$ex"; done; \ + exit 1; \ + fi +ifeq ($(BACKEND),win32) +ifneq ($(PLATFORM),Windows) + @echo "$(COLOR_RED)Error: win32 backend only available on Windows$(COLOR_RESET)" + @exit 1 +endif +endif +ifeq ($(BACKEND),x11) +ifeq ($(PLATFORM),Windows) + @echo "$(COLOR_RED)Error: x11 backend only available on Linux$(COLOR_RESET)" + @exit 1 +endif +endif -# Link the executable -$(TARGET): $(OBJECTS) - $(CXX) $(OBJECTS) -o $(TARGET) $(LDFLAGS) $(LIBS) - @echo "Build complete! Run with: ./$(TARGET)" - @echo "Note: Make sure SDL2.dll is in the same directory or in your PATH" +# Build all examples with specified backend +.PHONY: build-all +build-all: +ifndef BACKEND + @echo "$(COLOR_RED)Error: BACKEND not specified$(COLOR_RESET)" + @echo "Usage: make build-all BACKEND=" + @exit 1 +endif + @echo "$(COLOR_BOLD)$(COLOR_GREEN)Building all examples with $(BACKEND) backend...$(COLOR_RESET)" + @for example in $(EXAMPLE_NAMES); do \ + echo ""; \ + $(MAKE) build BACKEND=$(BACKEND) EXAMPLE=$$example; \ + done + @echo "" + @echo "$(COLOR_BOLD)$(COLOR_GREEN)✓ All examples built successfully!$(COLOR_RESET)" -# Compile source files -%.o: %.cpp graphics.h - $(CXX) $(CXXFLAGS) $(INCLUDES) -c $< -o $@ +# Run an example +.PHONY: run +run: build + @echo "$(COLOR_BOLD)$(COLOR_GREEN)Running $(EXAMPLE)...$(COLOR_RESET)" + @cd $(BUILD_DIR) && ./$(EXAMPLE)$(EXE_EXT) # Clean build files +.PHONY: clean clean: - rm -f $(OBJECTS) $(TARGET) - -# Run the program -run: $(TARGET) - ./$(TARGET) + @echo "$(COLOR_BOLD)Cleaning build files...$(COLOR_RESET)" +ifeq ($(PLATFORM),Windows) + @if exist $(BUILD_DIR) $(RMDIR) $(BUILD_DIR) 2>nul || true +else + @$(RMDIR) $(BUILD_DIR) 2>/dev/null || true +endif + @echo "$(COLOR_GREEN)✓ Clean complete$(COLOR_RESET)" # Help -help: - @echo "Makefile for Graphics Demo" - @echo "" - @echo "Targets:" - @echo " make - Build the project" - @echo " make clean - Remove build files" - @echo " make run - Build and run the program" - @echo " make help - Show this help message" +.PHONY: help +help: menu + +# Show configuration +.PHONY: config +config: + @echo "$(COLOR_BOLD)Current Configuration:$(COLOR_RESET)" + @echo " Platform: $(PLATFORM)" + @echo " Compiler: $(CXX)" + @echo " Lib Dir: $(LIB_DIR)" + @echo " Examples: $(EXAMPLES_DIR)" + @echo " Build Dir: $(BUILD_DIR)" @echo "" - @echo "Configuration:" - @echo " Set SDL2_PATH environment variable or edit the Makefile" - @echo " Current SDL2_PATH: $(SDL2_PATH)" + @echo "$(COLOR_BOLD)Available Examples:$(COLOR_RESET)" + @for example in $(EXAMPLE_NAMES); do \ + echo " - $$example"; \ + done @echo "" - @echo "Example:" - @echo " make SDL2_PATH=D:/SDL2-2.28.0" + @echo "$(COLOR_BOLD)Available Backends:$(COLOR_RESET)" + @echo " - sdl (SDL2)" +ifeq ($(PLATFORM),Windows) + @echo " - win32 (Win32 API)" +else + @echo " - x11 (X11)" +endif -.PHONY: all clean run help \ No newline at end of file +.DEFAULT_GOAL := menu -- cgit v1.2.3