Makefile 7.8 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
		swm-toplevel-v1-protocol.o swm-workspace-v1-protocol.o
73
	@echo "ld   $^ => $@"
74
	@$(CC) $(LDFLAGS) $^ $(CTL_LDLIBS) -o $@
75
	@echo "ok   $@"
76
77
swmctl.o: swmctl.c ext-foreign-toplevel-list-v1-client-protocol.h \
78
		swm-toplevel-v1-client-protocol.h swm-workspace-v1-client-protocol.h \
79
		Makefile config.mk
80
	@echo "cc   $< => $@"
81
	@$(CC) $(CTL_CPPFLAGS) $(CFLAGS) -c $< -o $@
82
83
$(OBJ): Makefile config.mk
84
85
%.o: %.c $(HDRS)
86
	@echo "cc   $< => $@"
87
	@$(CC) $(CPPFLAGS) $(CFLAGS) -c $< -o $@
88
89
cursor-shape-v1-protocol.h: \
90
	$(WL_PROTO)/staging/cursor-shape/cursor-shape-v1.xml
91
	@echo "hdr  $@"
92
	@$(WL_SCANNER) enum-header $< $@
93
ext-workspace-v1-protocol.h: \
94
	$(WL_PROTO)/staging/ext-workspace/ext-workspace-v1.xml
95
	@echo "hdr  $@"
96
	@$(WL_SCANNER) server-header $< $@
97
ext-workspace-v1-protocol.c: \
98
	$(WL_PROTO)/staging/ext-workspace/ext-workspace-v1.xml
99
	@echo "hdr  $@"
100
	@$(WL_SCANNER) private-code $< $@
101
ext-foreign-toplevel-list-v1-client-protocol.h: \
102
		$(WL_PROTO)/staging/ext-foreign-toplevel-list/ext-foreign-toplevel-list-v1.xml
103
	@echo "hdr  $@"
104
	@$(WL_SCANNER) client-header $< $@
105
ext-foreign-toplevel-list-v1-protocol.c: \
106
		$(WL_PROTO)/staging/ext-foreign-toplevel-list/ext-foreign-toplevel-list-v1.xml
107
	@echo "src  $@"
108
	@$(WL_SCANNER) private-code $< $@
109
swm-toplevel-v1-protocol.h: protocols/swm-toplevel-v1.xml
110
	@echo "hdr  $@"
111
	@$(WL_SCANNER) server-header $< $@
112
swm-toplevel-v1-client-protocol.h: protocols/swm-toplevel-v1.xml
113
	@echo "hdr  $@"
114
	@$(WL_SCANNER) client-header $< $@
115
swm-toplevel-v1-protocol.c: protocols/swm-toplevel-v1.xml
116
	@echo "src  $@"
117
	@$(WL_SCANNER) private-code $< $@
118
swm-workspace-v1-protocol.h: protocols/swm-workspace-v1.xml
119
	@echo "hdr  $@"
120
	@$(WL_SCANNER) server-header $< $@
121
swm-workspace-v1-client-protocol.h: protocols/swm-workspace-v1.xml
122
	@echo "hdr  $@"
123
	@$(WL_SCANNER) client-header $< $@
124
swm-workspace-v1-protocol.c: protocols/swm-workspace-v1.xml
125
	@echo "src  $@"
126
	@$(WL_SCANNER) private-code $< $@
127
pointer-constraints-unstable-v1-protocol.h: \
128
	$(WL_PROTO)/unstable/pointer-constraints/pointer-constraints-unstable-v1.xml
129
	@echo "hdr  $@"
130
	@$(WL_SCANNER) enum-header $< $@
131
wlr-layer-shell-unstable-v1-protocol.h: \
132
	protocols/wlr-layer-shell-unstable-v1.xml
133
	@echo "hdr  $@"
134
	@$(WL_SCANNER) enum-header $< $@
135
wlr-output-power-management-unstable-v1-protocol.h: \
136
	protocols/wlr-output-power-management-unstable-v1.xml
137
	@echo "hdr  $@"
138
	@$(WL_SCANNER) server-header $< $@
139
xdg-shell-protocol.h: \
140
	$(WL_PROTO)/stable/xdg-shell/xdg-shell.xml
141
	@echo "hdr  $@"
142
	@$(WL_SCANNER) server-header $< $@
143
144
config.h:
145
	@test -e $@ || cp config.def.h $@
146
147
fmt:
148
	git ls-files "*.c" "*.h" | xargs clang-format -i
149
150
install: swm swmctl swm.1 swmctl.1
151
	install -Dm755 swm $(DESTDIR)$(PREFIX)/bin/swm
152
	install -Dm755 swmctl $(DESTDIR)$(PREFIX)/bin/swmctl
153
	install -Dm644 swm.1 $(DESTDIR)$(MANDIR)/man1/swm.1
154
	install -Dm644 swmctl.1 $(DESTDIR)$(MANDIR)/man1/swmctl.1
