114 lines
4.6 KiB
Makefile
114 lines
4.6 KiB
Makefile
.PHONY: build deploy sign download-model download-pdfjs convert-images pdf-thumbs pdfs watch clean dev
|
|
|
|
# Source .env for GITHUB_TOKEN and GITHUB_REPO if it exists.
|
|
# .env format: KEY=value (one per line, no `export` prefix, no quotes needed).
|
|
-include .env
|
|
export
|
|
|
|
build:
|
|
# Auto-snapshot any uncommitted content/ changes BEFORE the build
|
|
# so the stability heuristic in build/Stability.hs sees a stable
|
|
# git history. If a subsequent step fails, the snapshot remains in
|
|
# the history — that's intentional. The next successful build
|
|
# either reuses it (no new content/ changes) or appends another
|
|
# snapshot on top, so failures don't disappear from the log.
|
|
@git add content/
|
|
@git diff --cached --quiet || git commit -m "auto: $$(date -u +%Y-%m-%dT%H:%M:%SZ)"
|
|
@date +%s > data/build-start.txt
|
|
@./tools/convert-images.sh
|
|
@$(MAKE) -s pdf-thumbs
|
|
@./tools/download-pdfjs.sh
|
|
cabal run site -- build
|
|
pagefind --site _site
|
|
@if [ -d .venv ]; then \
|
|
uv run python tools/embed.py || echo "Warning: embedding failed — data/similar-links.json not updated (build continues)"; \
|
|
else \
|
|
echo "Embedding skipped: run 'uv sync' to enable similar-links (build continues)"; \
|
|
fi
|
|
> IGNORE.txt
|
|
@BUILD_END=$$(date +%s); \
|
|
BUILD_START=$$(cat data/build-start.txt); \
|
|
echo $$((BUILD_END - BUILD_START)) > data/last-build-seconds.txt
|
|
|
|
sign:
|
|
@./tools/sign-site.sh
|
|
|
|
# Download the quantized ONNX model for client-side semantic search.
|
|
# Run once; files are gitignored. Safe to re-run (skips existing files).
|
|
download-model:
|
|
@./tools/download-model.sh
|
|
|
|
# Vendor Mozilla's prebuilt PDF.js viewer into static/pdfjs/.
|
|
# Runs automatically as part of `build` (skips when already present).
|
|
# Files are gitignored; sha256-verified against tools/pdfjs-checksums.sha256.
|
|
download-pdfjs:
|
|
@./tools/download-pdfjs.sh
|
|
|
|
# Convert JPEG/PNG images to WebP companions (also runs automatically in build).
|
|
# Requires cwebp: pacman -S libwebp / apt install webp
|
|
convert-images:
|
|
@./tools/convert-images.sh
|
|
|
|
# Generate first-page thumbnails for PDFs in static/papers/ (also runs in build).
|
|
# Requires pdftoppm: pacman -S poppler / apt install poppler-utils
|
|
# Thumbnails are written as static/papers/foo.thumb.png alongside each PDF.
|
|
# Skipped silently when pdftoppm is not installed or static/papers/ is empty.
|
|
pdf-thumbs:
|
|
@if command -v pdftoppm >/dev/null 2>&1; then \
|
|
find static/papers -name '*.pdf' 2>/dev/null | while read pdf; do \
|
|
thumb="$${pdf%.pdf}.thumb"; \
|
|
if [ ! -f "$${thumb}.png" ] || [ "$$pdf" -nt "$${thumb}.png" ]; then \
|
|
echo " pdf-thumb $$pdf"; \
|
|
pdftoppm -r 100 -f 1 -l 1 -png -singlefile "$$pdf" "$$thumb"; \
|
|
fi; \
|
|
done; \
|
|
else \
|
|
echo "pdf-thumbs: pdftoppm not found — install poppler (skipping)"; \
|
|
fi
|
|
|
|
# Rebuild the CV + website résumé from yaml-source/ and refresh static/.
|
|
# Standalone helper — NOT a dependency of `build` or `deploy`. Run manually
|
|
# after editing a YAML under yaml-source/data/. The site build copies
|
|
# static/*.pdf through unchanged, so a subsequent `make build` picks them up.
|
|
#
|
|
# The ATS variant (yaml-source/output/resume_ats.pdf) is intentionally not
|
|
# copied to static/ — it's a submission artifact, not a website asset. To
|
|
# regenerate it too, run `make -C yaml-source ats` directly.
|
|
#
|
|
# Silently skipped on hosts without the pipeline (e.g., the VPS): yaml-source/
|
|
# is gitignored, so it's absent on a fresh clone, and that's the expected
|
|
# state wherever the LaTeX toolchain isn't installed.
|
|
pdfs:
|
|
@if [ ! -d yaml-source ]; then \
|
|
echo "pdfs: yaml-source/ not present — skipping (pipeline is local-only)"; \
|
|
exit 0; \
|
|
fi
|
|
@$(MAKE) -C yaml-source all
|
|
@cp yaml-source/output/cv.pdf static/cv.pdf
|
|
@cp yaml-source/output/resume.pdf static/resume.pdf
|
|
@echo "pdfs: static/cv.pdf and static/resume.pdf refreshed."
|
|
|
|
deploy: clean build sign
|
|
@test -n "$(VPS_USER)" || (echo "deploy: VPS_USER not set in .env" >&2; exit 1)
|
|
@test -n "$(VPS_HOST)" || (echo "deploy: VPS_HOST not set in .env" >&2; exit 1)
|
|
@test -n "$(VPS_PATH)" || (echo "deploy: VPS_PATH not set in .env" >&2; exit 1)
|
|
@command -v notify-send >/dev/null 2>&1 && notify-send "make deploy" "Ready to rsync — waiting for SSH auth" || true
|
|
rsync -avz --delete _site/ $(VPS_USER)@$(VPS_HOST):$(VPS_PATH)/
|
|
git push -u origin main
|
|
|
|
watch: export SITE_ENV = dev
|
|
watch:
|
|
cabal run site -- watch
|
|
|
|
clean:
|
|
cabal run site -- clean
|
|
|
|
# Dev build includes any in-progress drafts under content/drafts/essays/.
|
|
# SITE_ENV=dev is read by build/Site.hs; drafts are otherwise invisible to
|
|
# every build (make build / make deploy / cabal run site -- build directly).
|
|
dev: export SITE_ENV = dev
|
|
dev:
|
|
cabal run site -- clean
|
|
cabal run site -- build
|
|
python3 -m http.server 8000 --directory _site
|