EMACS ?= emacs
ROOT := $(patsubst %/,%,$(dir $(abspath $(lastword $(MAKEFILE_LIST)))))
SITE_LISP := $(ROOT)/site-lisp

INSTALL_INFO ?= $(shell command -v ginstall-info || printf install-info)
INFO_DIR ?= $(ROOT)/.cache

.PHONY: transient emms

all: magit git-modes emmet-mode expand-region rg wgrep avy mwim symbol-overlay markdown-mode emms dash yasnippet yaml file gptel nov org plantuml-mode posframe prettier rime f s sdcv vertico

clean: compat-clean cond-let-clean llama-clean transient-clean with-editor-clean magit-clean git-modes-clean emmet-mode-clean expand-region-clean rg-clean wgrep-clean avy-clean mwim-clean symbol-overlay-clean markdown-mode-clean emms-clean dash-clean yasnippet-clean yaml-clean file-clean gptel-clean nov-clean org-clean plantuml-mode-clean posframe-clean prettier-clean rime-clean f-clean s-clean sdcv-clean vertico-clean

compat:
	$(MAKE) -C $(SITE_LISP)/compat compile compat.info
	$(INSTALL_INFO) --info-dir=$(INFO_DIR) $(SITE_LISP)/compat/compat.info
compat-clean:
	$(INSTALL_INFO) --delete --quiet --info-dir=$(INFO_DIR) $(SITE_LISP)/compat/compat.info
	$(MAKE) -C $(SITE_LISP)/compat clean

cond-let:
	$(MAKE) -C $(SITE_LISP)/cond-let lisp
cond-let-clean:
	$(MAKE) -C $(SITE_LISP)/cond-let clean

llama: compat
	$(MAKE) -C $(SITE_LISP)/llama lisp
llama-clean:
	$(MAKE) -C $(SITE_LISP)/llama clean

transient: compat cond-let
	$(MAKE) -C $(SITE_LISP)/transient lisp info
transient-clean:
	$(MAKE) -C $(SITE_LISP)/transient clean

with-editor: compat cond-let
	$(MAKE) -C $(SITE_LISP)/with-editor lisp info
with-editor-clean:
	$(MAKE) -C $(SITE_LISP)/with-editor clean

magit: compat cond-let llama transient with-editor
	$(MAKE) -C $(SITE_LISP)/magit/lisp lisp
	$(MAKE) -C $(SITE_LISP)/magit info
magit-clean:
	$(MAKE) -C $(SITE_LISP)/magit clean

git-modes: compat
	$(MAKE) -C $(SITE_LISP)/git-modes lisp
git-modes-clean:
	$(MAKE) -C $(SITE_LISP)/git-modes clean

emmet-mode:
	$(MAKE) -C $(SITE_LISP)/emmet-mode
emmet-mode-clean:
	$(MAKE) -C $(SITE_LISP)/emmet-mode clean