155
	@test -e $(DESTDIR)$(DATADIR)/wayland-sessions/swm.desktop || \
156
		install -Dm644 swm.desktop \
157
			$(DESTDIR)$(DATADIR)/wayland-sessions/swm.desktop
158
159
uninstall:
160
	rm -f $(DESTDIR)$(PREFIX)/bin/swm
161
	rm -f $(DESTDIR)$(PREFIX)/bin/swmctl
162
	rm -f $(DESTDIR)$(MANDIR)/man1/swm.1
163
	rm -f $(DESTDIR)$(MANDIR)/man1/swmctl.1
164
	rm -f $(DESTDIR)$(DATADIR)/wayland-sessions/swm.desktop
165
166
archive:
167
	git archive --format=tar.gz --prefix=swm/ -o swm.tar.gz HEAD
168
169
package: PKGBUILD
170
	makepkg --force
171
172
clean:
173
	rm -f swm swmctl swm.1 swmctl.1 *.o *-protocol.h *-protocol.c
174
175
$(TEST_SRC) $(TEST_BIN):
176
	@mkdir -p $@
177
178
$(TEST_SRC)/swm.c: swm.c | $(TEST_SRC)
179
	@cp -p $< $@
180
181
$(TEST_SRC)/config.h: config.def.h | $(TEST_SRC)
182
	@cp -p $< $@
183
184
TEST_COMMON := Makefile config.mk $(TEST_SRC)/swm.c $(TEST_SRC)/config.h \
185
	swm.h util.c util.h $(PROTO) ext-workspace-v1-protocol.c \
186
	swm-toplevel-v1-protocol.c swm-workspace-v1-protocol.c
187
188
$(TEST_BIN)/unit: test/unit.c $(TEST_COMMON) | $(TEST_BIN)
189
	@echo "cc   test/unit.c => $@"
190
	@$(CC) $(TEST_CPPFLAGS) $(TEST_CFLAGS) test/unit.c util.c \
191
		ext-workspace-v1-protocol.c swm-toplevel-v1-protocol.c \
192
		swm-workspace-v1-protocol.c $(LDLIBS) -o $@
193
194
$(TEST_BIN)/swm: $(TEST_COMMON) | $(TEST_BIN)
195
	@echo "cc   swm.c => $@"
196
	@$(CC) $(TEST_CPPFLAGS) $(TEST_CFLAGS) $(TEST_SRC)/swm.c util.c \
197
		ext-workspace-v1-protocol.c swm-toplevel-v1-protocol.c \
198
		swm-workspace-v1-protocol.c $(LDLIBS) -o $@
199
200
$(TEST_BIN)/swmctl: swmctl.c ext-foreign-toplevel-list-v1-client-protocol.h \
201
		swm-toplevel-v1-client-protocol.h swm-workspace-v1-client-protocol.h \
202
		ext-foreign-toplevel-list-v1-protocol.c swm-toplevel-v1-protocol.c \
203
		swm-workspace-v1-protocol.c | $(TEST_BIN)
204
	@echo "cc   swmctl.c => $@"
205
	@$(CC) $(CTL_CPPFLAGS) $(TEST_CFLAGS) swmctl.c \
206
		ext-foreign-toplevel-list-v1-protocol.c swm-toplevel-v1-protocol.c \
207
		swm-workspace-v1-protocol.c $(CTL_LDLIBS) -o $@
208
209
test-build: $(TEST_BIN)/unit $(TEST_BIN)/swm $(TEST_BIN)/swmctl
210
211
test: test-build
212
	@SWM_TEST_BUILD=$(abspath $(TEST_BUILD)) PKG_CONFIG=$(PKG_CONFIG) $(PYTHON) test/run.py
213
214
test-unit: $(TEST_BIN)/unit
215
	@SWM_TEST_BUILD=$(abspath $(TEST_BUILD)) PKG_CONFIG=$(PKG_CONFIG) $(PYTHON) test/run.py unit
216
217
test-integration: $(TEST_BIN)/swm $(TEST_BIN)/swmctl
218
	@SWM_TEST_BUILD=$(abspath $(TEST_BUILD)) PKG_CONFIG=$(PKG_CONFIG) $(PYTHON) test/run.py integration
219
220
coverage:
221
	@$(MAKE) --no-print-directory TEST_BUILD=$(TEST_BUILD)/coverage TEST_COVERAGE=1 test-build
222
	@SWM_TEST_BUILD=$(abspath $(TEST_BUILD)/coverage) PKG_CONFIG=$(PKG_CONFIG) \
223
		$(PYTHON) test/run.py coverage
224
225
test-clean:
226
	@SWM_TEST_BUILD=$(abspath $(TEST_BUILD)) $(PYTHON) test/run.py clean
227
228
.PHONY: all man fmt install uninstall archive package clean coverage
229
.PHONY: test-build test test-unit test-integration test-clean