|
# DWN - Desktop Window Manager
|
|
# Simple Makefile - just run 'make' to build!
|
|
|
|
# Compiler settings
|
|
CC = gcc
|
|
CFLAGS = -Wall -Wextra -O2 -I./include
|
|
LDFLAGS = -lX11 -lXext -lXinerama -lXrandr -lXft -lfontconfig -ldbus-1 -lcurl -lm -lpthread
|
|
|
|
# Directories
|
|
SRC_DIR = src
|
|
INC_DIR = include
|
|
BUILD_DIR = build
|
|
BIN_DIR = bin
|
|
|
|
# Find all source files automatically
|
|
SRCS = $(wildcard $(SRC_DIR)/*.c)
|
|
OBJS = $(SRCS:$(SRC_DIR)/%.c=$(BUILD_DIR)/%.o)
|
|
DEPS = $(OBJS:.o=.d)
|
|
|
|
# Output binary
|
|
TARGET = $(BIN_DIR)/dwn
|
|
|
|
# Installation paths
|
|
PREFIX ?= /usr/local
|
|
BINDIR = $(PREFIX)/bin
|
|
DATADIR = $(PREFIX)/share
|
|
SYSCONFDIR = /etc
|
|
|
|
# Get pkg-config flags (with error handling)
|
|
PKG_CFLAGS := $(shell pkg-config --cflags x11 xext xinerama xrandr xft fontconfig dbus-1 2>/dev/null)
|
|
PKG_LIBS := $(shell pkg-config --libs x11 xext xinerama xrandr xft fontconfig dbus-1 2>/dev/null)
|
|
|
|
# Use pkg-config if available
|
|
ifneq ($(PKG_LIBS),)
|
|
LDFLAGS = $(PKG_LIBS) -lcurl -lm -lpthread
|
|
endif
|
|
ifneq ($(PKG_CFLAGS),)
|
|
CFLAGS += $(PKG_CFLAGS)
|
|
endif
|
|
|
|
# =============================================================================
|
|
# MAIN TARGETS
|
|
# =============================================================================
|
|
|
|
.PHONY: all help clean install uninstall debug run test deps check-deps
|
|
|
|
# Default target - show help if first time, otherwise build
|
|
all: check-deps $(TARGET)
|
|
@echo ""
|
|
@echo "Build successful! Binary created at: $(TARGET)"
|
|
@echo ""
|
|
@echo "Next steps:"
|
|
@echo " make run - Test DWN in a window (safe, doesn't affect your desktop)"
|
|
@echo " make install - Install DWN system-wide"
|
|
@echo ""
|
|
|
|
# Show help
|
|
help:
|
|
@echo "=============================================="
|
|
@echo " DWN - Desktop Window Manager"
|
|
@echo "=============================================="
|
|
@echo ""
|
|
@echo "QUICK START:"
|
|
@echo " make deps - Install required dependencies (Ubuntu/Debian)"
|
|
@echo " make - Build DWN"
|
|
@echo " make run - Test DWN in a safe window"
|
|
@echo " make install - Install to your system"
|
|
@echo ""
|
|
@echo "ALL COMMANDS:"
|
|
@echo " make - Build DWN (release version)"
|
|
@echo " make debug - Build with debug symbols"
|
|
@echo " make run - Test in Xephyr window (safe!)"
|
|
@echo " make install - Install to $(BINDIR)"
|
|
@echo " make uninstall- Remove from system"
|
|
@echo " make clean - Remove build files"
|
|
@echo " make deps - Install dependencies (needs sudo)"
|
|
@echo " make help - Show this help"
|
|
@echo ""
|
|
@echo "AFTER INSTALL:"
|
|
@echo " 1. Log out of your current session"
|
|
@echo " 2. At login screen, select 'DWN' as your session"
|
|
@echo " 3. Log in and enjoy!"
|
|
@echo ""
|
|
|
|
# =============================================================================
|
|
# BUILD TARGETS
|
|
# =============================================================================
|
|
|
|
# Build with debug symbols
|
|
debug: CFLAGS += -g -DDEBUG
|
|
debug: clean $(TARGET)
|
|
@echo "Debug build complete!"
|
|
|
|
# Link all object files into final binary
|
|
$(TARGET): $(OBJS) | $(BIN_DIR)
|
|
@echo "Linking..."
|
|
@$(CC) $(OBJS) -o $@ $(LDFLAGS)
|
|
|
|
# Compile each source file
|
|
$(BUILD_DIR)/%.o: $(SRC_DIR)/%.c | $(BUILD_DIR)
|
|
@echo "Compiling $<..."
|
|
@$(CC) $(CFLAGS) -MMD -MP -c $< -o $@
|
|
|
|
# Create build directory
|
|
$(BUILD_DIR):
|
|
@mkdir -p $(BUILD_DIR)
|
|
|
|
# Create bin directory
|
|
$(BIN_DIR):
|
|
@mkdir -p $(BIN_DIR)
|
|
|
|
# Include dependency files
|
|
-include $(DEPS)
|
|
|
|
# =============================================================================
|
|
# INSTALL / UNINSTALL
|
|
# =============================================================================
|
|
|
|
install: $(TARGET)
|
|
@echo "Installing DWN..."
|
|
@install -Dm755 $(TARGET) $(DESTDIR)$(BINDIR)/dwn
|
|
@install -Dm644 scripts/dwn.desktop $(DESTDIR)$(DATADIR)/xsessions/dwn.desktop
|
|
@mkdir -p $(DESTDIR)$(SYSCONFDIR)/dwn
|
|
@install -Dm644 config/config.example $(DESTDIR)$(SYSCONFDIR)/dwn/config.example
|
|
@echo ""
|
|
@echo "=============================================="
|
|
@echo " Installation complete!"
|
|
@echo "=============================================="
|
|
@echo ""
|
|
@echo "To configure DWN, run:"
|
|
@echo " mkdir -p ~/.config/dwn"
|
|
@echo " cp $(SYSCONFDIR)/dwn/config.example ~/.config/dwn/config"
|
|
@echo ""
|
|
@echo "Then log out and select 'DWN' at the login screen!"
|
|
@echo ""
|
|
|
|
uninstall:
|
|
@echo "Removing DWN..."
|
|
@rm -f $(DESTDIR)$(BINDIR)/dwn
|
|
@rm -f $(DESTDIR)$(DATADIR)/xsessions/dwn.desktop
|
|
@rm -rf $(DESTDIR)$(SYSCONFDIR)/dwn
|
|
@echo "DWN has been uninstalled."
|
|
|
|
# =============================================================================
|
|
# DEVELOPMENT / TESTING
|
|
# =============================================================================
|
|
|
|
# Test DWN in a nested X server (safe - doesn't touch your desktop)
|
|
run: $(TARGET)
|
|
@echo "Starting DWN in test mode..."
|
|
@echo "(Press Alt+Shift+Q inside the window to quit)"
|
|
Xephyr :1 -screen 1280x720 &
|
|
sleep 1
|
|
DISPLAY=:1 $(TARGET)
|
|
|
|
# Clean build files
|
|
clean:
|
|
@echo "Cleaning build files..."
|
|
@rm -rf $(BUILD_DIR) $(BIN_DIR)
|
|
@echo "Clean complete."
|
|
|
|
# =============================================================================
|
|
# DEPENDENCY MANAGEMENT
|
|
# =============================================================================
|
|
|
|
# Check if dependencies are installed
|
|
check-deps:
|
|
@command -v pkg-config >/dev/null 2>&1 || { \
|
|
echo "ERROR: pkg-config is not installed!"; \
|
|
echo "Run: make deps"; \
|
|
exit 1; \
|
|
}
|
|
@pkg-config --exists x11 2>/dev/null || { \
|
|
echo "ERROR: X11 development libraries not found!"; \
|
|
echo "Run: make deps"; \
|
|
exit 1; \
|
|
}
|
|
@pkg-config --exists dbus-1 2>/dev/null || { \
|
|
echo "ERROR: D-Bus development libraries not found!"; \
|
|
echo "Run: make deps"; \
|
|
exit 1; \
|
|
}
|
|
|
|
# Install dependencies (Ubuntu/Debian)
|
|
deps:
|
|
@echo "Installing dependencies..."
|
|
@echo "This requires sudo (administrator) access."
|
|
@echo ""
|
|
@if command -v apt >/dev/null 2>&1; then \
|
|
sudo apt update && sudo apt install -y \
|
|
build-essential \
|
|
pkg-config \
|
|
libx11-dev \
|
|
libxext-dev \
|
|
libxinerama-dev \
|
|
libxrandr-dev \
|
|
libxft-dev \
|
|
libfontconfig1-dev \
|
|
libdbus-1-dev \
|
|
libcurl4-openssl-dev \
|
|
xserver-xephyr \
|
|
dmenu; \
|
|
echo ""; \
|
|
echo "Dependencies installed successfully!"; \
|
|
echo "Now run: make"; \
|
|
elif command -v dnf >/dev/null 2>&1; then \
|
|
sudo dnf install -y \
|
|
gcc make \
|
|
pkg-config \
|
|
libX11-devel \
|
|
libXext-devel \
|
|
libXinerama-devel \
|
|
libXrandr-devel \
|
|
dbus-devel \
|
|
libcurl-devel \
|
|
xorg-x11-server-Xephyr \
|
|
dmenu; \
|
|
echo ""; \
|
|
echo "Dependencies installed successfully!"; \
|
|
echo "Now run: make"; \
|
|
elif command -v pacman >/dev/null 2>&1; then \
|
|
sudo pacman -S --needed \
|
|
base-devel \
|
|
pkg-config \
|
|
libx11 \
|
|
libxext \
|
|
libxinerama \
|
|
libxrandr \
|
|
dbus \
|
|
curl \
|
|
xorg-server-xephyr \
|
|
dmenu; \
|
|
echo ""; \
|
|
echo "Dependencies installed successfully!"; \
|
|
echo "Now run: make"; \
|
|
else \
|
|
echo "ERROR: Could not detect package manager!"; \
|
|
echo "Please install these packages manually:"; \
|
|
echo " - GCC and Make"; \
|
|
echo " - pkg-config"; \
|
|
echo " - X11, Xext, Xinerama, Xrandr development libraries"; \
|
|
echo " - D-Bus development library"; \
|
|
echo " - libcurl development library"; \
|
|
echo " - Xephyr (for testing)"; \
|
|
echo " - dmenu (for app launcher)"; \
|
|
exit 1; \
|
|
fi
|
|
|
|
# =============================================================================
|
|
# CODE QUALITY (for developers)
|
|
# =============================================================================
|
|
|
|
.PHONY: format check
|
|
|
|
format:
|
|
@echo "Formatting code..."
|
|
@clang-format -i $(SRC_DIR)/*.c $(INC_DIR)/*.h 2>/dev/null || \
|
|
echo "Note: clang-format not installed (optional)"
|
|
|
|
check:
|
|
@echo "Running static analysis..."
|
|
@cppcheck --enable=all --inconclusive -I$(INC_DIR) $(SRC_DIR) 2>/dev/null || \
|
|
echo "Note: cppcheck not installed (optional)"
|