SHELL = bash -o pipefail RUBYLIB=$(realpath .)/bin export RUBYLIB # Usage: $(call patsubst,PATTERN1 PATTERN2...,REPLACEMENT,TEXT) # # Like $(patsubst), but takes multiple patterns that are all replaced # with the same replacement. patsubst-all = $(if $1,$(call patsubst-all,$(wordlist 2,$(words $1),$1),$2,$(patsubst $(firstword $1),$2,$3)),$3) # Which suffixes can we turn in to HTML? html.suffixes = md org # Find all source files with those suffixes html.src = $(shell find src -type f \( -false $(foreach s,$(html.suffixes), -o -name '*.$s' ) \)) # Translate the source filenames into output filenames html.out = $(call patsubst-all,$(addprefix src/%.,$(html.suffixes)),out/%.html,$(html.src)) html.out += $(foreach d,$(sort $(dir $(patsubst src/%,out/%,$(html.src)))),$dindex.html $dindex.atom) mydir = $(patsubst %/,%,$(patsubst out/%,%,$(dir $@))) all: $(html.out) out/main.css out/DND/DND.css .PHONY: all bin/page = bin/page bin/util.rb bin/pandoc.rb bin/index = bin/index bin/util.rb bin/pandoc.rb out/%.html: src/%.md $(bin/page) bin/page.html.erb bin/write-atomic @mkdir -p $(@D) bin/page html $< | bin/write-atomic $@ out/%.html: out/%.md $(bin/page) bin/page.html.erb bin/write-atomic bin/page html $< | bin/write-atomic $@ out/%.html: src/%.org $(bin/page) bin/page.html.erb bin/write-atomic @mkdir -p $(@D) bin/page html $< | bin/write-atomic $@ out/%.html: out/%.org $(bin/page) bin/page.html.erb bin/write-atomic bin/page html $< | bin/write-atomic $@ out/%.css: src/%.scss @mkdir -p $(@D) scss --stdin < $< > $@ out/%.css: out/%.scss scss --stdin < $< > $@ out/index.md : $(bin/index) bin/index.md.erb .var.html.src $(html.src) bin/write-atomic bin/index md '$(mydir)' $(filter $(patsubst out%,src%,$(@D))/%,$^) | bin/write-atomic $@ out/%/index.md : $(bin/index) bin/index.md.erb .var.html.src $(html.src) bin/write-atomic bin/index md '$(mydir)' $(filter $(patsubst out%,src%,$(@D))/%,$^) | bin/write-atomic $@ out/index.atom : $(bin/index) bin/index.atom.erb .var.html.src $(html.src) bin/write-atomic bin/index atom '$(mydir)' $(filter $(patsubst out%,src%,$(@D))/%,$^) | bin/write-atomic $@ out/%/index.atom: $(bin/index) bin/index.atom.erb .var.html.src $(html.src) bin/write-atomic bin/index atom '$(mydir)' $(filter $(patsubst out%,src%,$(@D))/%,$^) | bin/write-atomic $@ serve: serve-8000 serve-%: all dir=$$(mktemp -d -t) && trap 'fusermount -u "$$dir"; rmdir "$$dir"' EXIT && unionfs -o ro out:src "$$dir" && (cd "$$dir" && python3 -m http.server $*) .PHONY: serve serve-% .var.%: FORCE bin/write-ifchanged @printf '%s' $(call quote.shell,$($*)) | sed 's/^/#/' | bin/write-ifchanged $@ -include $(wildcard .var.*) .PHONY: FORCE .DELETE_ON_ERROR: .SECONDARY: define nl endef # I put this as the last line in the file because it confuses Emacs syntax # highlighting and makes the remainder of the file difficult to edit. quote.shell = $(subst $(nl),'$$'\n'','$(subst ','\'',$1)')