commit 929b5e5

shrub  ·  2025-12-17 02:25:54 +0000 UTC
parent ed622d3
add a BSD-compatible makefile
2 files changed,  +354, -119
+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
+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