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