.PHONY: lib-build lib-clean plug-install plug-sync plug-gc plug-clean setup
PREFIX = $(HOME)/.cache/nvim

CC = ccache clang

SRCDIRS = $(filter-out src/testing, $(wildcard src/*))
TARGETS = $(patsubst src/%, lib/%.so, $(SRCDIRS))

CFLAGS := -std=c2y -Wtautological-compare -Wsign-compare -Wall -Wextra -O3 \
		  -fforce-emit-vtables -ffunction-sections -fdata-sections -fPIC \
		  -faddrsig -march=native -mtune=native -funroll-loops -fomit-frame-pointer
LDFLAGS = -flto=full -fwhole-program-vtables -funroll-loops -fomit-frame-pointer \
		  -O3 -shared -lm
TESTFLAGS := -std=c2y -DTEST_MODE -gfull $(shell pkg-config --cflags luajit)
TESTLDFLAGS := -lm $(shell pkg-config --libs luajit)
TESTTARGETS := $(addsuffix /test, $(PREFIX))

lib-build: $(TARGETS)

$(TARGETS): lib/%.so: src/%
	$(CC) $</*.c $(CFLAGS) $(LDFLAGS) -o $@

lib-test: $(TESTTARGETS)

$(TESTTARGETS): %/test: %
	$(CC) $</*.c $(wildcard src/testing/*.c) $(TESTFLAGS) $(TESTLDFLAGS) -o $@
	./$@

lib-clean:
	rm $(TARGETS)

LLMFILE ?= llmfile.txt
FILES ?= makefile init.lua
DIRS ?= lua lua/ftplugin src/fuzpath src/testing make
FILES_IN_DIRS := $(wildcard $(addsuffix /*.*, $(DIRS)))
LIST_FILES ?= $(FILES) $(FILES_IN_DIRS)
$(LLMFILE): $(LIST_FILES) # for the LLM to read
	echo $^ | sed 's/ /\n/g' > $@
	echo >> $@ # newline
	# `head` automatically inserts the file name at the start of the file
	head -n 9999 $^ >> $@

llmfile: $(LLMFILE)

%/: ; mkdir -p $@