HOST ?= niss.website REMOTE_USER ?= www-data REMOTE_DIR ?= blog TMPDIR ?= _tmp BUILDDIR ?= /srv/www/blog POSTSDIR ?= posts IMAGESDIR ?= images TEMPLATEDIR ?= templates STATICS := \ $(subst $(POSTSDIR)/,, $(shell find $(POSTSDIR) -type f -not -iname '*.md')) \ $(shell find $(IMAGESDIR) -type f) POSTS != find $(POSTSDIR) -name '*.md' OUTPUTPOSTS = \ $(patsubst $(POSTSDIR)/%.md,$(BUILDDIR)/%.html,$(POSTS)) \ $(addprefix $(BUILDDIR)/,$(STATICS)) \ $(BUILDDIR)/index.html $(BUILDDIR)/rss.xml STYLE != find style -type f OUTPUTSTYLE = $(patsubst %.scss,%.css,$(patsubst %,$(BUILDDIR)/%,$(STYLE))) SCRIPT != find script -type f OUTPUTSCRIPT = $(patsubst %.ts,%.js,$(patsubst %,$(BUILDDIR)/%,$(SCRIPT))) OUTPUT = $(OUTPUTPOSTS) $(OUTPUTSTYLE) $(OUTPUTSCRIPT) ALL_TAGS = $(TMPDIR)/all-tags POST_LISTS = $(TMPDIR)/post-lists COMBO_FILTER = $(TMPDIR)/combo-filter EXECS = $(ALL_TAGS) $(POST_LISTS) $(COMBO_FILTER) CABAL_FLAGS ?= -O SYNTAXDIR := syntax SYNTAXFILES != find $(SYNTAXDIR) -name *.xml SYNTAXFLAGS = $(patsubst %,--syntax-definition=%,$(SYNTAXFILES)) .PHONY: all all: build .PHONY: build build: $(EXECS) $(OUTPUT) POSTDEPS = \ $(TEMPLATEDIR)/* \ $(SYNTAXFILES) acm.csl quox.bib $(TMPDIR)/all-tags.md $(TMPDIR)/tags.mk &: $(POSTS) $(ALL_TAGS) @echo "[all-tags]" $(ALL_TAGS) $(POSTSDIR) $(TMPDIR)/all-tags.md $(TMPDIR)/tags.mk build: $(BUILDDIR)/all-tags.html include $(TMPDIR)/tags.mk $(BUILDDIR)/%.html: $(POSTSDIR)/%.md $(POSTDEPS) ; $(call pandoc,post.html) $(BUILDDIR)/%.html: $(TMPDIR)/%.md $(POSTDEPS) ; $(call pandoc-simple,meta.html) $(BUILDDIR)/rss.xml: $(TMPDIR)/index.md $(POSTDEPS) $(call pandoc,rss.xml,--metadata-file rss.yaml --write html) $(BUILDDIR)/%.css: %.scss @echo "[sass]" $@ mkdir -p $(dir $@) sass --no-source-map -I style $< $@ $(BUILDDIR)/%.js: %.ts @echo "[tsc]" $@ mkdir -p $(dir $@) tsc --strict --noUncheckedIndexedAccess --noEmitOnError \ --lib dom,es2021 --target es2015 \ --outDir $(dir $@) $^ # $(1): template file # $(2): extra flags define pandoc @echo "[pandoc] $(subst $(TMPDIR)/,,$(subst $(BUILDDIR)/,,$@))" mkdir -p $(dir $@) mkdir -p $(basename $@) LANG_COLOR="currentcolor" \ pandoc -s --toc --toc-depth=2 --template $(TEMPLATEDIR)/$(1) -o $@ $< \ -f markdown+emoji $(2) \ -M filename=$(subst $(BUILDDIR)/,,$@) --metadata-file=rss.yaml \ $(SYNTAXFLAGS) --filter $(COMBO_FILTER) \ --mathml --citeproc --csl=apa-eu.csl endef # $(1): template file define pandoc-simple @echo "[pandoc] $(subst $(TMPDIR)/,,$(subst $(BUILDDIR)/,,$@))" mkdir -p $(dir $@) mkdir -p $(basename $@) pandoc -s --template $(TEMPLATEDIR)/$(1) -o $@ $< \ -M filename=$(subst $(BUILDDIR)/,,$@) --metadata-file=rss.yaml endef $(BUILDDIR)/%: $(POSTSDIR)/% ; $(call copy) $(BUILDDIR)/%: $(TMPDIR)/% ; $(call copy) $(BUILDDIR)/%: % ; $(call copy) define copy @echo "[copy] $<" mkdir -p $(dir $@) cp $< $@ endef BLOG_META_DEPS != find blog-meta -type f $(ALL_TAGS): $(BLOG_META_DEPS) ; $(call cabal-exe,blog-meta:) $(POST_LISTS): $(BLOG_META_DEPS) ; $(call cabal-exe,blog-meta:) $(COMBO_FILTER): $(BLOG_META_DEPS) ; $(call cabal-exe,blog-meta:) define cabal-exe @echo "[build] $(notdir $@)" cabal build $(1)$(notdir $@) $(CABAL_FLAGS) mkdir -p $(dir $@) find dist-newstyle -name $(notdir $@) -type f -exec cp {} $(TMPDIR) \; endef upload: build @echo "[upload]" @rsync --recursive --partial --progress --copy-links \ --compress --human-readable --hard-links \ --delete --delete-after \ --rsh='ssh -l $(REMOTE_USER)' \ $(BUILDDIR)/ $(HOST):$(REMOTE_DIR)/ .PHONY: clean distclean clean: @echo "[clean]" rm -rf $(BUILDDIR) rm -rf $(TMPDIR) distclean: clean @echo "[distclean]" cabal clean .SILENT: