From 2d0ca4ac829250a93f11ea1974b589c5c0140b73 Mon Sep 17 00:00:00 2001 From: Andrew Stryker Date: Thu, 14 Sep 2023 10:38:40 -0700 Subject: [PATCH] Add initial Makefile --- Makefile | 167 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 167 insertions(+) create mode 100644 Makefile diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..77cafe4 --- /dev/null +++ b/Makefile @@ -0,0 +1,167 @@ +#-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-# +#> Makefile +#> +#> Build a Gemini site +#> +#> This Makefile manages the building and publishing of the Gemini site: +#> 1. Delegating content directories to other makefiles +#> 2. Building the site index page +#> 3. Copying the site to the hosting location +#> +#> Run `make -f environment.mk show' to display the key global varibles. +#> +# +# © 2023 Andrew Stryker +#-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-# + +#-----------------------------------------------------------------------------# +# +# Configuation +# +#-----------------------------------------------------------------------------# + +# Record the name of this Makefile +self ::= $(lastword ${MAKEFILE_LIST}) + +# Define the Makefiles +env_make ::= environment.mk +curate_make ::= curate.mk +index ::= index.mk + +# load environment variables +include ${env_make} + +# build lists of content directories +# TODO: do we need the quoted variables? +curate ?= about stuff +curate_dirs ::= $(addprefix ${CONTENT}/, ${curate}) +#curate_quoted ::= $(shell echo ${curate} | sed -e "s/ /, /g") + +index ?= posts staff +index_dirs ::= $(addprefix ${CONTENT}/, ${index}) +#index_quoted ::= $(shell echo ${index} | sed -e "s/ /, /g") + +# files that this file builds directly +banner_template ::= ${CONTENT}/banner.gmi.m4 +banner ::= ${WORKING}/banner.gmi + +site_index_template ::= ${CONTENT}/index.gmi.m4 +site_index ::= ${STAGING}/index.gmi + +BUILD_DATE_MSG ::= This page was built on $$(date). +export BUILD_DATE_MSG + +#-----------------------------------------------------------------------------# +# +# User interface +# +#> User facing targets: +#> +#-----------------------------------------------------------------------------# + +.PHONY: default all configure build publish help clean about posts show test + +default: all # make the default target explicit + +all: build # follow convention of using `all` as the default target + +configure: #> Configure the site + @bash configure + +build: ${site_index} #> Build the site (default) + @echo Built local site in this directory: ${STAGING} + +publish: #> Publish Gemini files to site + @# rsync options: + @# verbose: show each operation + @# links: preserve symlinks + @# times: preserve modification times + @# delete: delete extraneous files, i.e., files on destination + @# chmod: set permsions + @echo Publishing in ${STAGING} to ${GEMINI_SITE} + @rsync \ + --verbose \ + --recursive \ + --links \ + --times \ + --delete \ + --chmod=D755,F644 \ + ${STAGING} \ + ${GEMINI_SITE} + @echo "\t✓ Publising complete" + @echo "\nThe site should be available on ${GEMINI_URL}" + +show: #> Display key variables + @echo "Key variables defined in ${self}:" + @echo + @echo "Gemini site................................... ${GEMINI_SITE}" + @echo "Genini site URL............................... ${GEMINI_URL}" + @echo + @echo "\tSite index template......................... ${site_index_template}" + @echo "\tBanner template............................. ${banner_template}" + @echo + @echo "\tCurated content directories:" + @echo "\t\t${curate}" + @echo + @echo ${curate_quoted} + @echo "\tDynamically indexed content directories:" + @echo "\t\t${index}" + @echo + @echo "Build message: ${BUILD_DATE_MSG}" + @${MAKE} -f ${env_make} + @echo + @#${MAKE} -f ${curate.mk} show + @echo + @#${MAKE} -f ${index_make} show + @#echo + @#cd tests && ${MAKE} show + +clean: #> Delete generated files + @rm -rf ${WORKING} ${STAGING} + @echo "✓ Deleted all intermediate and generated files" + @cd tests && ${MAKE} clean + +test: #> Run the test suite + @cd tests && ${MAKE} test + +help: #> Display this help message + @awk -f ${AWKHELP} ${self} + +#-----------------------------------------------------------------------------# +# +# File system interface +# +#-----------------------------------------------------------------------------# + +# Isolating the directory making logic here so that we are not repeatedly +# building directories and changing timestamps--let's have Make deal with this +${WORKING} ${STAGING}: %: + @mkdir -p $@ + @echo "\t✓Created $@" + +${banner}: ${banner_template} ${WORKING} + @m4 --include=${MAKO_DIR} $< > $@ + @echo "\t✓ Generated site banner" + +${site_index}: ${site_index_template} ${banner} ${curate_dirs} ${index_dirs} + @m4 --include=${MAKO_DIR} --define=WORKING=${WORKING} $< > $@ + @echo ${BUILD_DATE_MSG} >> $@ + @echo "\t✓ Generated site index file" + +${curate_dirs}: %: ${WORKING} ${STAGING} + @echo + @echo "Entering $@ section" + @echo + @mkdir -p ${WORKING}/$@ ${STAGING}/$@ + @cd $@ && ${MAKE} -f ${CURATE_MAKE} build + @echo "✓ Completed $@ section" + +${index_dirs}: %: ${WORKING} ${STAGING} + @echo + @echo "Entering $@ section" + @echo + @mkdir -p ${WORKING}/$@ ${STAGING}/$@ + @#cd ${CONTENT}/$@ && ${MAKE} -f ${index_make} build + @echo "✓ Completed $@ section" + +#-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-#