Makefile 9.4 KiB raw
1
include config.mk
2
3
PKGS = wayland-server xkbcommon libinput xcb xcb-icccm
4
5
CPPFLAGS += -I. -DWLR_USE_UNSTABLE -D_POSIX_C_SOURCE=200809L \
6
	        -DVERSION=\"$(VERSION)\" \
7
	        `$(PKG_CONFIG) --cflags $(PKGS)` $(WLR_INCS)
8
CFLAGS   := -fvisibility=hidden -std=c23 -Os \
9
	        -Wall -Wextra -Wpedantic \
10
	        -Wformat=2 -Wformat-security \
11
	        -Wnull-dereference -Wno-format-nonliteral \
12
	        -Wunused -Wuninitialized -Wmissing-field-initializers \
13
	        -Wdeclaration-after-statement -Wno-unused-parameter \
14
	        -Wshadow -Wunused-macros \
15
	        -Werror=strict-prototypes -Werror=implicit -Werror=return-type \
16
	        -Werror=incompatible-pointer-types -Wfloat-conversion \
17
	        -fno-common -fstack-protector-all -mcmodel=medium
18
LDFLAGS  := -fuse-ld=lld
19
LDLIBS   := `$(PKG_CONFIG) --libs $(PKGS)` $(WLR_LIBS) -lm $(LIBS)
20
21
# swmctl
22
CTL_PKGS      = wayland-client
23
CTL_CPPFLAGS := `$(PKG_CONFIG) --cflags $(CTL_PKGS)`
24
CTL_LDLIBS   := `$(PKG_CONFIG) --libs $(CTL_PKGS)`
25
26
SRC   := swm.c util.c ext-workspace-v1-protocol.c swm-toplevel-v1-protocol.c \
27
	swm-workspace-v1-protocol.c
28
OBJ   := $(SRC:.c=.o)
29
PROTO := \
30
	cursor-shape-v1-protocol.h \
31
	ext-workspace-v1-protocol.h \
32
	pointer-constraints-unstable-v1-protocol.h \
33
	wlr-layer-shell-unstable-v1-protocol.h \
34
	wlr-output-power-management-unstable-v1-protocol.h \
35
	swm-workspace-v1-protocol.h \
36
	swm-toplevel-v1-protocol.h \
37
	xdg-shell-protocol.h
38
HDRS  := config.h swm.h util.h $(PROTO)
39
40
WL_SCANNER := $(shell $(PKG_CONFIG) --variable=wayland_scanner wayland-scanner)
41
WL_PROTO   := $(shell $(PKG_CONFIG) --variable=pkgdatadir wayland-protocols)
42
43
TEST_BUILD    ?= test/.build
44
TEST_SRC      := $(TEST_BUILD)/source
45
TEST_BIN      := $(TEST_BUILD)/bin
46
TEST_CPPFLAGS := -I$(TEST_SRC) $(CPPFLAGS)
47
TEST_CFLAGS   := -std=c23 -g -O0 \
48
	-Wno-unused-function -Wno-unused-variable -Wno-unused-parameter
49
50
ifeq ($(TEST_COVERAGE),1)
51
TEST_CFLAGS += -fprofile-instr-generate -fcoverage-mapping
52
endif
53
54
all: man swm swmctl
55
56
man: swm.1 swmctl.1
57
58
swm.1: swm.1.adoc
59
	@echo "man  $< => $@"
60
	@asciidoctor -b manpage -o $@ $<
61
62
swmctl.1: swmctl.1.adoc
63
	@echo "man  $< => $@"
64
	@asciidoctor -b manpage -o $@ $<
65
66
swm: $(OBJ)
67
	@echo "ld   $^ => $@"
68
	@$(CC) $(LDFLAGS) $^ $(LDLIBS) -o $@
69
	@echo "ok   $@"
70
71
swmctl: swmctl.o ext-foreign-toplevel-list-v1-protocol.o \
72
		wlr-foreign-toplevel-management-unstable-v1-protocol.o \
73
		swm-toplevel-v1-protocol.o swm-workspace-v1-protocol.o
