CC = 9c
LD = 9l
PKG_CONFIG ?= pkg-config
CFLAGS ?= -O2 -g
WARN_CFLAGS = -Wall -Wextra
IBUS_CFLAGS = $(shell $(PKG_CONFIG) --cflags dbus-1 xkbcommon)
IBUS_LIBS = $(shell $(PKG_CONFIG) --libs dbus-1 xkbcommon)
XIM_CFLAGS = $(shell $(PKG_CONFIG) --cflags xcb-imdkit xkbcommon-x11)
XIM_LIBS = $(shell $(PKG_CONFIG) --libs xcb-imdkit xkbcommon-x11)
TEXT_CFLAGS = $(shell $(PKG_CONFIG) --cflags pangocairo cairo)
TEXT_LIBS = $(shell $(PKG_CONFIG) --libs pangocairo cairo)
POPUP_CFLAGS = $(shell $(PKG_CONFIG) --cflags xcb-randr)
POPUP_LIBS = $(shell $(PKG_CONFIG) --libs xcb-randr)
PROJECT_CPPFLAGS =
PROJECT_LDLIBS = -lthread -lbio -lxcb $(IBUS_LIBS) $(TEXT_LIBS) \
	$(XIM_LIBS) $(POPUP_LIBS)
PROG = strans
DOCKER_IMAGE = strans-build
DOCKER_RUN = docker run --rm --user "$$(id -u):$$(id -g)" \
	-v "$(CURDIR):/src" $(DOCKER_IMAGE)

SRCS = dict.c font.c hash.c ibus.c ipc.c ko.c main.c popup_layout.c \
	srv.c str.c strans.c trie.c vi.c win.c
XIMSRCS = xim/xim.c xim/keymap.c xim/ximtext.c
XIMOBJS = $(XIMSRCS:.c=.o)
OBJS = $(SRCS:.c=.o) $(XIMOBJS)

all: $(PROG) gtk

$(PROG): $(OBJS)
	$(LD) $(LDFLAGS) -o $@ $(OBJS) $(PROJECT_LDLIBS) $(LDLIBS)

$(OBJS): dat.h fn.h ipc.h
ibus.o: PROJECT_CPPFLAGS += $(IBUS_CFLAGS)
font.o: PROJECT_CPPFLAGS += $(TEXT_CFLAGS)
win.o: PROJECT_CPPFLAGS += $(POPUP_CFLAGS)
$(XIMOBJS): PROJECT_CPPFLAGS += -I. $(XIM_CFLAGS)

%.o: %.c
	$(CC) $(CPPFLAGS) $(PROJECT_CPPFLAGS) $(WARN_CFLAGS) $(CFLAGS) -c -o $@ $<

clean:
	rm -f $(OBJS) $(PROG)
	$(MAKE) -C tests clean
	$(MAKE) -C xim/ clean
	$(MAKE) -C gtk/ clean
	$(MAKE) -C bench/ clean

gtk:
	$(MAKE) -C gtk/

bench:
	$(MAKE) -C bench/

docker-image: Dockerfile
	docker build -t $(DOCKER_IMAGE) - < Dockerfile

docker-build:
	$(DOCKER_RUN) sh -c 'make clean && make all'

docker-check:
	$(DOCKER_RUN) sh -c 'make clean && \
		make check check-live check-stress UNITARGS="$(UNITARGS)"'

docker-check-live:
	$(DOCKER_RUN) sh -c 'make clean && make check-live'

docker-check-stress:
	$(DOCKER_RUN) sh -c 'make clean && make check-stress'

docker-bench:
	$(DOCKER_RUN) sh -c 'make clean && make bench'

docker: docker-image
	$(MAKE) docker-build

check: verify-map
	$(MAKE) -C tests check UNITARGS="$(UNITARGS)"
	$(MAKE) -C xim check

check-live: $(PROG) gtk
	$(MAKE) -C tests check-live

check-stress: $(PROG)
	$(MAKE) -C tests check-stress

test: check

verify-map:
	python3 map/mktelex.py | cmp - map/telex.map
	python3 -B map/mkemoji | cmp - map/emoji.dict
	python3 -B map/mkhanja | cmp - map/hanja.dict
	python3 -B map/verifymap.py map/*.map map/*.dict
	python3 -B tests/mkemoji_test.py
	python3 -B tests/mkhanja_test.py
	python3 -B tests/skk2ktrans_test.py

.PHONY: all check check-live check-stress test verify-map clean gtk bench \
	docker docker-image docker-build docker-check docker-check-live \
	docker-check-stress docker-bench
