summaryrefslogtreecommitdiff
path: root/Makefile
blob: 9eb8c008793a334ab8b36fd9f9506881a3c3ca04 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
SHELL = bash -o pipefail

RUBYLIB := $(realpath .)/lib$(if $(RUBYLIB),:$(RUBYLIB))
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.dirs = $(sort $(patsubst src%,out%, \
  $(patsubst %/,%,$(dir $(html.src))) \
  $(shell find src -name index.yaml -printf '%h\n')))
html.out += out/index.atom $(addsuffix /index.html,$(html.dirs))

all: $(html.out) out/main.css
.PHONY: all out/tags

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)
	@mkdir -p $(@D)
	$(index.cmd)
out/%/index.md   : $(call index.dep,md)
	@mkdir -p $(@D)
	$(index.cmd)
out/index.atom   : $(call index.dep,atom)
	@mkdir -p $(@D)
	$(index.cmd)
out/%/index.atom : $(call index.dep,atom)
	@mkdir -p $(@D)
	$(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.*)


irb:
	irb
.PHONY: irb

.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)')