74
	@echo "ld   $^ => $@"
75
	@$(CC) $(LDFLAGS) $^ $(CTL_LDLIBS) -o $@
76
	@echo "ok   $@"
77
78
swmctl.o: swmctl.c ext-foreign-toplevel-list-v1-client-protocol.h \
79
		wlr-foreign-toplevel-management-unstable-v1-client-protocol.h \
80
		swm-toplevel-v1-client-protocol.h swm-workspace-v1-client-protocol.h \
81
		Makefile config.mk
82
	@echo "cc   $< => $@"
83
	@$(CC) $(CTL_CPPFLAGS) $(CFLAGS) -c $< -o $@
84
85
$(OBJ): Makefile config.mk
86
87
%.o: %.c $(HDRS)
88
	@echo "cc   $< => $@"
89
	@$(CC) $(CPPFLAGS) $(CFLAGS) -c $< -o $@
90
91
cursor-shape-v1-protocol.h: \
92
	$(WL_PROTO)/staging/cursor-shape/cursor-shape-v1.xml
93
	@echo "hdr  $@"
94
	@$(WL_SCANNER) enum-header $< $@
95
ext-workspace-v1-protocol.h: \
96
	$(WL_PROTO)/staging/ext-workspace/ext-workspace-v1.xml
97
	@echo "hdr  $@"
98
	@$(WL_SCANNER) server-header $< $@
99
ext-workspace-v1-protocol.c: \
100
	$(WL_PROTO)/staging/ext-workspace/ext-workspace-v1.xml
101
	@echo "hdr  $@"
102
	@$(WL_SCANNER) private-code $< $@
103
ext-foreign-toplevel-list-v1-client-protocol.h: \
104
		$(WL_PROTO)/staging/ext-foreign-toplevel-list/ext-foreign-toplevel-list-v1.xml
105
	@echo "hdr  $@"
106
	@$(WL_SCANNER) client-header $< $@
107
ext-foreign-toplevel-list-v1-protocol.c: \
108
		$(WL_PROTO)/staging/ext-foreign-toplevel-list/ext-foreign-toplevel-list-v1.xml
109
	@echo "src  $@"
110
	@$(WL_SCANNER) private-code $< $@
111
112
wlr-foreign-toplevel-management-unstable-v1-client-protocol.h: \
113
		protocols/wlr-foreign-toplevel-management-unstable-v1.xml
114
	@echo "hdr  $@"
115
	@$(WL_SCANNER) client-header $< $@
116
117
wlr-foreign-toplevel-management-unstable-v1-protocol.c: \
118
		protocols/wlr-foreign-toplevel-management-unstable-v1.xml
119
	@echo "src  $@"
120
	@$(WL_SCANNER) private-code $< $@
121
swm-toplevel-v1-protocol.h: protocols/swm-toplevel-v1.xml
122
	@echo "hdr  $@"
123
	@$(WL_SCANNER) server-header $< $@
124
swm-toplevel-v1-client-protocol.h: protocols/swm-toplevel-v1.xml
125
	@echo "hdr  $@"
126
	@$(WL_SCANNER) client-header $< $@
127
swm-toplevel-v1-protocol.c: protocols/swm-toplevel-v1.xml
128
	@echo "src  $@"
129
	@$(WL_SCANNER) private-code $< $@
130
swm-workspace-v1-protocol.h: protocols/swm-workspace-v1.xml
131
	@echo "hdr  $@"
132
	@$(WL_SCANNER) server-header $< $@
133
swm-workspace-v1-client-protocol.h: protocols/swm-workspace-v1.xml
134
	@echo "hdr  $@"
135
	@$(WL_SCANNER) client-header $< $@
136
swm-workspace-v1-protocol.c: protocols/swm-workspace-v1.xml
137
	@echo "src  $@"
138
	@$(WL_SCANNER) private-code $< $@
139
pointer-constraints-unstable-v1-protocol.h: \
140
	$(WL_PROTO)/unstable/pointer-constraints/pointer-constraints-unstable-v1.xml
141
	@echo "hdr  $@"
