Pretty print of site Makefile

#!/usr/bin/make -f

build: jekyll

drafts: jekylldrafts

# --- Common stuff used by main and draft targets ---

cleanup:
	#Cleanup common unneeded stuff
	-find -iname '*.bak' | xargs rm
	-find -iname 'Thumbs.db' | xargs rm
	-rm -rf ./_site/__draft

listings:
	#All things in one page
	./script/make-listing.sh
	#Hierarchical listing as MD pages
	# - Delete existing listings
	-find pages/listing/ -maxdepth 1 -mindepth 1 -type d | xargs rm -r
	# - Create new ones, in parallel
	echo -e "downloads\npics\nscript\nvolatile\nstatic" | xargs -I% --max-procs=0 ./script/make-dir-listing.sh pages/listing/% %/

.PHONY: pages/index.md
pages/index.md:
	echo "---" > $@
	echo "layout: default" >> $@
	echo "---" >> $@
	echo "" >> $@
	echo "<!-- no spellcheck -->" >> $@
	echo "" >> $@
	echo "# Pages index" >> $@
	echo "" >> $@
	echo "| Page |" >> $@
	echo "|------|" >> $@
	find pages/ -maxdepth 1 -iname '*.md' | grep -ivF 'index.md' | sort | sed 's/pages\/\(.*\)\.md/| [\1](\1.html) |/' >> $@

pages/makefile.md: Makefile
	echo "---" > $@
	echo "layout: default" >> $@
	echo "---" >> $@
	echo "" >> $@
	echo -ne '\nPretty print of site ' >> $@
	echo -e '[Makefile](/Makefile)\n' >> $@
	echo "" >> $@
	echo '```make' >> $@
	cat Makefile >> $@
	echo '```' >> $@

documents:
	-cd doc && make

#Make use of positive (black-on-white) diagrams
positivize:
	./script/positivize.sh pics/

#Make use of negative (white-on-black) diagrams
negativize:
	./script/negativize.sh pics/

# All the sites under the /sites dir
sites: kludge codenames it-works-on-xp

# Kludge schematic editor
kludge:
	-rm -rf sites/kludge
	mkdir sites/kludge
	-git clone 'https://gitlab.com/heavydeck-projects/web/Kludge-schematic-editor.git' sites/kludge
	touch sites/kludge/kludge.html
	ln -s kludge.html sites/kludge/index.html
	-rm -rf sites/kludge/.git

# Codenames
codenames:
	-rm -rf sites/codenames
	mkdir sites/codenames
	-git clone 'https://gitlab.com/heavydeck-projects/web/Codenames-cs.git' sites/codenames
	touch sites/codenames/generator.html
	ln -s generator.html sites/codenames/index.html
	-rm -rf sites/codenames/.git
	#Version 2
	-rm -rf sites/codenames-v2
	mkdir sites/codenames-v2
	-git clone --single-branch --branch=V2 'https://gitlab.com/heavydeck-projects/web/Codenames-cs.git' sites/codenames-v2
	touch sites/codenames-v2/generator.html
	ln -s board.html sites/codenames-v2/index.html
	-rm -rf sites/codenames-v2/.git

it-works-on-xp:
	-rm -rf sites/it-works-on-xp
	mkdir sites/it-works-on-xp
	-git clone 'https://gitlab.com/heavydeck-projects/web/It-works-on-XP.git' sites/it-works-on-xp
	-mkdir sites/it-works-on-xp/blog
	-cd sites/it-works-on-xp ; make build >/dev/null 2>/dev/null
	-ln -s ../data/pics sites/it-works-on-xp/blog/pics
	-ln -s ../data/css sites/it-works-on-xp/blog/css
	-find sites/it-works-on-xp -iname '*.md' | xargs rm
	-touch sites/it-works-on-xp/blog/index.html
	-rm -rf sites/it-works-on-xp/.git

# --- Stuff pulled from other repos ---
externals: static/stl_viewer/stl_viewer.min.js