expand-region:
	$(EMACS) -Q --batch  -L $(SITE_LISP)/expand-region -f batch-byte-compile $(SITE_LISP)/expand-region/*.el
expand-region-clean:
	$(RM) $(SITE_LISP)/expand-region/*.elc

rg: transient wgrep
	$(EMACS) -Q --batch -L $(SITE_LISP)/rg -L $(SITE_LISP)/transient -L $(SITE_LISP)/Emacs-wgrep -f batch-byte-compile $(SITE_LISP)/rg/*.el
	$(INSTALL_INFO) --info-dir=$(INFO_DIR) $(SITE_LISP)/rg/rgel.info
rg-clean:
	$(RM) $(SITE_LISP)/rg/*.elc
	$(INSTALL_INFO) --delete --quiet --info-dir=$(INFO_DIR) $(SITE_LISP)/rg/rgel.info

wgrep:
	$(MAKE) -C $(SITE_LISP)/Emacs-wgrep compile
wgrep-clean:
	$(MAKE) -C $(SITE_LISP)/Emacs-wgrep clean

avy:
	$(MAKE) -C $(SITE_LISP)/avy compile
avy-clean:
	$(MAKE) -C $(SITE_LISP)/avy clean

mwim:
	$(MAKE) -C $(SITE_LISP)/mwim
mwim-clean:
	$(MAKE) -C $(SITE_LISP)/mwim clean

symbol-overlay:
	$(MAKE) -C $(SITE_LISP)/symbol-overlay compile
symbol-overlay-clean:
	rm -f $(SITE_LISP)/symbol-overlay/*.elc

markdown-mode:
	$(MAKE) -C $(SITE_LISP)/markdown-mode
markdown-mode-clean:
	$(MAKE) -C $(SITE_LISP)/markdown-mode clean

emms:
	$(MAKE) -C $(SITE_LISP)/emms
	$(INSTALL_INFO) --info-dir=$(INFO_DIR) $(SITE_LISP)/emms/doc/emms.info
emms-clean:
	$(INSTALL_INFO) --delete --info-dir=$(INFO_DIR) $(SITE_LISP)/emms/doc/emms.info
	$(MAKE) -C $(SITE_LISP)/emms clean

dash:
	$(MAKE) -C $(SITE_LISP)/dash lisp
dash-clean:
	$(MAKE) -C $(SITE_LISP)/dash clean

yasnippet:
	$(MAKE) -C $(SITE_LISP)/yasnippet compile
	$(EMACS) -Q --batch -L $(SITE_LISP)/yasnippet -f batch-byte-compile $(SITE_LISP)/yasnippet-snippets/*.el
	$(EMACS) -Q --batch -L $(SITE_LISP)/yasnippet -f batch-byte-compile $(SITE_LISP)/auto-yasnippet/auto-yasnippet.el
yasnippet-clean:
	$(MAKE) -C $(SITE_LISP)/yasnippet clean
	$(RM) $(SITE_LISP)/yasnippet-snippets/*.elc
	$(RM) $(SITE_LISP)/auto-yasnippet/*.elc

yaml:
	$(MAKE) -C $(SITE_LISP)/yaml-mode
yaml-clean:
	$(MAKE) -C $(SITE_LISP)/yaml-mode clean

lua:
	$(MAKE) -C $(SITE_LISP)/lua-mode lua-mode.elc
lua-clean:
	$(RM) $(SITE_LISP)/lua-mode/lua-mode.elc

file:
	$(EMACS) -Q --batch -f batch-byte-compile $(SITE_LISP)/vimrc-mode/*.el
	$(EMACS) -Q --batch -f batch-byte-compile $(SITE_LISP)/nginx-mode/*.el
	$(EMACS) -Q --batch -L $(SITE_LISP)/tablist -f batch-byte-compile $(SITE_LISP)/tablist/*.el
	$(EMACS) -Q --batch -L $(SITE_LISP)/pdf-tools/lisp -L $(SITE_LISP)/tablist -f batch-byte-compile $(SITE_LISP)/pdf-tools/lisp/*.el
	$(MAKE) -C $(SITE_LISP)/pdf-tools loaddefs autobuild
	$(EMACS) -Q --batch -f batch-byte-compile $(SITE_LISP)/saveplace-pdf-view/*.el
	$(EMACS) -Q --batch -f batch-byte-compile $(SITE_LISP)/graphviz-dot-mode/*.el
	$(EMACS) -Q --batch -f batch-byte-compile $(SITE_LISP)/meson-mode/*.el
	$(EMACS) -Q --batch -f batch-byte-compile $(SITE_LISP)/crontab-mode/*.el
file-clean:
	$(RM) $(SITE_LISP)/vimrc-mode/*.elc
	$(RM) $(SITE_LISP)/nginx-mode/*.elc
	$(RM) $(SITE_LISP)/tablist/*.elc
	$(MAKE) -C $(SITE_LISP)/pdf-tools clean
	$(RM) $(SITE_LISP)/pdf-tools/lisp/pdf-tools-autoloads.el
	$(RM) $(SITE_LISP)/pdf-tools/lisp/*.elc
	$(RM) $(SITE_LISP)/saveplace-pdf-view/*.elc
	$(RM) $(SITE_LISP)/graphviz-dot-mode/*.elc
	$(RM) $(SITE_LISP)/meson-mode/*.elc
	$(RM) $(SITE_LISP)/crontab-mode/*.elc

gptel: transient compat
	$(EMACS) -Q --batch -L $(SITE_LISP)/transient -L $(SITE_LISP)/compat -L $(SITE_LISP)/gptel -f batch-byte-compile $(SITE_LISP)/gptel/*.el
gptel-clean:
	$(RM) $(SITE_LISP)/gptel/*.elc

nov:
	$(EMACS) -Q --batch -L $(SITE_LISP)/esxml -f batch-byte-compile $(SITE_LISP)/esxml/esxml.el $(SITE_LISP)/esxml/esxml-query.el
	$(EMACS) -Q --batch -L $(SITE_LISP)/esxml -f batch-byte-compile $(SITE_LISP)/nov/*.el
nov-clean:
	$(RM) $(SITE_LISP)/esxml/*.elc
	$(RM) $(SITE_LISP)/nov/*.elc

org:
	$(EMACS) -Q --batch -f batch-byte-compile $(SITE_LISP)/gntp/*.el
	$(EMACS) -Q --batch -L $(SITE_LISP)/alert -L $(SITE_LISP)/gntp -f batch-byte-compile $(SITE_LISP)/alert/alert.el
	$(EMACS) -Q --batch -L $(SITE_LISP)/alert -L $(SITE_LISP)/org-pomodoro -f batch-byte-compile $(SITE_LISP)/org-pomodoro/*.el
	$(EMACS) -Q --batch -f batch-byte-compile $(SITE_LISP)/tomelr/*.el
	$(EMACS) -Q --batch -L $(SITE_LISP)/tomelr -L $(SITE_LISP)/ox-hugo -f batch-byte-compile $(SITE_LISP)/ox-hugo/*.el
org-clean:
	$(RM) $(SITE_LISP)/gntp/*.elc
	$(RM) $(SITE_LISP)/alert/*.elc
	$(RM) $(SITE_LISP)/org-pomodoro/*.elc
	$(RM) $(SITE_LISP)/tomelr/*.elc
	$(RM) $(SITE_LISP)/ox-hugo/*.elc

plantuml-mode:
	$(EMACS) -Q --batch -L $(SITE_LISP)/dash -f batch-byte-compile $(SITE_LISP)/deflate/*.el
	$(EMACS) -Q --batch -L $(SITE_LISP)/dash -L $(SITE_LISP)/deflate -f batch-byte-compile $(SITE_LISP)/plantuml-mode/*.el
plantuml-mode-clean:
	$(RM) $(SITE_LISP)/deflate/*.elc
	$(RM) $(SITE_LISP)/plantuml-mode/*.elc

posframe:
	$(EMACS) -Q --batch -f batch-byte-compile $(SITE_LISP)/posframe/posframe.el
posframe-clean:
	$(RM) $(SITE_LISP)/posframe/*.elc

prettier:
	$(EMACS) -Q --batch -f batch-byte-compile $(SITE_LISP)/iter2/iter2.el
	$(EMACS) -Q --batch -L $(SITE_LISP)/s -L $(SITE_LISP)/dash -L $(SITE_LISP)/f -f batch-byte-compile $(SITE_LISP)/nvm/*.el
	$(EMACS) -Q --batch -L $(SITE_LISP)/iter2 -L $(SITE_LISP)/nvm -L $(SITE_LISP)/s -L $(SITE_LISP)/dash -L $(SITE_LISP)/f -f batch-byte-compile $(SITE_LISP)/prettier/*.el
prettier-clean:
	$(RM) $(SITE_LISP)/iter2/*.elc
	$(RM) $(SITE_LISP)/nvm/*.elc
	$(RM) $(SITE_LISP)/prettier/*.elc

.PHONY: rime
rime:
	$(MAKE) -C $(SITE_LISP)/emacs-rime lib
	$(EMACS) -Q --batch -L $(SITE_LISP)/emacs-rime -L $(SITE_LISP)/dash -L $(SITE_LISP)/posframe -f batch-byte-compile $(SITE_LISP)/emacs-rime/rime*.el
rime-clean:
	$(MAKE) -C $(SITE_LISP)/emacs-rime clean
	$(RM) $(SITE_LISP)/emacs-rime/*.elc

f:
	$(EMACS) -Q --batch -L $(SITE_LISP)/s -L $(SITE_LISP)/dash -f batch-byte-compile $(SITE_LISP)/f/*.el
f-clean:
	$(RM) $(SITE_LISP)/f/*.elc

s:
	$(EMACS) -Q --batch -f batch-byte-compile $(SITE_LISP)/s/*.el
s-clean:
	$(RM) $(SITE_LISP)/s/*.elc

sdcv:
	$(EMACS) -Q --batch -f batch-byte-compile $(SITE_LISP)/sdcv/*.el
sdcv-clean:
	$(RM) $(SITE_LISP)/sdcv/*.elc

vertico:
	$(EMACS) -Q --batch -f batch-byte-compile $(SITE_LISP)/marginalia/*.el
	$(EMACS) -Q --batch -f batch-byte-compile $(SITE_LISP)/vertico/*.el
	$(EMACS) -Q --batch -L $(SITE_LISP)/vertico -L $(SITE_LISP)/vertico/extensions -f batch-byte-compile $(SITE_LISP)/vertico/extensions/*.el
	$(EMACS) -Q --batch -f batch-byte-compile $(SITE_LISP)/corfu/*.el
	$(EMACS) -Q --batch -L $(SITE_LISP)/corfu -L $(SITE_LISP)/corfu/extensions -f batch-byte-compile $(SITE_LISP)/corfu/extensions/*.el
	$(EMACS) -Q --batch -L $(SITE_LISP)/orderless -f batch-byte-compile $(SITE_LISP)/orderless/*.el
	$(EMACS) -Q --batch -L $(SITE_LISP)/cape -f batch-byte-compile $(SITE_LISP)/cape/*.el
	$(EMACS) -Q --batch -L $(SITE_LISP)/consult -f batch-byte-compile $(SITE_LISP)/consult/*.el
	$(EMACS) -Q --batch -f batch-byte-compile $(SITE_LISP)/emacs-popon/*.el
	$(EMACS) -Q --batch -L $(SITE_LISP)/corfu -L $(SITE_LISP)/emacs-popon/ -f batch-byte-compile $(SITE_LISP)/emacs-corfu-terminal/*.el
	$(EMACS) -Q --batch -L $(SITE_LISP)/embark -L $(SITE_LISP)/consult -L $(SITE_LISP)/avy -f batch-byte-compile $(SITE_LISP)/embark/*.el
vertico-clean:
	$(RM) $(SITE_LISP)/marginalia/*.elc
	$(RM) $(SITE_LISP)/vertico/*.elc
	$(RM) $(SITE_LISP)/vertico/extensions/*.elc
	$(RM) $(SITE_LISP)/corfu/*.elc
	$(RM) $(SITE_LISP)/corfu/extensions/*.elc
	$(RM) $(SITE_LISP)/orderless/*.elc
	$(RM) $(SITE_LISP)/cape/*.elc
	$(RM) $(SITE_LISP)/consult/*.elc
	$(RM) $(SITE_LISP)/emacs-popon/*.elc
	$(RM) $(SITE_LISP)/emacs-corfu-terminal/*.elc
	$(RM) $(SITE_LISP)/embark/*.elc
