summaryrefslogtreecommitdiff
path: root/Makefile
diff options
context:
space:
mode:
authordawidg81 <dawidgorski.m@gmail.com>2026-02-13 10:39:08 +0100
committerdawidg81 <dawidgorski.m@gmail.com>2026-02-13 10:39:08 +0100
commit2868236d6a7ec4ec46c7e0224e3bb1821fa2be7c (patch)
tree222df4c16ada7e1d7860e9cf2a95439b844ff8b8 /Makefile
parent6415fc25141eef3d3efc7d7ac67bb564c499e7e0 (diff)
Updated README.md; Implemented more backends; more build files, native for windows
Diffstat (limited to 'Makefile')
-rw-r--r--Makefile255
1 files changed, 83 insertions, 172 deletions
diff --git a/Makefile b/Makefile
index 73fd5cd..6342e67 100644
--- a/Makefile
+++ b/Makefile
@@ -1,16 +1,8 @@
# Makefile for libgraffik
-# Smart build system with interactive backend and example selection
-
-# 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
+# Windows-compatible build system
# Compiler
-CXX ?= g++
+CXX = g++
# Directories
LIB_DIR = lib
@@ -24,25 +16,22 @@ CXXFLAGS = -std=c++11 -Wall -Wextra -I$(LIB_DIR)
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 = \\
+ifdef OS
+ ifeq ($(OS),Windows_NT)
+ PLATFORM = Windows
+ EXE_EXT = .exe
+ RM = del /Q
+ RMDIR = rmdir /S /Q
+ MKDIR = if not exist $(BUILD_DIR) mkdir $(BUILD_DIR)
+ endif
else
PLATFORM = Linux
EXE_EXT =
RM = rm -f
RMDIR = rm -rf
- MKDIR = mkdir -p
- PATH_SEP = /
+ MKDIR = mkdir -p $(BUILD_DIR)
endif
-# Available backends
-AVAILABLE_BACKENDS = sdl win32 x11
-
# Backend-specific settings
ifeq ($(BACKEND),sdl)
BACKEND_DEFINE = -DUSE_SDL
@@ -69,205 +58,127 @@ else ifeq ($(BACKEND),x11)
endif
# Find all example files
-EXAMPLE_FILES = $(wildcard $(EXAMPLES_DIR)/*.cpp)
-EXAMPLE_NAMES = $(basename $(notdir $(EXAMPLE_FILES)))
+EXAMPLE_FILES := $(wildcard $(EXAMPLES_DIR)/*.cpp)
+EXAMPLE_NAMES := $(basename $(notdir $(EXAMPLE_FILES)))
-# Default target - show menu
+# Default target - show help
.PHONY: all
-all: menu
+all: help
-# 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=<backend> EXAMPLE=<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 ""
-
-# 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
+# Help menu
+.PHONY: help
+help:
+ @echo ========================================
+ @echo libgraffik Build System
+ @echo ========================================
+ @echo.
+ @echo Platform: $(PLATFORM)
+ @echo.
+ @echo Usage:
+ @echo make build BACKEND=^<backend^> EXAMPLE=^<example^>
+ @echo.
+ @echo Available Backends:
+ @echo sdl - SDL2 (cross-platform)
+ @echo win32 - Win32 API (Windows only)
+ @echo x11 - X11 (Linux only)
+ @echo.
+ @echo Available Examples:
+ @for %%f in ($(EXAMPLES_DIR)\*.cpp) do @echo %%~nf
+ @echo.
+ @echo Example Commands:
+ @echo make build BACKEND=sdl EXAMPLE=sample1
+ @echo make build BACKEND=win32 EXAMPLE=sample2
+ @echo make run BACKEND=sdl EXAMPLE=sample1
+ @echo make build-all BACKEND=sdl
+ @echo make clean
+ @echo.
# 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
+ @echo Building $(EXAMPLE) with $(BACKEND) backend...
+ @$(MKDIR)
$(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)"
+ @echo Build successful!
+ @echo Output: $(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
+ @if exist $(LIB_DIR)\SDL2.dll copy $(LIB_DIR)\SDL2.dll $(BUILD_DIR)\ >nul 2>&1
+ @if exist $(SDL2_PATH)\bin\SDL2.dll if not exist $(BUILD_DIR)\SDL2.dll copy $(SDL2_PATH)\bin\SDL2.dll $(BUILD_DIR)\ >nul 2>&1
endif
endif
- @echo ""
- @echo "$(COLOR_BOLD)Run with:$(COLOR_RESET)"
- @echo " ./$(BUILD_DIR)/$(EXAMPLE)$(EXE_EXT)"
+ @echo.
+ @echo Run with: $(BUILD_DIR)\$(EXAMPLE)$(EXE_EXT)
# 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"
+ @echo Error: BACKEND not specified
+ @echo Usage: make build BACKEND=^<backend^> EXAMPLE=^<example^>
+ @echo Run 'make help' for more information
@exit 1
endif
ifndef EXAMPLE
- @echo "$(COLOR_RED)Error: EXAMPLE not specified$(COLOR_RESET)"
- @echo "Run 'make' or 'make quick' for interactive mode"
+ @echo Error: EXAMPLE not specified
+ @echo Usage: make build BACKEND=^<backend^> EXAMPLE=^<example^>
+ @echo Run 'make help' for more information
@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
+ @if not exist $(EXAMPLES_DIR)\$(EXAMPLE).cpp (echo Error: Example '$(EXAMPLE)' not found & exit 1)
# 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=<backend>"
+ @echo Error: BACKEND not specified
+ @echo Usage: make build-all BACKEND=^<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)"
+ @echo Building all examples with $(BACKEND) backend...
+ @for %%f in ($(EXAMPLES_DIR)\*.cpp) do @$(MAKE) --no-print-directory build BACKEND=$(BACKEND) EXAMPLE=%%~nf
+ @echo.
+ @echo All examples built successfully!
# Run an example
.PHONY: run
run: build
- @echo "$(COLOR_BOLD)$(COLOR_GREEN)Running $(EXAMPLE)...$(COLOR_RESET)"
- @cd $(BUILD_DIR) && ./$(EXAMPLE)$(EXE_EXT)
+ @echo Running $(EXAMPLE)...
+ @cd $(BUILD_DIR) && $(EXAMPLE)$(EXE_EXT)
# Clean build files
.PHONY: clean
clean:
- @echo "$(COLOR_BOLD)Cleaning build files...$(COLOR_RESET)"
+ @echo Cleaning build files...
ifeq ($(PLATFORM),Windows)
- @if exist $(BUILD_DIR) $(RMDIR) $(BUILD_DIR) 2>nul || true
+ @if exist $(BUILD_DIR) $(RMDIR) $(BUILD_DIR) 2>nul
else
@$(RMDIR) $(BUILD_DIR) 2>/dev/null || true
endif
- @echo "$(COLOR_GREEN)✓ Clean complete$(COLOR_RESET)"
-
-# Help
-.PHONY: help
-help: menu
+ @echo Clean complete
# 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 "$(COLOR_BOLD)Available Examples:$(COLOR_RESET)"
- @for example in $(EXAMPLE_NAMES); do \
- echo " - $$example"; \
- done
- @echo ""
- @echo "$(COLOR_BOLD)Available Backends:$(COLOR_RESET)"
- @echo " - sdl (SDL2)"
+ @echo Current Configuration:
+ @echo Platform: $(PLATFORM)
+ @echo Compiler: $(CXX)
+ @echo Lib Dir: $(LIB_DIR)
+ @echo Examples: $(EXAMPLES_DIR)
+ @echo Build Dir: $(BUILD_DIR)
+ @echo.
+ @echo Available Examples:
+ @for %%f in ($(EXAMPLES_DIR)\*.cpp) do @echo - %%~nf
+ @echo.
+ @echo Available Backends:
+ @echo - sdl (SDL2)
ifeq ($(PLATFORM),Windows)
- @echo " - win32 (Win32 API)"
+ @echo - win32 (Win32 API)
else
- @echo " - x11 (X11)"
+ @echo - x11 (X11)
endif
-.DEFAULT_GOAL := menu
+.DEFAULT_GOAL := help