commit 929b5e5
shrub
·
2025-12-17 02:25:54 +0000 UTC
parent ed622d3
add a BSD-compatible makefile
2 files changed,
+354,
-119
M
Makefile
+122,
-0
1@@ -0,0 +1,122 @@
2+# swc: Makefile
3+
4+.PHONY: all
5+all: build
6+
7+# Defaults for config.mk
8+PREFIX ?= /usr/local
9+BINDIR ?= $(PREFIX)/bin
10+LIBDIR ?= $(PREFIX)/lib
11+INCLUDEDIR ?= $(PREFIX)/include
12+DATADIR ?= $(PREFIX)/share
13+PKGCONFIGDIR ?= $(LIBDIR)/pkgconfig
14+
15+OBJCOPY ?= objcopy
16+PKG_CONFIG ?= pkg-config
17+WAYLAND_SCANNER ?= wayland-scanner
18+
19+VERSION_MAJOR := 0
20+VERSION_MINOR := 0
21+VERSION := $(VERSION_MAJOR).$(VERSION_MINOR)
22+
23+TARGETS := swc.pc
24+SUBDIRS := launch libswc protocol cursor example
25+CLEAN_FILES := $(TARGETS)
26+
27+include config.mk
28+
29+# Dependencies
30+PACKAGES := \
31+ libdrm \
32+ pixman-1 \
33+ wayland-server \
34+ wayland-protocols \
35+ wld \
36+ xkbcommon
37+
38+ifeq ($(ENABLE_XWAYLAND),1)
39+PACKAGES += \
40+ xcb \
41+ xcb-composite \
42+ xcb-ewmh \
43+ xcb-icccm
44+endif
45+
46+ifneq ($(shell uname),NetBSD)
47+ PACKAGES += libinput
48+ ifeq ($(ENABLE_LIBUDEV),1)
49+ PACKAGES += libudev
50+ endif
51+endif
52+
53+libinput_CONSTRAINTS := --atleast-version=0.4
54+wayland-server_CONSTRAINTS := --atleast-version=1.6.0
55+
56+define check
57+ ifeq ($$(origin $(1)_EXISTS),undefined)
58+ $(1)_EXISTS = $$(shell $$(PKG_CONFIG) --exists $$($(1)_CONSTRAINTS) $(1) && echo yes)
59+ endif
60+ ifneq ($$($(1)_EXISTS),yes)
61+ $$(error Could not find package $(1) $$($(1)_CONSTRAINTS))
62+ endif
63+endef
64+
65+$(foreach pkg,$(PACKAGES),$(eval $(call check,$(pkg))))
66+
67+FINAL_CFLAGS = $(CFLAGS) -fvisibility=hidden -std=c11
68+FINAL_CPPFLAGS = $(CPPFLAGS) -D_GNU_SOURCE # Required for mkostemp
69+
70+# Warning/error flags
71+FINAL_CFLAGS += -Werror=implicit-function-declaration -Werror=implicit-int \
72+ -Werror=pointer-sign -Werror=pointer-arith \
73+ -Wall -Wno-missing-braces
74+
75+ifeq ($(ENABLE_DEBUG),1)
76+ FINAL_CPPFLAGS += -DENABLE_DEBUG=1
77+ FINAL_CFLAGS += -g
78+endif
79+
80+ifeq ($(if $(V),$(V),0),0)
81+ quiet = @echo ' $1 $@';
82+endif
83+
84+Q_AR = $(call quiet,AR )
85+Q_CC = $(call quiet,CC )
86+Q_CCLD = $(call quiet,CCLD )
87+Q_GEN = $(call quiet,GEN )
88+Q_OBJCOPY = $(call quiet,OBJCOPY)
89+Q_SYM = $(call quiet,SYM )
90+
91+compile = $(Q_CC)$(CC) $(FINAL_CPPFLAGS) $(FINAL_CFLAGS) -I . -c -o $@ $< \
92+ -MMD -MP -MF .deps/$(basename $<).d -MT $(basename $@).o -MT $(basename $@).lo
93+link = $(Q_CCLD)$(CC) $(LDFLAGS) -o $@ $^
94+pkgconfig = $(foreach pkg,$(1),$(if $($(pkg)_$(3)),$($(pkg)_$(3)), \
95+ $(shell $(PKG_CONFIG) --$(2) $(pkg))))
96+
97+include $(SUBDIRS:%=%/local.mk)
98+
99+$(foreach dir,BIN LIB INCLUDE PKGCONFIG,$(DESTDIR)$($(dir)DIR)) $(DESTDIR)$(DATADIR)/swc:
100+ mkdir -p $@
101+
102+.PHONY: build
103+build: $(SUBDIRS:%=build-%) $(TARGETS)
104+
105+REQUIRES := wayland-server
106+REQUIRES_PRIVATE := $(filter-out $(REQUIRES),$(libswc_PACKAGES))
107+SWC_PC_VARS := VERSION PREFIX LIBDIR INCLUDEDIR DATADIR REQUIRES REQUIRES_PRIVATE
108+
109+swc.pc: swc.pc.in
110+ $(Q_GEN)sed $(foreach var,$(SWC_PC_VARS),-e 's:@$(var)@:$($(var)):') $< >$@
111+
112+.PHONY: install-swc.pc
113+install-swc.pc: swc.pc | $(DESTDIR)$(PKGCONFIGDIR)
114+ install -m 644 $< $(DESTDIR)$(PKGCONFIGDIR)
115+
116+.PHONY: install
117+install: $(SUBDIRS:%=install-%) $(TARGETS:%=install-%)
118+
119+.PHONY: clean
120+clean:
121+ rm -f $(CLEAN_FILES)
122+
123+-include .deps/*/*.d
M
Makefile
+232,
-119
1@@ -1,123 +1,236 @@
2-# swc: Makefile
3-
4-.PHONY: all
5-all: build
6-
7-# Defaults for config.mk
8-PREFIX ?= /usr/local
9-BINDIR ?= $(PREFIX)/bin
10-LIBDIR ?= $(PREFIX)/lib
11-INCLUDEDIR ?= $(PREFIX)/include
12-DATADIR ?= $(PREFIX)/share
13-PKGCONFIGDIR ?= $(LIBDIR)/pkgconfig
14-
15-OBJCOPY ?= objcopy
16-PKG_CONFIG ?= pkg-config
17-WAYLAND_SCANNER ?= wayland-scanner
18-
19-VERSION_MAJOR := 0
20-VERSION_MINOR := 0
21-VERSION := $(VERSION_MAJOR).$(VERSION_MINOR)
22-
23-TARGETS := swc.pc
24-SUBDIRS := launch libswc protocol cursor example
25-CLEAN_FILES := $(TARGETS)
26-
27-include config.mk
28-
29-# Dependencies
30-PACKAGES := \
31- libdrm \
32- pixman-1 \
33- wayland-server \
34- wayland-protocols \
35- wld \
36- xkbcommon
37-
38-ifeq ($(ENABLE_XWAYLAND),1)
39-PACKAGES += \
40- xcb \
41- xcb-composite \
42- xcb-ewmh \
43- xcb-icccm
44-endif
45-
46-ifneq ($(shell uname),NetBSD)
47- PACKAGES += libinput
48- ifeq ($(ENABLE_LIBUDEV),1)
49- PACKAGES += libudev
50- endif
51-endif
52-
53-libinput_CONSTRAINTS := --atleast-version=0.4
54-wayland-server_CONSTRAINTS := --atleast-version=1.6.0
55-
56-define check
57- ifeq ($$(origin $(1)_EXISTS),undefined)
58- $(1)_EXISTS = $$(shell $$(PKG_CONFIG) --exists $$($(1)_CONSTRAINTS) $(1) && echo yes)
59- endif
60- ifneq ($$($(1)_EXISTS),yes)
61- $$(error Could not find package $(1) $$($(1)_CONSTRAINTS))
62- endif
63-endef
64-
65-$(foreach pkg,$(PACKAGES),$(eval $(call check,$(pkg))))
66-
67-FINAL_CFLAGS = $(CFLAGS) -fvisibility=hidden -std=c11
68-FINAL_CPPFLAGS = $(CPPFLAGS) -D_GNU_SOURCE # Required for mkostemp
69-
70-# Warning/error flags
71-FINAL_CFLAGS += -Werror=implicit-function-declaration -Werror=implicit-int \
72- -Werror=pointer-sign -Werror=pointer-arith \
73- -Wall -Wno-missing-braces
74-
75-ifeq ($(ENABLE_DEBUG),1)
76- FINAL_CPPFLAGS += -DENABLE_DEBUG=1
77- FINAL_CFLAGS += -g
78-endif
79-
80-ifeq ($(if $(V),$(V),0),0)
81- quiet = @echo ' $1 $@';
82-endif
83-
84-Q_AR = $(call quiet,AR )
85-Q_CC = $(call quiet,CC )
86-Q_CCLD = $(call quiet,CCLD )
87-Q_GEN = $(call quiet,GEN )
88-Q_OBJCOPY = $(call quiet,OBJCOPY)
89-Q_SYM = $(call quiet,SYM )
90-
91-compile = $(Q_CC)$(CC) $(FINAL_CPPFLAGS) $(FINAL_CFLAGS) -I . -c -o $@ $< \
92- -MMD -MP -MF .deps/$(basename $<).d -MT $(basename $@).o -MT $(basename $@).lo
93-link = $(Q_CCLD)$(CC) $(LDFLAGS) -o $@ $^
94-pkgconfig = $(foreach pkg,$(1),$(if $($(pkg)_$(3)),$($(pkg)_$(3)), \
95- $(shell $(PKG_CONFIG) --$(2) $(pkg))))
96-
97-include $(SUBDIRS:%=%/local.mk)
98-
99-$(foreach dir,BIN LIB INCLUDE PKGCONFIG,$(DESTDIR)$($(dir)DIR)) $(DESTDIR)$(DATADIR)/swc:
100- mkdir -p $@
101-
102-.PHONY: build
103-build: $(SUBDIRS:%=build-%) $(TARGETS)
104-
105-REQUIRES := wayland-server
106-REQUIRES_PRIVATE := $(filter-out $(REQUIRES),$(libswc_PACKAGES))
107-SWC_PC_VARS := VERSION PREFIX LIBDIR INCLUDEDIR DATADIR REQUIRES REQUIRES_PRIVATE
108+# bmake-compatible build for swc (avoids GNU make-specific functions/macros).
109+
110+.include "config.mk"
111+
112+.MAIN: build
113+
114+.if !defined(PREFIX)
115+PREFIX=/usr/local
116+.endif
117+.if !defined(BINDIR)
118+BINDIR=${PREFIX}/bin
119+.endif
120+.if !defined(LIBDIR)
121+LIBDIR=${PREFIX}/lib
122+.endif
123+.if !defined(INCLUDEDIR)
124+INCLUDEDIR=${PREFIX}/include
125+.endif
126+.if !defined(DATADIR)
127+DATADIR=${PREFIX}/share
128+.endif
129+.if !defined(PKGCONFIGDIR)
130+PKGCONFIGDIR=${LIBDIR}/pkgconfig
131+.endif
132+
133+.if !defined(OBJCOPY)
134+OBJCOPY=objcopy
135+.endif
136+.if !defined(PKG_CONFIG)
137+PKG_CONFIG=pkg-config
138+.endif
139+.if !defined(WAYLAND_SCANNER)
140+WAYLAND_SCANNER=wayland-scanner
141+.endif
142+.if !defined(CC)
143+CC=cc
144+.endif
145+.if !defined(AR)
146+AR=ar
147+.endif
148+
149+UNAME!= uname
150+
151+VERSION_MAJOR=0
152+VERSION_MINOR=0
153+VERSION=${VERSION_MAJOR}.${VERSION_MINOR}
154+
155+PACKAGES=libdrm pixman-1 wayland-server wayland-protocols wld xkbcommon
156+
157+.if ${UNAME} != "NetBSD"
158+PACKAGES+= libinput
159+.if defined(ENABLE_LIBUDEV) && ${ENABLE_LIBUDEV} == 1
160+PACKAGES+= libudev
161+.endif
162+.endif
163+
164+.if defined(ENABLE_XWAYLAND) && ${ENABLE_XWAYLAND} == 1
165+PACKAGES+= xcb xcb-composite xcb-ewmh xcb-icccm
166+.endif
167+
168+PKG_CFLAGS!= ${PKG_CONFIG} --cflags ${PACKAGES}
169+PKG_LIBS!= ${PKG_CONFIG} --libs ${PACKAGES}
170+WAYLAND_PROTOCOLS_DATADIR!= ${PKG_CONFIG} --variable=pkgdatadir wayland-protocols
171+
172+CPPFLAGS+= -D_GNU_SOURCE
173+CFLAGS+= -fvisibility=hidden -std=c11 ${PKG_CFLAGS}
174+CFLAGS+= -Werror=implicit-function-declaration -Werror=implicit-int -Werror=pointer-sign -Werror=pointer-arith -Wall -Wno-missing-braces
175+
176+.if defined(ENABLE_DEBUG) && ${ENABLE_DEBUG} == 1
177+CPPFLAGS+= -DENABLE_DEBUG=1
178+CFLAGS+= -g
179+.endif
180+
181+.if defined(ENABLE_LIBUDEV) && ${ENABLE_LIBUDEV} == 1
182+CPPFLAGS+= -DENABLE_LIBUDEV
183+.endif
184+.if defined(ENABLE_XWAYLAND) && ${ENABLE_XWAYLAND} == 1
185+CPPFLAGS+= -DENABLE_XWAYLAND
186+.endif
187+
188+PROTO_EXTENSIONS= \
189+ protocol/server-decoration.xml \
190+ protocol/swc.xml \
191+ protocol/wayland-drm.xml \
192+ ${WAYLAND_PROTOCOLS_DATADIR}/stable/xdg-shell/xdg-shell.xml \
193+ ${WAYLAND_PROTOCOLS_DATADIR}/unstable/linux-dmabuf/linux-dmabuf-unstable-v1.xml \
194+ ${WAYLAND_PROTOCOLS_DATADIR}/unstable/xdg-decoration/xdg-decoration-unstable-v1.xml
195+
196+.for xml in ${PROTO_EXTENSIONS}
197+_base=${xml:T:R}
198+protocol/${_base}-protocol.c: ${xml}
199+ @echo " GEN $@"
200+ @${WAYLAND_SCANNER} code < ${.ALLSRC} > ${.TARGET}
201+
202+protocol/${_base}-server-protocol.h: ${xml}
203+ @echo " GEN $@"
204+ @${WAYLAND_SCANNER} server-header < ${.ALLSRC} > ${.TARGET}
205+.endfor
206+
207+PROTO_GEN_C= \
208+ protocol/linux-dmabuf-unstable-v1-protocol.c \
209+ protocol/server-decoration-protocol.c \
210+ protocol/swc-protocol.c \
211+ protocol/wayland-drm-protocol.c \
212+ protocol/xdg-decoration-unstable-v1-protocol.c \
213+ protocol/xdg-shell-protocol.c
214+
215+PROTO_GEN_H= \
216+ protocol/linux-dmabuf-unstable-v1-server-protocol.h \
217+ protocol/server-decoration-server-protocol.h \
218+ protocol/swc-server-protocol.h \
219+ protocol/wayland-drm-server-protocol.h \
220+ protocol/xdg-decoration-unstable-v1-server-protocol.h \
221+ protocol/xdg-shell-server-protocol.h
222+
223+cursor/cursor_data.h: cursor/cursor.pcf cursor/convert_font
224+ @echo " GEN $@"
225+ @cursor/convert_font cursor/cursor.pcf ${.TARGET} 2>/dev/null
226+
227+cursor/convert_font: cursor/convert_font.o
228+ @echo " CCLD $@"
229+ @${CC} ${LDFLAGS} -o ${.TARGET} ${.ALLSRC}
230+
231+cursor/convert_font.o: cursor/convert_font.c
232+ @echo " CC $@"
233+ @${CC} ${CPPFLAGS} ${CFLAGS} -I . -c -o ${.TARGET} ${.ALLSRC}
234+
235+LAUNCH_DEVMAJOR=launch/devmajor-linux.c
236+.if ${UNAME} == "NetBSD"
237+LAUNCH_DEVMAJOR=launch/devmajor-netbsd.c
238+.endif
239+
240+launch/swc-launch: launch/launch.o launch/protocol.o launch/${LAUNCH_DEVMAJOR:T:R}.o
241+ @echo " CCLD $@"
242+ @${CC} ${LDFLAGS} -o ${.TARGET} ${.ALLSRC} ${PKG_LIBS}
243+
244+.for f in launch/launch.c launch/protocol.c ${LAUNCH_DEVMAJOR}
245+launch/${f:T:R}.o: ${f}
246+ @echo " CC $@"
247+ @${CC} ${CPPFLAGS} ${CFLAGS} -I . -c -o ${.TARGET} ${.ALLSRC}
248+.endfor
249+
250+SWC_SOURCES= \
251+ libswc/bindings.c \
252+ libswc/compositor.c \
253+ libswc/data.c \
254+ libswc/data_device.c \
255+ libswc/data_device_manager.c \
256+ libswc/dmabuf.c \
257+ libswc/drm.c \
258+ libswc/input.c \
259+ libswc/kde_decoration.c \
260+ libswc/keyboard.c \
261+ libswc/launch.c \
262+ libswc/mode.c \
263+ libswc/output.c \
264+ libswc/panel.c \
265+ libswc/panel_manager.c \
266+ libswc/plane.c \
267+ libswc/pointer.c \
268+ libswc/primary_plane.c \
269+ libswc/region.c \
270+ libswc/screen.c \
271+ libswc/shell.c \
272+ libswc/shell_surface.c \
273+ libswc/shm.c \
274+ libswc/subcompositor.c \
275+ libswc/subsurface.c \
276+ libswc/surface.c \
277+ libswc/swc.c \
278+ libswc/util.c \
279+ libswc/view.c \
280+ libswc/wayland_buffer.c \
281+ libswc/window.c \
282+ libswc/xdg_decoration.c \
283+ libswc/xdg_shell.c \
284+ protocol/linux-dmabuf-unstable-v1-protocol.c \
285+ protocol/server-decoration-protocol.c \
286+ protocol/swc-protocol.c \
287+ protocol/wayland-drm-protocol.c \
288+ protocol/xdg-decoration-unstable-v1-protocol.c \
289+ protocol/xdg-shell-protocol.c
290+
291+.if ${UNAME} == "NetBSD"
292+SWC_SOURCES+= libswc/seat-ws.c
293+.else
294+SWC_SOURCES+= libswc/seat.c
295+.endif
296+
297+.if defined(ENABLE_XWAYLAND) && ${ENABLE_XWAYLAND} == 1
298+SWC_SOURCES+= libswc/xserver.c libswc/xwm.c
299+.endif
300+
301+SWC_OBJECTS=${SWC_SOURCES:S/.c/.o/}
302+SWC_OBJECTS+= launch/protocol.o
303+
304+.for src in ${SWC_SOURCES}
305+${src:R}.o: ${src} ${PROTO_GEN_H} cursor/cursor_data.h
306+ @echo " CC $@"
307+ @${CC} ${CPPFLAGS} ${CFLAGS} -I . -I protocol -c -o ${.TARGET} ${.IMPSRC}
308+.endfor
309+
310+libswc/libswc-internal.o: ${SWC_OBJECTS}
311+ @echo " CCLD $@"
312+ @${CC} -nostdlib -r -o ${.TARGET} ${.ALLSRC}
313+
314+libswc/libswc.o: libswc/libswc-internal.o
315+ @echo " OBJCOPY $@"
316+ @${OBJCOPY} --localize-hidden ${.ALLSRC} ${.TARGET}
317+
318+libswc/libswc.a: libswc/libswc.o
319+ @echo " AR $@"
320+ @${AR} cru ${.TARGET} ${.ALLSRC}
321
322 swc.pc: swc.pc.in
323- $(Q_GEN)sed $(foreach var,$(SWC_PC_VARS),-e 's:@$(var)@:$($(var)):') $< >$@
324-
325-.PHONY: install-swc.pc
326-install-swc.pc: swc.pc | $(DESTDIR)$(PKGCONFIGDIR)
327- install -m 644 $< $(DESTDIR)$(PKGCONFIGDIR)
328-
329-.PHONY: install
330-install: $(SUBDIRS:%=install-%) $(TARGETS:%=install-%)
331+ @echo " GEN $@"
332+ @sed -e 's:@VERSION@:${VERSION}:' \
333+ -e 's:@PREFIX@:${PREFIX}:' \
334+ -e 's:@LIBDIR@:${LIBDIR}:' \
335+ -e 's:@INCLUDEDIR@:${INCLUDEDIR}:' \
336+ -e 's:@DATADIR@:${DATADIR}:' \
337+ -e 's:@REQUIRES@:wayland-server:' \
338+ -e 's:@REQUIRES_PRIVATE@::' \
339+ ${.ALLSRC} > ${.TARGET}
340+
341+.PHONY: all build clean
342+all: build
343+build: libswc/libswc.a launch/swc-launch cursor/cursor_data.h swc.pc
344
345-.PHONY: clean
346 clean:
347- rm -f $(CLEAN_FILES)
348-
349--include .deps/*/*.d
350-
351+ rm -f swc.pc \
352+ ${PROTO_GEN_C} ${PROTO_GEN_H} \
353+ cursor/cursor_data.h cursor/convert_font cursor/convert_font.o \
354+ launch/*.o launch/swc-launch \
355+ libswc/*.o libswc/libswc-internal.o libswc/libswc.o libswc/libswc.a \
356+ protocol/*.o