brewery
notashelf /
237a013e0331cc6f497559079d17f4659ceecd8e

chroma

public

Lightweight wallpaper daemon for Wayland

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