MODULES=xmodmap emacs xdg shepherd dunst zsh mcron mbsync nyxt work \
    herbstluftwm mpd polybar xbindkeys firefox

STOW = stow
EMACS = emacs
SCHEME_IMPLEMENTATION = guile
# Found this sed command here: https://stackoverflow.com/a/40778047
FIREFOX_PROFILE := $(shell sed -nr "/^Name=default/ { :l /^Path=/ { s/[^=]*=[ ]*//; p; q; }; n; b l; }" ~/.mozilla/firefox/profiles.ini 2>/dev/null)

.PRECIOUS: %.el

define tangle =
	@echo -e "\e[35mOBT\e[0m" $<
	@$(EMACS) -quick -batch \
        -eval "(package-initialize)" \
        -load ob-tangle \
        -eval "(setq sh-make-vars-local nil)" \
        -eval "(setq geiser-default-implementation '$(SCHEME_IMPLEMENTATION))" \
        -eval "(org-babel-tangle-file \"$<\" \"$(PWD)/$@\" \"$(1)\")"
endef

.PHONY: all clean $(MODULES) zsh

all: $(MODULES)

install: $(addsuffix -stow,$(MODULES))
clean: $(addsuffix -clean,$(MODULES))

before-%-install:				# Dummy recipe
	@true

%-stow: % before-%-install
	$(STOW) $<

%-install: %-stow				# Dummy recipe
	@true

%-uninstall:
	$(STOW) -D $(subst -uninstall,,$@)

## Picom

picom: picom/.config/picom.conf

picom/.config/picom.conf: picom/.config/picom.org
	$(call tangle,conf)

picom-clean:
	rm -f picom/.config/picom.conf

## Emacs

emacs: emacs/.config/shepherd/init.d/emacs.scm emacs/.config/emacs/init.elc

emacs-clean:
	rm -f emacs/.config/shepherd/init.d/emacs.scm emacs/.config/emacs/init.el \
	    emacs/.config/emacs/init.elc

## Xmodmap

xmodmap: xmodmap/.Xmodmap

xmodmap-clean:
	rm -f xmodmap/.Xmodmap

## Cower

cower: cower/.config/cower/config

cower/.config/cower/config: cower/.config/cower/config.org
	$(call tangle,conf-unix)

cower-clean:
	rm -f cower/.config/cower/config

## Mowedline

mowedline: mowedline/.config/mowedline/init.scm

mowedline/.config/mowedline/init.scm: SCHEME_IMPLEMENTATION = chicken
mowedline/.config/mowedline/init.scm: mowedline/.config/mowedline/init.org
	$(call tangle,scheme)

mowedline-clean:
	rm -f mowedline/.config/mowedline/init.scm

## Dunst

dunst: dunst/.config/dunst/dunstrc dunst/.config/shepherd/init.d/dunst.scm

## X11

x11-install: lib-install x11/dot-x11-0-1-any.pkg.tar.xz

x11/dot-x11-0-1-any.pkg.tar.xz: x11/PKGBUILD
	cd x11 && makepkg -sicf

## XDG

xdg: xdg/.config/mimeapps.list xdg/.config/user-dirs.dirs \
     xdg/.config/user-dirs.locale

# These files shouldn't be stowed because the applications managing/using them
# immediately replace the symbolic links with new files and the settings in them
# are lost.
xdg-stow:
	cp xdg/.config/mimeapps.list xdg/.config/user-dirs.dirs xdg/.config/user-dirs.locale $(HOME)/.config/

## Shepherd

shepherd: shepherd/.config/shepherd/init.scm

## Mcron

mcron: mcron/.config/shepherd/init.d/mcron.scm

## Mbsync

mbsync: mbsync/.config/cron/mbsync.guile

## ZSH

zsh: zsh/.profile zsh/.zshrc zsh/.zsh/functions/unzip.zwc \
     zsh/.zsh/functions/x-yank.zwc zsh/.zsh/functions/x-copy-region-as-kill.zwc

## Nyxt

nyxt: nyxt/.config/nyxt/init.lisp

## Firefox

ifneq ($(FIREFOX_PROFILE),)
firefox: firefox/.mozilla/firefox/$(FIREFOX_PROFILE)/chrome/userChrome.css

firefox/.mozilla/firefox/$(FIREFOX_PROFILE)/chrome/userChrome.css: firefox/src/userChrome.css
	mkdir -p $$(dirname $@)
	cp $^ $@
else
firefox:
	@echo "Error finding firefox default profile, can't make" >&2
firefox-stow:
	@echo "Error finding firefox default profile, can't stow" >&2
endif

## Helper

%.el: %.org
	$(call tangle,emacs-lisp)

%.elc: %.el
	@echo -e "\e[36mELC\e[0m" $<
	$(EMACS) -batch -f package-initialize -f batch-byte-compile $<

%: %.org
	$(call tangle)

.%: %.org
	$(call tangle)

%.zwc: %
	zsh -c "zcompile $@ $^"

check:
	$(SCHEME_IMPLEMENTATION) --no-auto-compile test.scm

new-dotfiles:

# Local Variables:
# outline-regexp: "##+"
# End: