VERSION != git describe --abbrev=4 --dirty --always --tags

PREFIX = /usr/local
BINDIR = $(PREFIX)/bin

PKG_CONFIG ?= pkg-config
WAYLAND_SCANNER != $(PKG_CONFIG) --variable=wayland_scanner wayland-scanner
WAYLAND_PROTOCOLS != $(PKG_CONFIG) --variable=pkgdatadir wayland-protocols

DEPS = wayland-client xkbcommon libbsd

INCLUDE != $(PKG_CONFIG) --cflags $(DEPS)
LIBS != $(PKG_CONFIG) --libs $(DEPS)

CPPFLAGS = -DVERSION=\"$(VERSION)\" -D_POSIX_C_SOURCE=200809L -Iprotocol $(INCLUDE)
CFLAGS = -std=c99 -Wall -Wextra -Wpedantic -Wno-unused-parameter
LDFLAGS = $(LIBS)

GEN_HEADERS = \
	protocol/river-window-management-v1-client-protocol.h \
	protocol/river-xkb-bindings-v1-client-protocol.h \
	protocol/river-layer-shell-v1-client-protocol.h \
	protocol/cursor-shape-v1-client-protocol.h

GEN_OBJECTS = \
	protocol/river-window-management-v1-protocol.o \
	protocol/river-xkb-bindings-v1-protocol.o \
	protocol/river-layer-shell-v1-protocol.o \
	protocol/cursor-shape-v1-protocol.o \
	protocol/tablet-unstable-v2-protocol.o

OBJECTS = main.o output.o window.o seat.o config.o $(GEN_OBJECTS)

all: release

protocol/river-window-management-v1-client-protocol.h: protocol/river-window-management-v1.xml
	$(WAYLAND_SCANNER) client-header $< $@

protocol/river-xkb-bindings-v1-client-protocol.h: protocol/river-xkb-bindings-v1.xml
	$(WAYLAND_SCANNER) client-header $< $@

protocol/river-window-management-v1-protocol.o: protocol/river-window-management-v1.xml
	$(WAYLAND_SCANNER) private-code $< protocol/river-window-management-v1-protocol.c
	$(CC) $(CPPFLAGS) $(CFLAGS) -c -o $@ protocol/river-window-management-v1-protocol.c

protocol/river-xkb-bindings-v1-protocol.o: protocol/river-xkb-bindings-v1.xml
	$(WAYLAND_SCANNER) private-code $< protocol/river-xkb-bindings-v1-protocol.c
	$(CC) $(CPPFLAGS) $(CFLAGS) -c -o $@ protocol/river-xkb-bindings-v1-protocol.c

protocol/river-layer-shell-v1-client-protocol.h: protocol/river-layer-shell-v1.xml
	$(WAYLAND_SCANNER) client-header $< $@

protocol/river-layer-shell-v1-protocol.o: protocol/river-layer-shell-v1.xml
	$(WAYLAND_SCANNER) private-code $< protocol/river-layer-shell-v1-protocol.c
	$(CC) $(CPPFLAGS) $(CFLAGS) -c -o $@ protocol/river-layer-shell-v1-protocol.c

protocol/cursor-shape-v1-client-protocol.h:
	$(WAYLAND_SCANNER) client-header \
		$(WAYLAND_PROTOCOLS)/staging/cursor-shape/cursor-shape-v1.xml $@

protocol/cursor-shape-v1-protocol.o:
	$(WAYLAND_SCANNER) private-code \
		$(WAYLAND_PROTOCOLS)/staging/cursor-shape/cursor-shape-v1.xml \
		protocol/cursor-shape-v1-protocol.c
	$(CC) $(CPPFLAGS) $(CFLAGS) -c -o $@ protocol/cursor-shape-v1-protocol.c

protocol/tablet-unstable-v2-protocol.o:
	$(WAYLAND_SCANNER) private-code \
		$(WAYLAND_PROTOCOLS)/unstable/tablet/tablet-unstable-v2.xml \
		protocol/tablet-unstable-v2-protocol.c
	$(CC) $(CPPFLAGS) $(CFLAGS) -c -o $@ protocol/tablet-unstable-v2-protocol.c

output.o: output.c output.h config.h $(GEN_HEADERS)
	$(CC) $(CPPFLAGS) $(CFLAGS) -c -o $@ $<

window.o: window.c window.h $(GEN_HEADERS)
	$(CC) $(CPPFLAGS) $(CFLAGS) -c -o $@ $<

config.o: config.c config.h $(GEN_HEADERS)
	$(CC) $(CPPFLAGS) $(CFLAGS) -c -o $@ $<

seat.o: seat.c seat.h window.h config.h $(GEN_HEADERS)
	$(CC) $(CPPFLAGS) $(CFLAGS) -c -o $@ $<

main.o: main.c output.h seat.h window.h config.h $(GEN_HEADERS)
	$(CC) $(CPPFLAGS) $(CFLAGS) -c -o $@ $<

srwm: $(OBJECTS)
	$(CC) -o $@ $^ $(LDFLAGS)

debug: CPPFLAGS += -DDEBUG
debug: CFLAGS += -g -Og
debug: srwm

release: CPPFLAGS += -D_FORTIFY_SOURCE=2
release: CFLAGS += -O2
release: srwm

install: srwm
	mkdir -p $(DESTDIR)$(BINDIR)
	cp srwm $(DESTDIR)$(BINDIR)/srwm
	chmod 755 $(DESTDIR)$(BINDIR)/srwm

uninstall:
	$(RM) $(DESTDIR)$(BINDIR)/srwm

compdb: clean
	bear -- $(MAKE)

tidy:
	clang-tidy main.c output.c window.c seat.c config.c

clean:
	$(RM) srwm
	$(RM) *.o
	$(RM) protocol/*.h protocol/*.c protocol/*.o

.PHONY: all debug release install uninstall clean compdb tidy