142
	@$(WL_SCANNER) enum-header $< $@
143
wlr-layer-shell-unstable-v1-protocol.h: \
144
	protocols/wlr-layer-shell-unstable-v1.xml
145
	@echo "hdr  $@"
146
	@$(WL_SCANNER) enum-header $< $@
147
wlr-output-power-management-unstable-v1-protocol.h: \
148
	protocols/wlr-output-power-management-unstable-v1.xml
149
	@echo "hdr  $@"
150
	@$(WL_SCANNER) server-header $< $@
151
xdg-shell-protocol.h: \
152
	$(WL_PROTO)/stable/xdg-shell/xdg-shell.xml
153
	@echo "hdr  $@"
154
	@$(WL_SCANNER) server-header $< $@
155
156
config.h:
157
	@test -e $@ || cp config.def.h $@
158
159
fmt:
160
	git ls-files "*.c" "*.h" | xargs clang-format -i
161
162
install: swm swmctl swm.1 swmctl.1
163
	install -Dm755 swm $(DESTDIR)$(PREFIX)/bin/swm
164
	install -Dm755 swmctl $(DESTDIR)$(PREFIX)/bin/swmctl
165
	install -Dm644 swm.1 $(DESTDIR)$(MANDIR)/man1/swm.1
166
	install -Dm644 swmctl.1 $(DESTDIR)$(MANDIR)/man1/swmctl.1
167
	@test -e $(DESTDIR)$(DATADIR)/wayland-sessions/swm.desktop || \
168
		install -Dm644 swm.desktop \
169
			$(DESTDIR)$(DATADIR)/wayland-sessions/swm.desktop
170
171
uninstall:
172
	rm -f $(DESTDIR)$(PREFIX)/bin/swm
173
	rm -f $(DESTDIR)$(PREFIX)/bin/swmctl
174
	rm -f $(DESTDIR)$(MANDIR)/man1/swm.1
175
	rm -f $(DESTDIR)$(MANDIR)/man1/swmctl.1
176
	rm -f $(DESTDIR)$(DATADIR)/wayland-sessions/swm.desktop
177
178
archive:
179
	git archive --format=tar.gz --prefix=swm/ -o swm.tar.gz HEAD
180
181
package: PKGBUILD
182
	makepkg --force
183
184
clean:
185
	rm -f swm swmctl swm.1 swmctl.1 *.o *-protocol.h *-protocol.c
186
187
$(TEST_SRC) $(TEST_BIN):
188
	@mkdir -p $@
189
190
$(TEST_SRC)/swm.c: swm.c | $(TEST_SRC)
191
	@cp -p $< $@
192
193
$(TEST_SRC)/config.h: config.def.h | $(TEST_SRC)
194
	@cp -p $< $@
195
196
TEST_COMMON := Makefile config.mk $(TEST_SRC)/swm.c $(TEST_SRC)/config.h \
197
	swm.h util.c util.h $(PROTO) ext-workspace-v1-protocol.c \
198
	swm-toplevel-v1-protocol.c swm-workspace-v1-protocol.c
199
200
$(TEST_BIN)/unit: test/unit.c $(TEST_COMMON) | $(TEST_BIN)
201
	@echo "cc   test/unit.c => $@"
202
	@$(CC) $(TEST_CPPFLAGS) $(TEST_CFLAGS) test/unit.c util.c \
203
		ext-workspace-v1-protocol.c swm-toplevel-v1-protocol.c \
204
		swm-workspace-v1-protocol.c \
205
		-Wl,--wrap=wlr_fractional_scale_v1_notify_scale \
206
		-Wl,--wrap=wlr_surface_set_preferred_buffer_scale \
207
		-Wl,--wrap=wlr_idle_notifier_v1_notify_activity \
208
		-Wl,--wrap=wlr_seat_pointer_notify_button \
209
		-Wl,--wrap=wlr_cursor_set_xcursor \
210
		-Wl,--wrap=wlr_output_layout_output_at $(LDLIBS) -o $@
211
212
$(TEST_BIN)/ctl-unit: test/ctl_unit.c swmctl.c \
213
		ext-foreign-toplevel-list-v1-client-protocol.h \
