brewery
notashelf /
ebdc3fe08e4cdde737abc0080b067fd6c86e093c

chroma

public

Lightweight wallpaper daemon for Wayland

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