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) all: $(html.out) out/main.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 < $< > $@ index.all = $(filter-out %/ChangeLog.md %/index.md,$(html.src) $(shell find src -type f -name index.yaml)) index.filter = $(filter-out %/index.yaml,$(filter $(@D)/% $(patsubst out%,src%,$(@D))/%,$1)) index.cmd = bin/index $(patsubst .%,%,$(suffix $@)) $(@D) $(call index.filter,$^) | bin/write-atomic $@ index.dep = $(bin/index) bin/index.$1.erb .var.index.all $(index.all) bin/write-atomic Makefile out/index.md : $(call index.dep,md) ; $(index.cmd) out/%/index.md : $(call index.dep,md) ; $(index.cmd) out/index.atom : $(call index.dep,atom) ; $(index.cmd) out/%/index.atom : $(call index.dep,atom) ; $(index.cmd) 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)')