#!/usr/bin/make -f

HX_PLUGIN_DEV = /usr/share/hx-plugin-dev
CORE_GRAMMARS = $(shell cat debian/core-langs.txt 2>/dev/null || echo c cpp python rust bash make json toml markdown markdown_inline)
CORE_GRAMMARS_DIR = vendor/highlight-core
EXTRA_GRAMMARS_DIR = vendor/highlight-extra

%:
	dh $@

# refresh vendored tree-sitter grammar sources from the hx plugin metadata
update-highlight-core:
	./debian/update-highlight-core $(HX_PLUGIN_DEV)/languages.toml

define compile_grammar
	src_rel=$$(awk -v lang="$$lang" '\
		/^\[\[grammar\]\]/ { name = ""; next } \
		/^name = "/ { name = $$0; sub(/^name = "/, "", name); sub(/".*$$/, "", name); next } \
		name == lang && /^source = / { \
			if ($$0 ~ /subpath = "/) { src = $$0; sub(/^.*subpath = "/, "", src); sub(/".*$$/, "", src); print src "/src" } \
			else print "src"; \
			exit \
		}' $(HX_PLUGIN_DEV)/languages.toml); \
	if [ -z "$$src_rel" ]; then src_rel="src"; fi; \
	src_dir="$(1)/$$lang/$$src_rel"; \
	scanner_c="$$src_dir/scanner.c"; \
	scanner_cc="$$src_dir/scanner.cc"; \
	scanner_cpp="$$src_dir/scanner.cpp"; \
	objs=""; \
	if [ -f "$$scanner_cc" ]; then \
		$(CXX) $(CXXFLAGS) $(CPPFLAGS) -fPIC -shared -fno-exceptions -I $$src_dir -std=c++14 -c "$$scanner_cc" -o debian/grammars/$(2)/$$lang-scanner.o; \
		objs="debian/grammars/$(2)/$$lang-scanner.o"; \
	elif [ -f "$$scanner_cpp" ]; then \
		$(CXX) $(CXXFLAGS) $(CPPFLAGS) -fPIC -shared -fno-exceptions -I $$src_dir -std=c++14 -c "$$scanner_cpp" -o debian/grammars/$(2)/$$lang-scanner.o; \
		objs="debian/grammars/$(2)/$$lang-scanner.o"; \
	elif [ -f "$$scanner_c" ]; then \
		$(CC) $(CFLAGS) $(CPPFLAGS) -fPIC -shared -fno-exceptions -I $$src_dir -std=c11 -c "$$scanner_c" -o debian/grammars/$(2)/$$lang-scanner.o; \
		objs="debian/grammars/$(2)/$$lang-scanner.o"; \
	fi; \
	$(CC) $(CFLAGS) $(CPPFLAGS) $(LDFLAGS) -fPIC -shared -fno-exceptions -I $$src_dir -std=c11 $$objs "$$src_dir/parser.c" -o debian/grammars/$(2)/$$lang.so;
endef

override_dh_auto_build:
	mkdir -p debian/grammars/core debian/grammars/extra
	set -e; for lang in $(CORE_GRAMMARS); do \
		echo "Compiling core grammar: $$lang"; \
		$(call compile_grammar,$(CORE_GRAMMARS_DIR),core) \
	done
	if [ -d "$(EXTRA_GRAMMARS_DIR)" ]; then \
		set -e; for lang in $$(ls $(EXTRA_GRAMMARS_DIR) 2>/dev/null); do \
			echo "Compiling extra grammar: $$lang"; \
			$(call compile_grammar,$(EXTRA_GRAMMARS_DIR),extra) \
		done; \
	fi

override_dh_install:
	dh_install -phx-highlight-core debian/grammars/core/*.so usr/lib/hx/runtime/grammars/
	dh_install -phx-highlight-extra debian/grammars/extra/*.so usr/lib/hx/runtime/grammars/
	dh_install --remaining-packages

execute_before_dh_gencontrol:
	printf 'hx:PluginAbi=%s\n' "$$(HX_PLUGIN_DEV=$(HX_PLUGIN_DEV) hx-plugin-abi)" >> debian/hx-highlight-core.substvars
	printf 'hx:PluginAbi=%s\n' "$$(HX_PLUGIN_DEV=$(HX_PLUGIN_DEV) hx-plugin-abi)" >> debian/hx-highlight-extra.substvars
