(Feat): Initial Commit.
This commit is contained in:
125
Makefile
Normal file
125
Makefile
Normal file
@@ -0,0 +1,125 @@
|
||||
SRCDIR := src
|
||||
INCDIR := include
|
||||
OBJDIR := obj
|
||||
BINDIR := bin
|
||||
|
||||
# Compiler and flags
|
||||
CC := clang
|
||||
CFLAGS := -std=c11 -Wall -Wextra -Wpedantic -Werror
|
||||
CFLAGS += -Wshadow -Wconversion -Wdouble-promotion
|
||||
CFLAGS += -Wformat=2 -Wundef -fno-common
|
||||
CFLAGS += -I$(INCDIR)
|
||||
|
||||
# Target
|
||||
TARGET := $(BINDIR)/ascii3d
|
||||
|
||||
# Source files
|
||||
SRCS := $(wildcard $(SRCDIR)/*.c)
|
||||
OBJS := $(SRCS:$(SRCDIR)/%.c=$(OBJDIR)/%.o)
|
||||
DEPS := $(OBJS:.o=.d)
|
||||
|
||||
# Libraries
|
||||
LDFLAGS := -lm
|
||||
|
||||
# Build modes
|
||||
.PHONY: all debug release clean install uninstall help
|
||||
|
||||
# Default target
|
||||
all: release
|
||||
|
||||
# Release build (optimized)
|
||||
release: CFLAGS += -O3 -DNDEBUG -march=native -flto
|
||||
release: LDFLAGS += -flto
|
||||
release: $(TARGET)
|
||||
|
||||
# Debug build (with symbols and sanitizers)
|
||||
debug: CFLAGS += -O0 -g3 -DDEBUG
|
||||
debug: CFLAGS += -fsanitize=address,undefined
|
||||
debug: LDFLAGS += -fsanitize=address,undefined
|
||||
debug: $(TARGET)
|
||||
|
||||
# Profile build (optimized with debug symbols)
|
||||
profile: CFLAGS += -O2 -g -pg
|
||||
profile: LDFLAGS += -pg
|
||||
profile: $(TARGET)
|
||||
|
||||
# Create directories
|
||||
$(OBJDIR) $(BINDIR):
|
||||
@mkdir -p $@
|
||||
|
||||
# Link
|
||||
$(TARGET): $(OBJS) | $(BINDIR)
|
||||
@echo "Linking $@..."
|
||||
@$(CC) $(OBJS) -o $@ $(LDFLAGS)
|
||||
@echo "Build complete: $@"
|
||||
|
||||
# Compile
|
||||
$(OBJDIR)/%.o: $(SRCDIR)/%.c | $(OBJDIR)
|
||||
@echo "Compiling $<..."
|
||||
@$(CC) $(CFLAGS) -MMD -MP -c $< -o $@
|
||||
|
||||
# Include dependencies
|
||||
-include $(DEPS)
|
||||
|
||||
# Clean build artifacts
|
||||
clean:
|
||||
@echo "Cleaning..."
|
||||
@rm -rf $(OBJDIR) $(BINDIR)
|
||||
@echo "Clean complete."
|
||||
|
||||
# Install to system
|
||||
PREFIX ?= /usr/local
|
||||
install: release
|
||||
@echo "Installing to $(PREFIX)/bin..."
|
||||
@install -d $(PREFIX)/bin
|
||||
@install -m 755 $(TARGET) $(PREFIX)/bin/
|
||||
@echo "Installation complete."
|
||||
|
||||
# Uninstall from system
|
||||
uninstall:
|
||||
@echo "Uninstalling from $(PREFIX)/bin..."
|
||||
@rm -f $(PREFIX)/bin/ascii3d
|
||||
@echo "Uninstallation complete."
|
||||
|
||||
# Run the program
|
||||
run: release
|
||||
@./$(TARGET)
|
||||
|
||||
# Run with demo text
|
||||
demo: release
|
||||
@./$(TARGET) -a HELLO
|
||||
|
||||
# Static analysis
|
||||
analyze:
|
||||
@echo "Running static analysis..."
|
||||
@cppcheck --enable=all --std=c11 -I$(INCDIR) $(SRCDIR)/*.c
|
||||
|
||||
# Format code
|
||||
format:
|
||||
@echo "Formatting code..."
|
||||
@clang-format -i $(SRCDIR)/*.c $(INCDIR)/*.h
|
||||
|
||||
# Help
|
||||
help:
|
||||
@echo "ASCII 3D Renderer - Build System"
|
||||
@echo "================================"
|
||||
@echo ""
|
||||
@echo "Targets:"
|
||||
@echo " all - Build release version (default)"
|
||||
@echo " release - Build optimized release version"
|
||||
@echo " debug - Build debug version with sanitizers"
|
||||
@echo " profile - Build with profiling support"
|
||||
@echo " clean - Remove build artifacts"
|
||||
@echo " install - Install to system (PREFIX=/usr/local)"
|
||||
@echo " uninstall - Remove from system"
|
||||
@echo " run - Build and run"
|
||||
@echo " demo - Build and run demo"
|
||||
@echo " analyze - Run static analysis (requires cppcheck)"
|
||||
@echo " format - Format source code (requires clang-format)"
|
||||
@echo " help - Show this help"
|
||||
@echo ""
|
||||
@echo "Examples:"
|
||||
@echo " make # Build release"
|
||||
@echo " make debug # Build debug"
|
||||
@echo " make run # Build and run"
|
||||
@echo " make install PREFIX=~ # Install to home directory"
|
||||
Reference in New Issue
Block a user