chore: add MIT license, Makefile, and initial build artifacts for DWN project
This commit is contained in:
@@ -0,0 +1,263 @@
|
||||
# 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)"
|
||||
Reference in New Issue
Block a user