# SPDX-FileCopyrightText: 2026 Andrew Oberstar <andrew@ajoberstar.org>
# SPDX-License-Identifier: AGPL-3.0-only

APPNAME = quixote

PREFIX ?= /usr
BINDIR = $(PREFIX)/bin
SHAREDIR = $(PREFIX)/share/$(APPNAME)

LISP ?= sbcl
LISP_SRC = $(wildcard src/*.lisp)
LISP_TEST = $(wildcard test/*.lisp)

ifeq ($(LISP),sbcl)
LISP_OPTS = --no-sysinit --no-userinit
endif

BUILD_DIR = build
LIBS = $(BUILD_DIR)/libs.stamp
QUICKLISP_DIR = $(BUILD_DIR)/quicklisp
MANIFEST = $(BUILD_DIR)/manifest.ql

ifeq ($(OS),Windows_NT)
EXE = .exe
else
EXE =
endif

QUIXOTE = $(BUILD_DIR)/bin/$(APPNAME)$(EXE)

all: $(QUIXOTE)

clean:
	rm -rf $(BUILD_DIR)

$(QUICKLISP_DIR)/local-projects/asdf:
	git clone --depth 1 --branch release https://gitlab.common-lisp.net/asdf/asdf.git $@

$(QUICKLISP_DIR)/local-projects/fiveam-asdf:
	git clone --depth 1 --branch release https://github.com/rpgoldman/fiveam-asdf.git $@

clones: $(QUICKLISP_DIR)/local-projects/asdf \
	$(QUICKLISP_DIR)/local-projects/fiveam-asdf ;

$(QUICKLISP_DIR)/setup.lisp:
	mkdir -p $(QUICKLISP_DIR)
	curl -o $(BUILD_DIR)/quicklisp.lisp http://beta.quicklisp.org/quicklisp.lisp
	$(LISP) $(LISP_OPTS) --non-interactive \
	--load $(BUILD_DIR)/quicklisp.lisp \
	--eval '(quicklisp-quickstart:install :path "$(QUICKLISP_DIR)")' \
	--eval '(quit)'

quicklisp: $(QUICKLISP_DIR)/setup.lisp ;

$(LIBS): $(QUICKLISP_DIR)/setup.lisp clones
	$(LISP) $(LISP_OPTS) --non-interactive \
	--load $(QUICKLISP_DIR)/setup.lisp \
	--eval '(push "$(PWD)/" ql:*local-project-directories*)' \
	--eval '(ql:quickload "org.ajoberstar.quixote")' \
	--eval '(quit)'

libs: $(LIBS) ;

$(MANIFEST): $(LIBS) clones
	$(LISP) $(LISP_OPTS) --non-interactive \
	--load $(QUICKLISP_DIR)/setup.lisp \
	--eval '(ql:write-asdf-manifest-file "$(MANIFEST)")' \
	--eval '(quit)'

manifest: $(MANIFEST) ;

test: $(MANIFEST) $(LISP_SRC) $(LISP_TEST)
	$(LISP) $(LISP_OPTS) --non-interactive \
	--load $(QUICKLISP_DIR)/setup.lisp \
	--eval '(push "$(PWD)/" ql:*local-project-directories*)' \
	--eval '(ql:quickload "org.ajoberstar.quixote/test")' \
	--eval '(asdf:test-system "org.ajoberstar.quixote")' \
	--eval '(quit)'

$(QUIXOTE): $(MANIFEST) $(LISP_SRC)
	mkdir -p $(dir $@)
	$(LISP) $(LISP_OPTS) --non-interactive \
	--load $(QUICKLISP_DIR)/setup.lisp \
	--eval '(push "$(PWD)/" ql:*local-project-directories*)' \
	--eval '(ql:quickload "org.ajoberstar.quixote")' \
	--eval '(asdf:make "org.ajoberstar.quixote")' \
	--eval '(quit)'

install: $(QUIXOTE)
	install -Dm755 $(QUIXOTE) $(DESTDIR)$(BINDIR)/$(APPNAME)
	install -Dm644 $(APPNAME).service $(DESTDIR)$(PREFIX)/lib/systemd/system/$(APPNAME).service
	find static/ -type f -exec install -Dm644 "{}" "$(DESTDIR)$(SHAREDIR)/{}" \;
	install -Dm755 -d $(DESTDIR)/var/lib/$(APPNAME)

.PHONY: clean test
