BASE?=$(HOME)/src
TAILWIND  = $(BASE)/tailwind
LCSS      = $(BASE)/lightningcss
NODE_ARCH != node -p "process.arch"

.PHONY: all clean deps

all: $(TAILWIND)/.cli-built

$(TAILWIND)/node_modules: $(TAILWIND)
	cd $(TAILWIND) && doas corepack enable && doas corepack install --global pnpm && pnpm install --ignore-scripts

$(TAILWIND):
	git clone https://github.com/tailwindlabs/tailwindcss.git $@

$(LCSS):
	git clone https://github.com/parcel-bundler/lightningcss.git $@

$(TAILWIND)/.lcss-built: $(LCSS) $(TAILWIND)/node_modules
	LCSS_DIR=$$(ls $(TAILWIND)/node_modules/.pnpm | grep "^lightningcss@" | head -1); \
	LCSS_VER=$$(echo $$LCSS_DIR | sed 's/lightningcss@\([0-9.]*\).*/\1/'); \
	LCSS_PKGS=$(TAILWIND)/node_modules/.pnpm/$$LCSS_DIR/node_modules; \
	LCSS_NATIVE=$$LCSS_PKGS/lightningcss-freebsd-$(NODE_ARCH); \
	git -C $(LCSS) checkout v$$LCSS_VER; \
	cd $(LCSS) && cargo build --release -p lightningcss_node && \
	mkdir -p $$LCSS_NATIVE && \
	cp target/release/liblightningcss_node.so $$LCSS_NATIVE/lightningcss.freebsd-$(NODE_ARCH).node && \
	printf '{"name":"lightningcss-freebsd-$(NODE_ARCH)","version":"%s","main":"lightningcss.freebsd-$(NODE_ARCH).node"}\n' $$LCSS_VER \
	  > $$LCSS_NATIVE/package.json && \
	node -e "require('$$LCSS_PKGS/lightningcss')" && \
	touch $@

$(TAILWIND)/.oxide-built: $(TAILWIND)/node_modules
	cd $(TAILWIND) && cargo build --release -p tailwind-oxide && \
	cp target/release/libtailwind_oxide.so \
	   "$(TAILWIND)/crates/node/tailwindcss-oxide.freebsd-$(NODE_ARCH).node" && \
	cd $(TAILWIND)/crates/node && pnpm run build:platform && \
	touch $@

$(TAILWIND)/.parcel-built: $(TAILWIND)/node_modules
	for dir in $$(ls -d $(TAILWIND)/node_modules/.pnpm/@parcel+watcher@*/node_modules/@parcel/watcher); do \
		WATCHER_VER=$$(node -p "require('$$dir/package.json').version"); \
		WATCHER_NATIVE=$$dir/../watcher-freebsd-$(NODE_ARCH); \
		rm -rf $$dir/build; \
		cd $$dir && node-gyp rebuild --python=python3.13 || true; \
		mkdir -p $$WATCHER_NATIVE; \
		cp $$dir/build/Release/watcher.node $$WATCHER_NATIVE/; \
		printf '{"name":"@parcel/watcher-freebsd-$(NODE_ARCH)","version":"%s","main":"watcher.node"}\n' $$WATCHER_VER \
		  > $$WATCHER_NATIVE/package.json; \
		node -e "require('$$dir')" || true; \
	done && touch $@

$(TAILWIND)/.pkg-fixed: $(TAILWIND)
	sed -i.bak 's|"import": "./src/index.ts"|"import": "./dist/lib.mjs"|' \
	  $(TAILWIND)/packages/tailwindcss/package.json && \
	touch $@

$(TAILWIND)/.tailwindcss-built: $(TAILWIND)/.pkg-fixed $(TAILWIND)/.lcss-built
	cd $(TAILWIND)/packages/tailwindcss && pnpm run build && \
	touch $@

$(TAILWIND)/.node-built: $(TAILWIND)/.tailwindcss-built $(TAILWIND)/.oxide-built $(TAILWIND)/.parcel-built
	cd $(TAILWIND)/packages/@tailwindcss-node && pnpm run build && \
	touch $@

$(TAILWIND)/.cli-built: $(TAILWIND)/.node-built
	cd $(TAILWIND)/packages/@tailwindcss-cli && pnpm run build && \
	touch $@

clean:
	rm -rf $(TAILWIND) $(LCSS)

deps:
	doas pkg install -yr FreeBSD-ports devel/git devel/pkgconf \
    lang/gcc lang/python lang/rust www/npm-node24
