@@ -4,16 +4,85 @@ # Copying and distribution of this file, with or without modification, # are permitted in any medium without royalty provided the copyright # notice and this notice are preserved. This file is offered as-is, # without any warranty. # +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 +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.p + 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. +blog-pg1.html: $(core-files) $(html-deps) $(articles-html) blog.rkt + rm -f blog*.html + racket -tm blog.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 + 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/ @@ -27,8 +96,16 @@ @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 util/newpost.rkt -.PHONY: scribble help spritz article +.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