1.PHONY: all queries tsbuild valgrind tests format clean
 2
 3TARGET = crep
 4ABI_CHECK_TARGET = abicheck
 5SOURCES = $(filter-out check.c abicheck.c, $(wildcard *.c *.h queries/*.h))
 6TS_ALIBS = $(shell find vendor -name "*.a" -print)
 7VENDOR_DIRS = $(wildcard vendor/*)
 8CFLAGS = $(EXTRA_FLAGS) -Wall -Wextra -std=gnu99 -pedantic -O3
 9LIBS = -I./vendor/tree-sitter/lib/include -lpthread
10
11LANGS = c cpp python php go rust javascript lua zig kotlin odin tcl glsl cuda
12QUERY_HEADERS = $(patsubst %, queries/%.h, $(LANGS))
13TS_SUBDIRS = tree-sitter $(patsubst %, tree-sitter-%, $(LANGS))
14
15$(info VENDOR_DIRS: $(VENDOR_DIRS))
16$(info LANGS: $(LANGS))
17$(info QUERY_HEADERS: $(QUERY_HEADERS))
18$(info TS_SUBDIRS: $(TS_SUBDIRS))
19$(info SOURCES: $(SOURCES))
20$(info TS_ALIBS: $(TS_ALIBS))
21$(info CFLAGS: $(CFLAGS))
22$(info LIBS: $(LIBS))
23
24all: $(QUERY_HEADERS) tsbuild $(TARGET) $(ABI_CHECK_TARGET)
25
26tsbuild:
27	$(MAKE) -C vendor/tree-sitter libtree-sitter.a
28	@for lang in $(LANGS); do \
29		$(MAKE) -C vendor/tree-sitter-$$lang libtree-sitter-$$lang.a || true; \
30	done
31
32$(TARGET): $(SOURCES) tsbuild
33	$(CC) $(CFLAGS) $(SOURCES) $(LIBS) -o $(TARGET) $(shell find vendor -name "*.a")
34
35$(ABI_CHECK_TARGET): abicheck.c tsbuild
36	$(CC) $(CFLAGS) abicheck.c $(LIBS) $(filter-out %/libtree-sitter.a, $(wildcard vendor/**/*.a)) vendor/tree-sitter/libtree-sitter.a -o $(ABI_CHECK_TARGET)
37
38queries/%.h: queries/%.scm
39	xxd -i -n query_$* $< > $@
40
41queries: $(QUERY_HEADERS)
42
43valgrind:
44	valgrind -s --leak-check=full ./$(TARGET)
45
46tests: $(TARGET)
47	sh tests.sh
48
49format:
50	clang-format -i *.c *.h
51
52clean:
53	rm -f *.o $(TARGET) $(ABI_CHECK_TARGET) callgrind.out.* queries/*.h
54	@for dir in $(TS_SUBDIRS); do \
55		$(MAKE) -C vendor/$$dir clean; \
56	done