| git.druid.rocks | index | militantprogrammer | astral_canvas | Makefile |
Makefile
# POSIX / FHS make.
#
# Default prefix is /usr/local (FHS tertiary hierarchy for software
# built on this host). After `sudo make install`:
# #include <astral/canvas.h>
# cc main.c -lcanvas
#
# Staged (packaging):
# make DESTDIR=/tmp/stage install
CC = cc
LIB_DIRNAME = astral
PREFIX = /usr/local
DESTDIR =
LIB = canvas
LIB_TITLE = Astral Canvas
MAJOR = 0
VERSION = 0.1.0
BUILD = build
PKGS = xcb xcb-icccm xcb-shm xcb-xkb xcb-cursor xkbcommon xkbcommon-x11 wayland-client wayland-cursor vulkan
CFLAGS = -O2 -g -std=gnu23 -Wall -Wextra -pedantic -D_GNU_SOURCE -fPIC -Isrc -I$(BUILD) -pthread `pkg-config --cflags $(PKGS)`
LDFLAGS =
LDLIBS = `pkg-config --libs $(PKGS)` -lrt -lpthread
WAYLAND_SCANNER = wayland-scanner
WAYLAND_PROTOCOLS = `pkg-config --variable=pkgdatadir wayland-protocols`
GLSLANG = glslangValidator
OBJ = \
$(BUILD)/lib/lib.o \
$(BUILD)/lib/error.o \
$(BUILD)/lib/id.o \
$(BUILD)/lib/queue.o \
$(BUILD)/api/canvas.o \
$(BUILD)/api/apiInternal.o \
$(BUILD)/api/node.o \
$(BUILD)/platform/platform.o \
$(BUILD)/platform/x11.o \
$(BUILD)/platform/wayland.o \
$(BUILD)/platform/shm.o \
$(BUILD)/input/input.o \
$(BUILD)/render/font.o \
$(BUILD)/render/vk.o \
$(BUILD)/render/render.o \
$(BUILD)/xdg-shell-protocol.o \
$(BUILD)/xdg-decoration-unstable-v1-protocol.o
LIBA = $(BUILD)/lib$(LIB).a
LIBSO = $(BUILD)/lib$(LIB).so
LIBSOVER = $(BUILD)/lib$(LIB).so.$(VERSION)
PC = $(BUILD)/$(LIB).pc
all: $(LIBA) $(LIBSOVER) $(PC)
$(LIBA): $(OBJ)
ar rcs $(LIBA) $(OBJ)
$(LIBSOVER): $(OBJ)
$(CC) -shared -Wl,-soname,lib$(LIB).so.$(MAJOR) -o $(LIBSOVER) $(OBJ) $(LDFLAGS) $(LDLIBS)
ln -sf lib$(LIB).so.$(VERSION) $(LIBSO)
ln -sf lib$(LIB).so.$(VERSION) $(BUILD)/lib$(LIB).so.$(MAJOR)
$(PC):
mkdir -p $(BUILD)
printf 'prefix=%s\n' $(PREFIX) > $(PC)
printf 'libdir=$${prefix}/lib\n' >> $(PC)
printf 'includedir=$${prefix}/include\n' >> $(PC)
printf '\nName: %s\n' "$(LIB_TITLE)" >> $(PC)
printf 'Description: %s — C window, input, and UI library\n' "$(LIB_TITLE)" >> $(PC)
printf 'Version: %s\n' $(VERSION) >> $(PC)
printf 'Requires.private: %s\n' "$(PKGS)" >> $(PC)
printf 'Libs: -l%s\n' $(LIB) >> $(PC)
printf 'Cflags:\n' >> $(PC)
install: all
mkdir -p $(DESTDIR)$(PREFIX)/lib/pkgconfig
mkdir -p $(DESTDIR)$(PREFIX)/include/$(LIB_DIRNAME)
cp $(LIBA) $(DESTDIR)$(PREFIX)/lib/lib$(LIB).a
cp $(LIBSOVER) $(DESTDIR)$(PREFIX)/lib/lib$(LIB).so.$(VERSION)
ln -sf lib$(LIB).so.$(VERSION) $(DESTDIR)$(PREFIX)/lib/lib$(LIB).so
ln -sf lib$(LIB).so.$(VERSION) $(DESTDIR)$(PREFIX)/lib/lib$(LIB).so.$(MAJOR)
cp src/api/canvas.h $(DESTDIR)$(PREFIX)/include/$(LIB_DIRNAME)/canvas.h
pc_prefix=$(PREFIX); case $$pc_prefix in /*) ;; *) pc_prefix=`pwd`/$$pc_prefix ;; esac; \
printf 'prefix=%s\n' $$pc_prefix > $(DESTDIR)$(PREFIX)/lib/pkgconfig/$(LIB).pc
printf 'libdir=$${prefix}/lib\n' >> $(DESTDIR)$(PREFIX)/lib/pkgconfig/$(LIB).pc
printf 'includedir=$${prefix}/include\n' >> $(DESTDIR)$(PREFIX)/lib/pkgconfig/$(LIB).pc
printf '\nName: %s\n' "$(LIB_TITLE)" >> $(DESTDIR)$(PREFIX)/lib/pkgconfig/$(LIB).pc
printf 'Description: %s — C window, input, and UI library\n' "$(LIB_TITLE)" >> $(DESTDIR)$(PREFIX)/lib/pkgconfig/$(LIB).pc
printf 'Version: %s\n' $(VERSION) >> $(DESTDIR)$(PREFIX)/lib/pkgconfig/$(LIB).pc
printf 'Requires.private: %s\n' "$(PKGS)" >> $(DESTDIR)$(PREFIX)/lib/pkgconfig/$(LIB).pc
printf 'Libs: -l%s\n' $(LIB) >> $(DESTDIR)$(PREFIX)/lib/pkgconfig/$(LIB).pc
printf 'Cflags:\n' >> $(DESTDIR)$(PREFIX)/lib/pkgconfig/$(LIB).pc
chmod 644 $(DESTDIR)$(PREFIX)/lib/lib$(LIB).a
chmod 755 $(DESTDIR)$(PREFIX)/lib/lib$(LIB).so.$(VERSION)
chmod 644 $(DESTDIR)$(PREFIX)/include/$(LIB_DIRNAME)/canvas.h
chmod 644 $(DESTDIR)$(PREFIX)/lib/pkgconfig/$(LIB).pc
if [ -z "$(DESTDIR)" ] && [ "$(PREFIX)" = "/usr/local" ] && [ -d /etc/ld.so.conf.d ]; then \
printf '%s\n' $(PREFIX)/lib > /etc/ld.so.conf.d/astral-canvas.conf; \
ldconfig; \
fi
uninstall:
rm -f $(DESTDIR)$(PREFIX)/lib/lib$(LIB).a
rm -f $(DESTDIR)$(PREFIX)/lib/lib$(LIB).so
rm -f $(DESTDIR)$(PREFIX)/lib/lib$(LIB).so.$(MAJOR)
rm -f $(DESTDIR)$(PREFIX)/lib/lib$(LIB).so.$(VERSION)
rm -f $(DESTDIR)$(PREFIX)/include/$(LIB_DIRNAME)/canvas.h
rm -f $(DESTDIR)$(PREFIX)/include/canvas.h
rm -f $(DESTDIR)$(PREFIX)/include/Astral/canvas.h
rmdir $(DESTDIR)$(PREFIX)/include/Astral 2>/dev/null || true
rm -f $(DESTDIR)$(PREFIX)/lib/pkgconfig/$(LIB).pc
rm -f /etc/ld.so.conf.d/astral-canvas.conf
rmdir $(DESTDIR)$(PREFIX)/include/$(LIB_DIRNAME) 2>/dev/null || true
if [ -z "$(DESTDIR)" ] && [ "$(PREFIX)" = "/usr/local" ]; then ldconfig; fi
clean:
rm -rf $(BUILD)
$(BUILD)/lib/lib.o: src/lib/lib.c
mkdir -p $(BUILD)/lib
$(CC) $(CFLAGS) -c -o $(BUILD)/lib/lib.o src/lib/lib.c
$(BUILD)/lib/id.o: src/lib/id.c
mkdir -p $(BUILD)/lib
$(CC) $(CFLAGS) -c -o $(BUILD)/lib/id.o src/lib/id.c
$(BUILD)/lib/queue.o: src/lib/queue.c
mkdir -p $(BUILD)/lib
$(CC) $(CFLAGS) -c -o $(BUILD)/lib/queue.o src/lib/queue.c
$(BUILD)/lib/error.o: src/lib/error.c
mkdir -p $(BUILD)/lib
$(CC) $(CFLAGS) -c -o $(BUILD)/lib/error.o src/lib/error.c
$(BUILD)/api/canvas.o: src/api/canvas.c
mkdir -p $(BUILD)/api
$(CC) $(CFLAGS) -c -o $(BUILD)/api/canvas.o src/api/canvas.c
$(BUILD)/api/apiInternal.o: src/api/apiInternal.c
mkdir -p $(BUILD)/api
$(CC) $(CFLAGS) -c -o $(BUILD)/api/apiInternal.o src/api/apiInternal.c
$(BUILD)/api/node.o: src/api/node.c
mkdir -p $(BUILD)/api
$(CC) $(CFLAGS) -c -o $(BUILD)/api/node.o src/api/node.c
$(BUILD)/platform/platform.o: src/platform/platform.c
mkdir -p $(BUILD)/platform
$(CC) $(CFLAGS) -c -o $(BUILD)/platform/platform.o src/platform/platform.c
$(BUILD)/platform/x11.o: src/platform/x11.c
mkdir -p $(BUILD)/platform
$(CC) $(CFLAGS) -c -o $(BUILD)/platform/x11.o src/platform/x11.c
$(BUILD)/platform/wayland.o: src/platform/wayland.c $(BUILD)/xdg-shell-client-protocol.h $(BUILD)/xdg-decoration-unstable-v1-client-protocol.h
mkdir -p $(BUILD)/platform
$(CC) $(CFLAGS) -c -o $(BUILD)/platform/wayland.o src/platform/wayland.c
$(BUILD)/platform/shm.o: src/platform/shm.c
mkdir -p $(BUILD)/platform
$(CC) $(CFLAGS) -c -o $(BUILD)/platform/shm.o src/platform/shm.c
$(BUILD)/input/input.o: src/input/input.c
mkdir -p $(BUILD)/input
$(CC) $(CFLAGS) -c -o $(BUILD)/input/input.o src/input/input.c
$(BUILD)/render/font.o: src/render/font.c
mkdir -p $(BUILD)/render
$(CC) $(CFLAGS) -c -o $(BUILD)/render/font.o src/render/font.c
$(BUILD)/render/vk.o: src/render/vk.c $(BUILD)/hud.vert.spv.h $(BUILD)/hud.frag.spv.h $(BUILD)/text.vert.spv.h $(BUILD)/text.frag.spv.h
mkdir -p $(BUILD)/render
$(CC) $(CFLAGS) -c -o $(BUILD)/render/vk.o src/render/vk.c
$(BUILD)/render/render.o: src/render/render.c $(BUILD)/hud.vert.spv.h $(BUILD)/hud.frag.spv.h $(BUILD)/text.vert.spv.h $(BUILD)/text.frag.spv.h
mkdir -p $(BUILD)/render
$(CC) $(CFLAGS) -c -o $(BUILD)/render/render.o src/render/render.c
$(BUILD)/xdg-shell-protocol.o: $(BUILD)/xdg-shell-protocol.c
$(CC) $(CFLAGS) -c -o $(BUILD)/xdg-shell-protocol.o $(BUILD)/xdg-shell-protocol.c
$(BUILD)/xdg-decoration-unstable-v1-protocol.o: $(BUILD)/xdg-decoration-unstable-v1-protocol.c
$(CC) $(CFLAGS) -c -o $(BUILD)/xdg-decoration-unstable-v1-protocol.o $(BUILD)/xdg-decoration-unstable-v1-protocol.c
$(BUILD)/xdg-shell-client-protocol.h:
mkdir -p $(BUILD)
$(WAYLAND_SCANNER) client-header $(WAYLAND_PROTOCOLS)/stable/xdg-shell/xdg-shell.xml $(BUILD)/xdg-shell-client-protocol.h
$(BUILD)/xdg-shell-protocol.c:
mkdir -p $(BUILD)
$(WAYLAND_SCANNER) private-code $(WAYLAND_PROTOCOLS)/stable/xdg-shell/xdg-shell.xml $(BUILD)/xdg-shell-protocol.c
$(BUILD)/xdg-decoration-unstable-v1-client-protocol.h:
mkdir -p $(BUILD)
$(WAYLAND_SCANNER) client-header $(WAYLAND_PROTOCOLS)/unstable/xdg-decoration/xdg-decoration-unstable-v1.xml $(BUILD)/xdg-decoration-unstable-v1-client-protocol.h
$(BUILD)/xdg-decoration-unstable-v1-protocol.c:
mkdir -p $(BUILD)
$(WAYLAND_SCANNER) private-code $(WAYLAND_PROTOCOLS)/unstable/xdg-decoration/xdg-decoration-unstable-v1.xml $(BUILD)/xdg-decoration-unstable-v1-protocol.c
$(BUILD)/hud.vert.spv.h: shaders/hud.vert
mkdir -p $(BUILD)
$(GLSLANG) -V -S vert -o $(BUILD)/hud.vert.spv shaders/hud.vert
python3 scripts/spv_to_h.py $(BUILD)/hud.vert.spv $(BUILD)/hud.vert.spv.h hud_vert_spv
$(BUILD)/hud.frag.spv.h: shaders/hud.frag
mkdir -p $(BUILD)
$(GLSLANG) -V -S frag -o $(BUILD)/hud.frag.spv shaders/hud.frag
python3 scripts/spv_to_h.py $(BUILD)/hud.frag.spv $(BUILD)/hud.frag.spv.h hud_frag_spv
$(BUILD)/text.vert.spv.h: shaders/text.vert
mkdir -p $(BUILD)
$(GLSLANG) -V -S vert -o $(BUILD)/text.vert.spv shaders/text.vert
python3 scripts/spv_to_h.py $(BUILD)/text.vert.spv $(BUILD)/text.vert.spv.h text_vert_spv
$(BUILD)/text.frag.spv.h: shaders/text.frag
mkdir -p $(BUILD)
$(GLSLANG) -V -S frag -o $(BUILD)/text.frag.spv shaders/text.frag
python3 scripts/spv_to_h.py $(BUILD)/text.frag.spv $(BUILD)/text.frag.spv.h text_frag_spv