# SPDX-License-Identifier: BlueOak-1.0.0 # This file is licensed under the Blue Oak Model License 1.0.0. 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 tidy -quiet -modify -indent --wrap 100 --tidy-mark no articles/*.html || true tidy -quiet -modify -indent --wrap 100 --tidy-mark no series/*.html || true 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 $@ tidy -quiet -modify -indent --wrap 100 --tidy-mark no $@ || true # 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 $@ tidy -quiet -modify -indent --wrap 100 --tidy-mark no $@ || true # 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 tidy -quiet -modify -indent --wrap 100 --tidy-mark no blog*.html || true keyword-index.html: $(core-files) $(html-deps) $(articles-html) keyword-index.rkt racket -tm keyword-index.rkt tidy -quiet -modify -indent --wrap 100 --tidy-mark no $@ || true 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