# Licensed under the terms of the Blue Oak Model License 1.0.0
# https://blueoakcouncil.org/license/1.0.0
# You may not use this file except in compliance with that license.
SHELL = /bin/bash
# ~~~ Variables used by rules ~~~
#
core-files := pollen.rkt dust.rkt
html-deps := snippets-html.rkt tags-html.rkt
article-sources := $(wildcard articles/*.poly.pm)
articles-html := $(patsubst %.poly.pm, %.html, $(article-sources))
articles-pdf := $(patsubst %.poly.pm, %.pdf, $(article-sources))
series-sources := $(wildcard series/*.poly.pm)
series-html := $(patsubst %.poly.pm, %.html, $(series-sources))
# ~~~ Rules ~~
#
# The order of these dependencies is important. They will be processed left to right.
web: _article_htmls.mark $(articles-html) $(series-html) blog-pg1.html keyword-index.html
web: ## Rebuild all web content (not PDFs)
# The file article_htmls.mark is a zero-byte file that serves only as a marker. If it is older than
# any of its dependencies (or missing) all of the articles will be rebuilt. Its dependencies are
# also on the Pollen cache watchlist (see pollen.rkt)
_article_htmls.mark: $(core-files) $(html-deps) template.html.p
raco pollen setup articles/
raco pollen render -p -t html articles/*.poly.pm
raco pollen setup series/
raco pollen render -p -t html series/*.poly.pm
touch _article_htmls.mark
# If the rule for article_htmls.mark was triggered, all the article HTML files will already have
# been re-rendered. (That rule comes before this one in the list of dependencies for "all") But if
# not, any individual files that have been edited will get re-rendered.
$(articles-html): %.html: %.poly.pm
raco pollen render $@
# Note that if any article is part of a series, it will touch its series .poly.pm file during its
# render, triggering this rule for that series.
$(series-html): %.html: %.poly.pm
raco pollen render $@
# This target will also rebuild pg2, pg3, etc. as needed
blog-pg1.html: $(core-files) $(html-deps) $(articles-html) blog.rkt
rm -f blog*.html
racket -tm blog.rkt
keyword-index.html: $(core-files) $(html-deps) $(articles-html) keyword-index.rkt
racket -tm keyword-index.rkt
spritz: ## Clear Pollen and Scribble cache
rm -rf compiled code-docs/compiled articles/compiled series/compiled
fossil clean code-docs/
publish: check-env
publish: ## Sync all HTML and PDF stuff to the public web server (does not rebuild any files)
raco pollen publish
./util/relativize ~/Desktop/publish/
rsync -av ~/Desktop/publish/ -e 'ssh -p $(WEB_SRV_PORT)' $(LOCALYARN_SRV) \
--delete \
--exclude=drafts \
--exclude=code-docs \
--exclude=util \
--exclude=x-mockup \
--exclude=repo-www \
--exclude=scribbled \
--exclude='*.sqlite' \
--exclude='*.fossil' \
--exclude=.fossil-settings \
--exclude=.fslckout \
--exclude='*.ltx' \
--exclude='*.swp' \
--exclude='*.mark' \
--exclude=.DS_Store \
--exclude='template*.*' \
--exclude=makefile
rm -rf ~/Desktop/publish
scribble: ## Rebuild code documentation and update Fossil repo
scribble --htmls +m --redirect https://docs.racket-lang.org/local-redirect/ code-docs/main.scrbl
fossil uv rm scribbled/*
rm -rf scribbled/*
mv main/* scribbled/
cp code-docs/scribble-iframe.html scribbled/scribble.html
rm -rf main
fossil uv add scribbled/*
fossil uv sync
# Self-documenting makefile (http://marmelab.com/blog/2016/02/29/auto-documented-makefile.html)
help: ## Displays this help screen
@grep -E '^[a-zA-Z_-]+:.*?## .*$$' $(MAKEFILE_LIST) | sort | awk 'BEGIN {FS = ":.*?## "}; {printf "\033[36m%-15s\033[0m %s\n", $$1, $$2}'
article: ## Start a new article from a template
racket -tm util/newpost.rkt
.PHONY: all scribble help spritz article publish check-env
.DEFAULT_GOAL := help
check-env:
ifndef LOCALYARN_SRV
$(error LOCALYARN_SRV env variable not set, should be a destination valid for rsync)
endif
ifndef WEB_SRV_PORT
$(error WEB_SRV_PORT env variable not set, should be SSH port number for web server)
endif