#-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-# # #> Manage building Hugo website #> #> Andrew Stryker #> #-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-# #-----------------------------------------------------------------------------# # # Configuration # #-----------------------------------------------------------------------------# SHELL = /usr/bin/bash DEST ?= axs@sdf.org:html SITE_URL ?= https://axs.sdf.org HUGO_SERVE_FLAGS ?= --buildDrafts hugo_serve_cmd = hugo server ${HUGO_SERVE_FLAGS} help_generator = generate-help.awk #-----------------------------------------------------------------------------# # # Define user interface # #-----------------------------------------------------------------------------# .PHONY: default help publish build default: build build: .build_sentinel #> Build site with Hugo (default) publish: #> Publish site @echo "๐Ÿ—๏ธ Forcing clean build for publish" @rm -f .build_sentinel @$(MAKE) build @echo "๐Ÿ“ฐPublishing..." @# rsync options: @# verbose: show each operation @# links: preserve symlinks @# safe-links: ignore symlinks that point outside of tree @# times: preserve modification times @# delete: delete extraneous files, i.e., files on destination @# chmod: set permissions @echo "\t ๐Ÿ“ก Copying from public to ${DEST}" @rsync \ --verbose \ --recursive \ --links \ --safe-links \ --times \ --delete \ --chmod=D755,F644 \ public/ \ ${DEST} @echo "\t ๐Ÿ›ก๏ธ Setting permissions" @ssh axs@sdf.org 'mkhomepg -p' @echo "โœ“ Publishing complete" @echo "\nThe site should be available on ${SITE_URL}" serve: #> Start a Hugo server @if [[ -z $${TMUX} ]]; \ then \ echo not tmux; \ else \ echo Starting a Hugo server in a new Tmux window; \ tmux neww ${hugo_serve_cmd}; \ fi help: #> Generate this help message @gawk -f ${help_generator} $(MAKEFILE_LIST) #-----------------------------------------------------------------------------# # # Rmd rendering via statdown # #-----------------------------------------------------------------------------# # Discover all Rmd source files and derive their .md targets RMD_SOURCES := $(wildcard content/posts/*.Rmd content/posts/*/*.Rmd content/demos/*/*.Rmd) MD_TARGETS := $(RMD_SOURCES:.Rmd=.md) # Shared asset location for CSS/JS dependencies (via depkit) LIBS_DIR := static/libs LIBS_URL := /libs # Pattern rule: render .md from .Rmd using statdown # Re-render when renv.lock changes (package version update) # Assets are written to static/libs/ so they are shared across posts %.md: %.Rmd renv.lock @echo "๐Ÿ”„ Rendering $<" cd $(dir $<) && Rscript -e 'renv::load("$(CURDIR)"); statdown::statdown_render("$(notdir $<)", output_root = "$(CURDIR)/$(LIBS_DIR)", url_root = "$(LIBS_URL)")' #-----------------------------------------------------------------------------# # # Define file interface # #-----------------------------------------------------------------------------# # Rebuild when rendered Rmd targets, markdown, or page bundle assets change CONTENT_FILES := $(shell find content -name '*.md' -o -name '*.html' -o -name '*.svg' -o -name '*.png' -o -name '*.jpg' | grep -v '*~') LAYOUT_FILES := $(shell find layouts -name '*.html' | grep -v '*~') .build_sentinel: $(MD_TARGETS) $(CONTENT_FILES) $(LAYOUT_FILES) hugo.yaml @echo "\t ๐Ÿ—๏ธ Building site" @# We call hugo with two options: @# --cleanDestinationDir, to remove deleted files @# --minify, to compress files by removing extra whitespace hugo --cleanDestinationDir --minify @touch $@ @echo "โœ“ Building complete" #-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-#