static/stl_viewer/stl_viewer.min.js:
	#Allow git to fail since that means the repo is already cloned
	-git clone https://github.com/omrips/viewstl.git _repos/stl_viewer/
	-mkdir -p static/stl_viewer/
	-rm static/stl_viewer/*.js
	cp -v _repos/stl_viewer/build/* static/stl_viewer/

# --- Patched files ---
#These files should break if the base template, in this case minima-2.5.1,
#change version. This is expected and it would only need updating the path and
#maybe updating the patch file as well.

_includes/head.html: _includes/head.diff
	patch -o $@ vendor/bundle/ruby/2.5.0/gems/minima-2.5.1/_includes/head.html $<

patches: _includes/head.html

# --- Miscelaneus targets ---

#Setup Jekyll for site creation
#  - This step may require Ruby headers & C/C++ compiler
init:
	-rm -r .bundle
	-rm -r vendor
	-rm -r .jekyll-cache
	-rm Gemfile
	-rm Gemfile.lock
	bundle init
	bundle config set --local path 'vendor/bundle'
	bundle install --path 'vendor/bundle'
	bundle add webrick
	bundle add eventmachine
	bundle add jekyll
	bundle add jekyll-feed
	bundle add minima
	-rm _config.yml
	cp _config.yml.original _config.yml

#Self-explanatory
spellcheck:
	./script/spellcheck.sh

#Generated pages under the pages/ dir
pages: pages/index.md pages/makefile.md listings

#Site statistics
stats.log:
	#stats for nerds
	touch stats.log
	#  - Repository commit ID
	echo -ne 'Commit ID: ' >> stats.log
	-git log --format="%H" -n 1 | head -1 >> stats.log
	-[ `git status --porcelain | wc -l` -ne 0 ] && echo -e '(With uncommitted changes)\n' >> stats.log || echo '' >> stats.log
	#  - Posts
	echo -ne ' ' >> stats.log
	find _posts/ -type f -iname '*.md' | wc -l | tr -d '\n\t' >> stats.log
	echo -e '\tPosts' >> stats.log
	#  - All file count
	echo -ne ' ' >> stats.log
	find _site/ -type f | wc -l | tr -d '\n\t' >> stats.log
	echo -e '\tFiles' >> stats.log
	#  - /pics/ file count
	echo -ne ' ' >> stats.log
	find _site/pics/ -type f | wc -l | tr -d '\n\t' >> stats.log
	echo -e '\tPictures' >> stats.log
	#  - /downloads/ file count
	echo -ne ' ' >> stats.log
	find _site/downloads/ -type f | wc -l | tr -d '\n\t' >> stats.log
	echo -e '\tDownloads' >> stats.log
	#  - Files from httrack mirrors
	echo -ne ' ' >> stats.log
	find _site/httrack-sites/ -type f | wc -l | tr -d '\n\t' >> stats.log
	echo -e '\tFiles from mirrors' >> stats.log
	#  - Site size
	echo -ne ' ' >> stats.log
	du -h -d0 _site/ | sed 's/M.*/M/' | tr -d '\n\t' >> stats.log
	echo -e '\tSite size' >> stats.log
	#  - Repo size
	echo -ne ' ' >> stats.log
	du -h -d0 .git/ | sed 's/M.*/M/' | tr -d '\n\t' >> stats.log
	echo -e '\tRepo size' >> stats.log

#Site backup (as a zipfile)
backup: cleanup pages sites documents
	-rm backup.zip
	zip -n .7z:.zip:.gz:.xz:.png:.jpg:.webm:.mp4 -r backup.zip *.md *.txt Makefile _config.yml _drafts/ _posts/ doc/ downloads/ httrack-sites/ live/ pages/ pics/ script/ sites/ static/

#Generate favicon.ico from source PNG files
#  - This target uses ImageMagick "convert"; It will usually be up-to-date
#    and not be executed since the generated favicon.ico will be added to
#    the repository.
pics/favicon/favicon.ico: pics/favicon/favicon-16.png pics/favicon/favicon-32.png pics/favicon/favicon-48.png pics/favicon/favicon-256.png
	convert $^ $@