214
		wlr-foreign-toplevel-management-unstable-v1-client-protocol.h \
215
		swm-toplevel-v1-client-protocol.h swm-workspace-v1-client-protocol.h \
216
		ext-foreign-toplevel-list-v1-protocol.c \
217
		wlr-foreign-toplevel-management-unstable-v1-protocol.c swm-toplevel-v1-protocol.c \
218
		swm-workspace-v1-protocol.c | $(TEST_BIN)
219
	@echo "cc   test/ctl_unit.c => $@"
220
	@$(CC) -I. $(CTL_CPPFLAGS) $(TEST_CFLAGS) test/ctl_unit.c \
221
		ext-foreign-toplevel-list-v1-protocol.c \
222
		wlr-foreign-toplevel-management-unstable-v1-protocol.c swm-toplevel-v1-protocol.c \
223
		swm-workspace-v1-protocol.c $(CTL_LDLIBS) -o $@
224
225
$(TEST_BIN)/swm: $(TEST_COMMON) | $(TEST_BIN)
226
	@echo "cc   swm.c => $@"
227
	@$(CC) $(TEST_CPPFLAGS) $(TEST_CFLAGS) $(TEST_SRC)/swm.c util.c \
228
		ext-workspace-v1-protocol.c swm-toplevel-v1-protocol.c \
229
		swm-workspace-v1-protocol.c $(LDLIBS) -o $@
230
231
$(TEST_BIN)/swmctl: swmctl.c ext-foreign-toplevel-list-v1-client-protocol.h \
232
		wlr-foreign-toplevel-management-unstable-v1-client-protocol.h \
233
		swm-toplevel-v1-client-protocol.h swm-workspace-v1-client-protocol.h \
234
		ext-foreign-toplevel-list-v1-protocol.c \
235
		wlr-foreign-toplevel-management-unstable-v1-protocol.c swm-toplevel-v1-protocol.c \
236
		swm-workspace-v1-protocol.c | $(TEST_BIN)
237
	@echo "cc   swmctl.c => $@"
238
	@$(CC) $(CTL_CPPFLAGS) $(TEST_CFLAGS) swmctl.c \
239
		ext-foreign-toplevel-list-v1-protocol.c \
240
		wlr-foreign-toplevel-management-unstable-v1-protocol.c swm-toplevel-v1-protocol.c \
241
		swm-workspace-v1-protocol.c $(CTL_LDLIBS) -o $@
242
243
test-build: $(TEST_BIN)/unit $(TEST_BIN)/ctl-unit $(TEST_BIN)/swm $(TEST_BIN)/swmctl
244
245
test: test-build
246
	@SWM_TEST_BUILD=$(abspath $(TEST_BUILD)) PKG_CONFIG=$(PKG_CONFIG) $(PYTHON) test/run.py
247
248
test-unit: $(TEST_BIN)/unit $(TEST_BIN)/ctl-unit
249
	@SWM_TEST_BUILD=$(abspath $(TEST_BUILD)) PKG_CONFIG=$(PKG_CONFIG) $(PYTHON) test/run.py unit
250
251
test-integration: $(TEST_BIN)/swm $(TEST_BIN)/swmctl
252
	@SWM_TEST_BUILD=$(abspath $(TEST_BUILD)) PKG_CONFIG=$(PKG_CONFIG) $(PYTHON) test/run.py integration
253
254
coverage:
255
	@$(MAKE) --no-print-directory TEST_BUILD=$(TEST_BUILD)/coverage TEST_COVERAGE=1 test-build
256
	@SWM_TEST_BUILD=$(abspath $(TEST_BUILD)/coverage) PKG_CONFIG=$(PKG_CONFIG) \
257
		$(PYTHON) test/run.py coverage
258
259
test-clean:
260
	@SWM_TEST_BUILD=$(abspath $(TEST_BUILD)) $(PYTHON) test/run.py clean
261
262
.PHONY: all man fmt install uninstall archive package clean coverage
263
.PHONY: test-build test test-unit test-integration test-clean