notashelf /
e177e32bfd8cd3763d6a625011ee8cd2dfc9c815
chroma
publicLightweight wallpaper daemon for Wayland
clone
ssh://git@git.notashelf.dev:33/notashelf/chroma.git| 1 | PROJECT_NAME = chroma |
| 2 | VERSION = 1.0.1 |
| 3 | |
| 4 | # Directories |
| 5 | SRCDIR = src |
| 6 | INCDIR = include |
| 7 | OBJDIR = obj |
| 8 | BINDIR = bin |
| 9 | SYSTEMD_DIR = systemd |
| 10 | PROTOCOLDIR = protocols |
| 11 | |
| 12 | # Install directories |
| 13 | PREFIX ?= /usr/local |
| 14 | BINDIR_INSTALL = $(PREFIX)/bin |
| 15 | SYSTEMD_INSTALL = $(HOME)/.config/systemd/user |
| 16 | |
| 17 | # Compiler and flags |
| 18 | CC = gcc |
| 19 | CFLAGS = -std=c11 -Wall -Wextra -Werror -pedantic -O2 -g |
| 20 | CFLAGS += -D_GNU_SOURCE -DCHROMA_VERSION=\"$(VERSION)\" |
| 21 | CPPFLAGS = -I$(INCDIR) |
| 22 | |
| 23 | # Debug build flags |
| 24 | DEBUG_CFLAGS = -std=c11 -Wall -Wextra -Werror -pedantic -Og -g3 -DDEBUG |
| 25 | DEBUG_CFLAGS += -D_GNU_SOURCE -DCHROMA_VERSION=\"$(VERSION)-debug\" |
| 26 | DEBUG_CFLAGS += -fsanitize=address -fsanitize=undefined -fno-omit-frame-pointer |
| 27 | |
| 28 | # Libraries using pkg-config |
| 29 | PKG_DEPS = wayland-client wayland-egl egl glesv2 wayland-protocols |
| 30 | CFLAGS += $(shell pkg-config --cflags $(PKG_DEPS)) |
| 31 | LDFLAGS += $(shell pkg-config --libs $(PKG_DEPS)) |
| 32 | |
| 33 | # Protocol files |
| 34 | PROTOCOL_XML = $(PROTOCOLDIR)/xdg-shell.xml $(PROTOCOLDIR)/wlr-layer-shell-unstable-v1.xml |
| 35 | PROTOCOL_HEADERS = $(PROTOCOL_XML:$(PROTOCOLDIR)/%.xml=$(INCDIR)/%.h) |
| 36 | PROTOCOL_SOURCES = $(PROTOCOL_XML:$(PROTOCOLDIR)/%.xml=$(SRCDIR)/%.c) |
| 37 | PROTOCOL_OBJECTS = $(PROTOCOL_SOURCES:$(SRCDIR)/%.c=$(OBJDIR)/%.o) |
| 38 | |
| 39 | # Additional libraries |
| 40 | LDFLAGS += -lm -ldl |
| 41 | |
| 42 | # Source files (excluding generated protocol files) |
| 43 | SOURCES = $(filter-out $(PROTOCOL_SOURCES), $(wildcard $(SRCDIR)/*.c)) |
| 44 | OBJECTS = $(SOURCES:$(SRCDIR)/%.c=$(OBJDIR)/%.o) $(PROTOCOL_OBJECTS) |
| 45 | DEPENDS = $(OBJECTS:.o=.d) |
| 46 | |
| 47 | # Default target |
| 48 | TARGET = $(BINDIR)/$(PROJECT_NAME) |
| 49 | all: $(TARGET) |
| 50 | |
| 51 | # Create directories |
| 52 | $(OBJDIR): |
| 53 | @mkdir -p $(OBJDIR) |
| 54 | |
| 55 | $(BINDIR): |
| 56 | @mkdir -p $(BINDIR) |
| 57 | |
| 58 | # Protocol generation |
| 59 | $(INCDIR)/%.h: $(PROTOCOLDIR)/%.xml | $(INCDIR) |
| 60 | @echo " PROTO $<" |
| 61 | @wayland-scanner client-header $< $@ |
| 62 | |
| 63 | $(SRCDIR)/%.c: $(PROTOCOLDIR)/%.xml |
| 64 | @echo " PROTO $<" |
| 65 | @wayland-scanner private-code $< $@ |
| 66 | |
| 67 | # Make sure include directory exists |
| 68 | $(INCDIR): |
| 69 | @mkdir -p $(INCDIR) |
| 70 | |
| 71 | # Build main executable |
| 72 | $(TARGET): version-header $(PROTOCOL_HEADERS) $(OBJECTS) | $(BINDIR) |
| 73 | @echo " LINK $@" |
| 74 | @$(CC) $(OBJECTS) -o $@ $(LDFLAGS) |
| 75 | |
| 76 | # Compile source files |
| 77 | $(OBJDIR)/%.o: $(SRCDIR)/%.c $(PROTOCOL_HEADERS) | $(OBJDIR) |
| 78 | @echo " CC $<" |
| 79 | @$(CC) $(CPPFLAGS) $(CFLAGS) -MMD -MP -c $< -o $@ |
| 80 | |
| 81 | # Debug build |
| 82 | debug: CFLAGS = $(DEBUG_CFLAGS) |
| 83 | debug: $(TARGET) |
| 84 | |
| 85 | # Static build (for distribution) |
| 86 | static: LDFLAGS += -static |
| 87 | static: $(TARGET) |
| 88 | |
| 89 | # Check if required dependencies are available |
| 90 | check-deps: |
| 91 | @echo "Checking dependencies..." |
| 92 | @pkg-config --exists $(PKG_DEPS) || (echo "Missing dependencies. Install: wayland-protocols libwayland-dev libegl1-mesa-dev libgl1-mesa-dev wayland-scanner" && exit 1) |
| 93 | @which wayland-scanner >/dev/null || (echo "wayland-scanner not found. Please install wayland-scanner." && exit 1) |
| 94 | @echo "All dependencies found." |
| 95 | |
| 96 | # Install |
| 97 | install: $(TARGET) |
| 98 | @echo "Installing $(PROJECT_NAME)..." |
| 99 | install -Dm755 $(TARGET) $(DESTDIR)$(BINDIR_INSTALL)/$(PROJECT_NAME) |
| 100 | @if [ -f $(SYSTEMD_DIR)/$(PROJECT_NAME).service ]; then \ |
| 101 | echo "Installing systemd service..."; \ |
| 102 | install -Dm644 $(SYSTEMD_DIR)/$(PROJECT_NAME).service $(DESTDIR)$(SYSTEMD_INSTALL)/$(PROJECT_NAME).service; \ |
| 103 | fi |
| 104 | @echo "Installation complete." |
| 105 | |
| 106 | # Uninstall |
| 107 | uninstall: |
| 108 | @echo "Uninstalling $(PROJECT_NAME)..." |
| 109 | rm -f $(DESTDIR)$(BINDIR_INSTALL)/$(PROJECT_NAME) |
| 110 | rm -f $(DESTDIR)$(SYSTEMD_INSTALL)/$(PROJECT_NAME).service |
| 111 | @echo "Uninstall complete." |
| 112 | |
| 113 | # Create version header |
| 114 | version-header: |
| 115 | @echo "Generating version header..." |
| 116 | @echo "#ifndef CHROMA_VERSION_H" > $(INCDIR)/chroma_version.h |
| 117 | @echo "#define CHROMA_VERSION_H" >> $(INCDIR)/chroma_version.h |
| 118 | @echo "" >> $(INCDIR)/chroma_version.h |
| 119 | @echo "#ifndef CHROMA_VERSION" >> $(INCDIR)/chroma_version.h |
| 120 | @echo "#define CHROMA_VERSION \"$(VERSION)\"" >> $(INCDIR)/chroma_version.h |
| 121 | @echo "#endif" >> $(INCDIR)/chroma_version.h |
| 122 | @echo "" >> $(INCDIR)/chroma_version.h |
| 123 | @echo "#endif // CHROMA_VERSION_H" >> $(INCDIR)/chroma_version.h |
| 124 | |
| 125 | # Create systemd service file |
| 126 | systemd-service: $(SYSTEMD_DIR)/$(PROJECT_NAME).service |
| 127 | |
| 128 | |
| 129 | # Clean build artifacts |
| 130 | clean: |
| 131 | @echo "Cleaning build artifacts..." |
| 132 | rm -rf $(OBJDIR) $(BINDIR) |
| 133 | rm -f $(PROTOCOL_HEADERS) $(PROTOCOL_SOURCES) |
| 134 | |
| 135 | # Format source code (requires clang-format) |
| 136 | format: |
| 137 | @echo "Formatting source code..." |
| 138 | @find $(SRCDIR) $(INCDIR) -name "*.c" -o -name "*.h" | xargs clang-format -i |
| 139 | |
| 140 | # Static analysis (requires cppcheck) |
| 141 | analyze: |
| 142 | @echo "Running static analysis..." |
| 143 | @cppcheck --enable=all --std=c11 --language=c \ |
| 144 | --include=$(INCDIR) \ |
| 145 | --suppress=missingIncludeSystem \ |
| 146 | --quiet \ |
| 147 | $(SRCDIR) |
| 148 | |
| 149 | # Run tests |
| 150 | # FIXME: add tests |
| 151 | test: $(TARGET) |
| 152 | @echo "Running tests..." |
| 153 | @echo "Tests not implemented yet." |
| 154 | |
| 155 | # Version management targets |
| 156 | bump-patch: |
| 157 | @echo "Bumping patch version..." |
| 158 | @$(eval NEW_VERSION := $(shell echo $(VERSION) | awk -F. '{print $$1"."$$2"."$$3+1}')) |
| 159 | @sed -i 's/^VERSION = .*/VERSION = $(NEW_VERSION)/' Makefile |
| 160 | @echo "Version bumped to $(NEW_VERSION)" |
| 161 | |
| 162 | bump-minor: |
| 163 | @echo "Bumping minor version..." |
| 164 | @$(eval NEW_VERSION := $(shell echo $(VERSION) | awk -F. '{print $$1"."$$2+1".0"}')) |
| 165 | @sed -i 's/^VERSION = .*/VERSION = $(NEW_VERSION)/' Makefile |
| 166 | @echo "Version bumped to $(NEW_VERSION)" |
| 167 | |
| 168 | bump-major: |
| 169 | @echo "Bumping major version..." |
| 170 | @$(eval NEW_VERSION := $(shell echo $(VERSION) | awk -F. '{print $$1+1".0.0"}')) |
| 171 | @sed -i 's/^VERSION = .*/VERSION = $(NEW_VERSION)/' Makefile |
| 172 | @echo "Version bumped to $(NEW_VERSION)" |
| 173 | |
| 174 | set-version: |
| 175 | @if [ -z "$(NEW_VER)" ]; then \ |
| 176 | echo "Usage: make set-version NEW_VER=X.Y.Z"; \ |
| 177 | exit 1; \ |
| 178 | fi |
| 179 | @echo "Setting version to $(NEW_VER)..." |
| 180 | @sed -i 's/^VERSION = .*/VERSION = $(NEW_VER)/' Makefile |
| 181 | @echo "Version set to $(NEW_VER)" |
| 182 | |
| 183 | # Help target |
| 184 | help: |
| 185 | @echo "Available targets:" |
| 186 | @echo " all - Build main executable (default)" |
| 187 | @echo " debug - Build with debug symbols and sanitizers" |
| 188 | @echo " static - Build statically linked executable" |
| 189 | @echo " check-deps - Check if all dependencies are available" |
| 190 | @echo " install - Install executable and systemd service" |
| 191 | @echo " uninstall - Remove installed files" |
| 192 | @echo " clean - Remove build artifacts" |
| 193 | @echo " distclean - Remove all generated files" |
| 194 | @echo " format - Format source code (requires clang-format)" |
| 195 | @echo " analyze - Run static analysis (requires cppcheck)" |
| 196 | @echo " test - Run tests" |
| 197 | @echo " version-header - Generate version header from Makefile" |
| 198 | @echo " bump-patch - Increment patch version (X.Y.Z+1)" |
| 199 | @echo " bump-minor - Increment minor version (X.Y+1.0)" |
| 200 | @echo " bump-major - Increment major version (X+1.0.0)" |
| 201 | @echo " set-version - Set specific version (use NEW_VER=X.Y.Z)" |
| 202 | @echo " help - Show this help message" |
| 203 | @echo "" |
| 204 | @echo "Examples:" |
| 205 | @echo " make # Build with default settings" |
| 206 | @echo " make debug # Build debug version" |
| 207 | @echo " make PREFIX=/usr install # Install to /usr instead of /usr/local" |
| 208 | @echo " make CC=clang # Use clang instead of gcc" |
| 209 | @echo " make bump-patch # Bump to 1.0.2" |
| 210 | @echo " make set-version NEW_VER=2.0.0 # Set to 2.0.0" |
| 211 | |
| 212 | # Include dependency files |
| 213 | -include $(DEPENDS) |
| 214 | |
| 215 | # Phony targets |
| 216 | .PHONY: all debug static check-deps install uninstall systemd-service version-header sample-config clean distclean format analyze test help bump-patch bump-minor bump-major set-version |
| 217 | |
| 218 | # Print variables |
| 219 | print-%: |
| 220 | @echo '$*=$($*)' |