#Generate a sample HLS playlist and TS files for /live/ch0/
sample-hls:
	#Generate a short video file (uses vaapi)
	gst-launch-1.0 -q audiotestsrc wave=6 ! avenc_aac bitrate=64000 ! queue ! muxer. videotestsrc ! "video/x-raw,width=1920,height=1080" ! vaapih264enc ! queue ! muxer. mpegtsmux name=muxer ! queue ! fdsink fd=1 | head --bytes=104857600 > sample-stream.ts
	#Make it into HLS
	-rm live/ch0/*.ts
	-rm live/ch0/*.m3u8
	gst-launch-1.0 -q filesrc location=sample-stream.ts ! tsdemux name=demux demux. ! queue ! "video/x-h264" ! h264parse ! muxer. demux. ! queue ! "audio/mpeg,mpegversion=4" ! aacparse ! muxer. mpegtsmux name=muxer ! queue ! hlssink playlist-length=30 target-duration=5
	#Move to destination and delete temporary file
	mv segment*.ts live/ch0/
	mv playlist.m3u8 live/ch0/
	rm sample-stream.ts

#Generate/test checksums
checksum:
	git ls-files | grep -v '_sha256sum$$' | xargs sha256sum | sort > _sha256sum
test:
	sha256sum --check _sha256sum

# --- Site build targets ---

#Main site build
#  - Site
#  - Cleaned-up httrack mirrors
#  - Stats for nerds
#  - Compression
jekyll: cleanup externals patches pages negativize sites documents stats.log pics/favicon/favicon.ico
	#Use release main.scss
	ln -f -s main.scss.release assets/main.scss
	#Build the site
	bundler exec jekyll b
	#Cleanup some files that don't need to be public
	-rm _site/doc/Makefile
	#Cleanup HTTrack files on output site
	-find _site/httrack-sites/ -type d -iname hts-cache | xargs -n1 rm -r
	-find _site/httrack-sites/ -iname cookies.txt | xargs -n1 rm
	-find _site/httrack-sites/ -iname hts-log.txt | xargs -n1 rm
	#Build httrack site indices
	./_site/httrack-sites/make-index.sh
	#Inject stats.log into the misc placeholder
	#  - _site/misc/index.html
	#  - [begin_stats]
	sed -i -e '/begin_stats/r stats.log' _site/misc/index.html
	-rm stats.log

	#gzip compress most file types for nginx gzip_static
	# - Markup/web formats
	-find _site/ -iname '*.html' | xargs --max-procs=0 -n1 gzip -9 -k -f
	-find _site/ -iname '*.wasm' | xargs --max-procs=0 -n1 gzip -9 -k -f
	-find _site/ -iname '*.xml'  | xargs --max-procs=0 -n1 gzip -9 -k -f
	-find _site/ -iname '*.svg'  | xargs --max-procs=0 -n1 gzip -9 -k -f
	-find _site/ -iname '*.css'  | xargs --max-procs=0 -n1 gzip -9 -k -f
	-find _site/ -iname '*.js'   | xargs --max-procs=0 -n1 gzip -9 -k -f
	# - Text files
	-find _site/ -iname '*.txt'  | xargs --max-procs=0 -n1 gzip -9 -k -f
	-find _site/ -iname '*.tex'  | xargs --max-procs=0 -n1 gzip -9 -k -f
	-find _site/ -iname '*.cbl'  | xargs --max-procs=0 -n1 gzip -9 -k -f
	-find _site/ -iname '*.wml'  | xargs --max-procs=0 -n1 gzip -9 -k -f
	# - Sorta compressible documents
	-find _site/ -iname '*.pdf'  | xargs --max-procs=0 -n1 gzip -9 -k -f
	-find _site/ -iname '*.doc'  | xargs --max-procs=0 -n1 gzip -9 -k -f
	-find _site/ -iname '*.stl'  | xargs --max-procs=0 -n1 gzip -9 -k -f
	# - Uncompressed formats
	-find _site/ -iname '*.ico'  | xargs --max-procs=0 -n1 gzip -9 -k -f
	#-find _site/ -iname '*.pnm'  | xargs --max-procs=0 -n1 gzip -9 -k -f
	#-find _site/ -iname '*.ppm'  | xargs --max-procs=0 -n1 gzip -9 -k -f
	#-find _site/ -iname '*.pgm'  | xargs --max-procs=0 -n1 gzip -9 -k -f
	#-find _site/ -iname '*.pbm'  | xargs --max-procs=0 -n1 gzip -9 -k -f
	-find _site/ -iname '*.wbmp' | xargs --max-procs=0 -n1 gzip -9 -k -f

	#brotli re-compress markup/web formats (fast)
	#-find _site/ -iname '*.html' | xargs --max-procs=0 -n1 brotli -f1 --keep
	#-find _site/ -iname '*.xml'  | xargs --max-procs=0 -n1 brotli -f1 --keep
	#-find _site/ -iname '*.svg'  | xargs --max-procs=0 -n1 brotli -f1 --keep
	#-find _site/ -iname '*.css'  | xargs --max-procs=0 -n1 brotli -f1 --keep
	#-find _site/ -iname '*.js'   | xargs --max-procs=0 -n1 brotli -f1 --keep

	#Make sure __draft/index.html exists
	-mkdir _site/__draft
	-touch _site/__draft/index.html

	#remove css symlink
	rm assets/main.scss

	#find _site -print0 -type f | xargs -n1 --null chmod 644

#Main site build
#  - Site
#  - No httrack mirrors
#  - No stats
jekylldrafts: cleanup externals patches pages negativize sites documents pics/favicon/favicon.ico
	#Use draft main.scss
	ln -f -s main.scss.draft assets/main.scss
	#Make a temporary draft config to put the site under the /__draft url
	sed 's|baseurl: ""|baseurl: "/__draft"|g' _config.yml > _draft.yml
	#Build the site
	bundler exec jekyll b --incremental --trace --future --drafts --config=_draft.yml -d ./_site/__draft
	#Delete httrack alltogether
	-rm -rf _site/__draft/httrack-sites
	#Remove the config
	rm _draft.yml
	#remove draft css symlink
	rm assets/main.scss

#Fast drafts, just run Jekyll
fastdrafts: patches
	#Use draft main.scss
	ln -f -s main.scss.draft assets/main.scss
	#Make a temporary draft config to put the site under the /__draft url
	sed 's|baseurl: ""|baseurl: "/__draft"|g' _config.yml > _draft.yml
	#Build the site
	bundler exec jekyll b --incremental --trace --future --drafts --config=_draft.yml -d ./_site/__draft
	#Delete httrack alltogether
	-rm -rf _site/__draft/httrack-sites
	#Remove the config
	rm _draft.yml
	#remove draft css symlink
	rm assets/main.scss