summaryrefslogtreecommitdiff
path: root/Makefile
diff options
context:
space:
mode:
Diffstat (limited to 'Makefile')
-rw-r--r--Makefile69
1 files changed, 69 insertions, 0 deletions
diff --git a/Makefile b/Makefile
new file mode 100644
index 0000000..0df6b25
--- /dev/null
+++ b/Makefile
@@ -0,0 +1,69 @@
+CC ?= cc
+NUKLEAR_DIR ?= vendor
+TARGET := kanji-deck
+
+CPPFLAGS := -D_POSIX_C_SOURCE=200809L -DNK_INCLUDE_DEFAULT_ALLOCATOR -DNK_BUTTON_TRIGGER_ON_RELEASE -Iinclude -isystem $(NUKLEAR_DIR)
+
+LDLIBS := -lX11 -lm
+XFT_CFLAGS := $(shell pkg-config --cflags xft 2>/dev/null)
+XFT_LIBS := $(shell pkg-config --libs xft 2>/dev/null)
+ifneq ($(strip $(XFT_LIBS)),)
+CPPFLAGS += -DNK_XLIB_USE_XFT $(XFT_CFLAGS)
+LDLIBS += $(XFT_LIBS)
+endif
+C89FLAGS ?= -std=c89 -pedantic-errors -Wall -Wextra -Werror \
+ -Wstrict-prototypes -Wmissing-prototypes -Wformat=2 \
+ -Wformat-security -Wconversion -Wsign-conversion
+LDFLAGS ?=
+
+APP_OBJECTS := src/main.o src/kd_deck.o src/kd_image.o src/nuklear_impl.o
+
+.PHONY: all clean check check-image check-deps
+
+all: $(TARGET)
+
+check-deps:
+ @test -f "$(NUKLEAR_DIR)/nuklear.h" || { \
+ echo "Missing $(NUKLEAR_DIR)/nuklear.h; copy Nuklear's single header there." >&2; exit 1; }
+ @test -f "$(NUKLEAR_DIR)/nuklear_xlib.h" || { \
+ echo "Missing $(NUKLEAR_DIR)/nuklear_xlib.h; copy demo/x11/nuklear_xlib.h there." >&2; exit 1; }
+
+$(APP_OBJECTS): | check-deps
+
+src/main.o: src/main.c include/kd_deck.h include/kd_image.h
+ $(CC) $(CPPFLAGS) $(C89FLAGS) -c $< -o $@
+
+src/kd_deck.o: src/kd_deck.c include/kd_deck.h
+ $(CC) $(CPPFLAGS) $(C89FLAGS) -c $< -o $@
+
+src/kd_image.o: src/kd_image.c include/kd_image.h
+ $(CC) $(CPPFLAGS) $(C89FLAGS) -c $< -o $@
+
+src/nuklear_impl.o: src/nuklear_impl.c
+ $(CC) $(CPPFLAGS) -std=c89 -pedantic-errors -w -c $< -o $@
+
+$(TARGET): $(APP_OBJECTS)
+ $(CC) $(LDFLAGS) $(APP_OBJECTS) -o $@ $(LDLIBS)
+
+check: tests/test_deck
+ ./tests/test_deck
+
+check-image: tests/test_image
+ @set -eu; temp=$$(mktemp -d); trap 'rm -rf "$$temp"' EXIT HUP INT TERM; \
+ printf 'P3\n2 1\n255\n255 0 0 0 255 0\n' > "$$temp/p3.ppm"; \
+ printf 'P6\n2 1\n255\n\377\000\000\000\377\000' > "$$temp/p6.ppm"; \
+ if command -v xvfb-run >/dev/null 2>&1; then \
+ xvfb-run -a ./tests/test_image "$$temp/p3.ppm" "$$temp/p6.ppm"; \
+ else \
+ ./tests/test_image "$$temp/p3.ppm" "$$temp/p6.ppm"; \
+ fi
+
+tests/test_image: tests/test_image.c src/kd_image.c include/kd_image.h
+ $(CC) $(CPPFLAGS) $(C89FLAGS) tests/test_image.c src/kd_image.c -o $@ -lX11
+
+tests/test_deck: tests/test_deck.c src/kd_deck.c include/kd_deck.h
+ $(CC) -D_POSIX_C_SOURCE=200809L -Iinclude $(C89FLAGS) \
+ tests/test_deck.c src/kd_deck.c -o $@
+
+clean:
+ rm -f $(TARGET) $(APP_OBJECTS) tests/test_deck tests/test_image