Hook grammars into your default target, then add languages by listing them in TS_LANGS.
# tree-sitter grammars
TS_LANGS := go
TS_BUILD := _tmp/ts-grammars-src
.PHONY: grammars
grammars:
@for lang in $(TS_LANGS); do \
out=ts-grammars/$$lang; \
if [ -f $$out/$$lang.dylib ]; then echo "✓ grammar $$lang"; continue; fi; \
case $$lang in \
*) repo=https://github.com/tree-sitter/tree-sitter-$$lang ;; \
esac; \
echo "building grammar $$lang from $$repo"; \
mkdir -p $$out $(TS_BUILD); \
test -d $(TS_BUILD)/tree-sitter-$$lang || git clone --depth 1 $$repo $(TS_BUILD)/tree-sitter-$$lang; \
src=$(TS_BUILD)/tree-sitter-$$lang/src; \
if [ -f $$src/scanner.cc ]; then \
cc -c -fPIC -O2 -I $$src $$src/parser.c -o $(TS_BUILD)/$$lang-parser.o; \
c++ -c -fPIC -O2 -I $$src $$src/scanner.cc -o $(TS_BUILD)/$$lang-scanner.o; \
c++ -shared $(TS_BUILD)/$$lang-parser.o $(TS_BUILD)/$$lang-scanner.o -o $$out/$$lang.dylib; \
else \
files="$$src/parser.c"; \
[ -f $$src/scanner.c ] && files="$$files $$src/scanner.c"; \
cc -shared -fPIC -O2 -I $$src $$files -o $$out/$$lang.dylib; \
fi; \
cp $(TS_BUILD)/tree-sitter-$$lang/queries/highlights.scm $$out/highlights.scm; \
echo "✓ grammar $$lang"; \
done