# all (default) # Create all the necessary directories, javascript, css, etc. # # prod # Create static assets for production. Requires the following additional dependencies: # - CSS::Minifier::XS # - uglifyjs # - zopfli # # chmod # For when the http process is run from a different user than the files are # chown'ed to. chmods all files and directories written to from vndb.pl. # # multi-start, multi-stop, multi-restart: # Start/stop/restart the Multi daemon. Provided for convenience, a proper initscript # probably makes more sense. # # NOTE: This Makefile has only been tested using a recent version of GNU make # in a relatively up-to-date Arch/Gentoo Linux environment, and may not work in # other environments. Patches to improve the portability are always welcome. .PHONY: all prod chmod multi-stop multi-start multi-restart ALL_KEEP=\ static/ch static/cv static/sf static/st \ data/log static/f www www/feeds www/api \ data/conf.pl \ www/robots.txt static/robots.txt ALL_CLEAN=\ static/f/vndb.js \ static/f/plain.js \ static/f/elm.js \ data/icons/icons.css \ sql/editfunc.sql \ $(shell ls static/s | sed -e 's/\(.\+\)/static\/s\/\1\/style.css/g') PROD=\ static/f/vndb.min.js static/f/vndb.min.js.gz \ static/f/plain.min.js static/f/plain.min.js.gz \ static/f/elm.min.js static/f/elm.min.js.gz \ static/f/icons.opt.png \ $(shell ls static/s | sed -e 's/\(.\+\)/static\/s\/\1\/style.min.css/g') \ $(shell ls static/s | sed -e 's/\(.\+\)/static\/s\/\1\/style.min.css.gz/g') all: ${ALL_KEEP} ${ALL_CLEAN} prod: all ${PROD} clean: rm -f ${ALL_CLEAN} ${PROD} rm -f static/f/icons.png rm -rf elm/Gen/ rm -rf elm/elm-stuff/build-artifacts $(MAKE) -C sql/c clean cleaner: clean rm -rf elm/elm-stuff sql/editfunc.sql: util/sqleditfunc.pl sql/schema.sql util/sqleditfunc.pl static/ch static/cv static/sf static/st: mkdir -p $@; for i in $$(seq -w 0 1 99); do mkdir -p "$@/$$i"; done data/log www www/feeds www/api static/f: mkdir -p $@ data/conf.pl: cp -n data/conf_example.pl data/conf.pl %/robots.txt: | www echo 'User-agent: *' > $@ echo 'Disallow: /' >> $@ %.gz: % zopfli $< chmod: all chmod -R a-x+rwX static/{ch,cv,sf,st} # v2 & v2-rw data/icons/icons.css: data/icons/*.png data/icons/*/*.png util/spritegen.pl | static/f util/spritegen.pl static/f/icons.png: data/icons/icons.css static/f/icons.opt.png: static/f/icons.png rm -f $@ zopflipng -m --lossy_transparent $< $@ static/s/%/style.css: static/s/%/conf util/skingen.pl data/style.css data/icons/icons.css util/skingen.pl $* static/s/%/style.min.css: static/s/%/style.css perl -MCSS::Minifier::XS -e 'undef $$/; print CSS::Minifier::XS::minify(scalar <>)' <$< >$@ # v2 static/f/vndb.js: data/js/*.js lib/VNDB/Types.pm util/jsgen.pl data/conf.pl | static/f util/jsgen.pl static/f/vndb.min.js: static/f/vndb.js uglifyjs $< --compress --mangle --comments '/(@license|@source|SPDX-)/' -o $@ # v2-rw # Order of JS files matters, so we read an '//order:x' comment from the files and sort by that. # Files without that comment are assumed to have '//order:4'. # (This trick will not work if we ever add JS files generated by this Makefile) JS_FILES=$(shell find elm \! -path 'elm/elm-stuff/*' -name '*.js' -exec sh -c "echo \`grep -Eo '^// *order: *[0-9]+' \"{}\" || echo 4\` \"{}\"" \; | sed -E 's/\/\/ *order: *//' | sort | sed 's/..//') static/f/plain.js: ${JS_FILES} | static/f echo '// @license magnet:?xt=urn:btih:0b31508aeb0634b347b8270c7bee4d411b5d4109&dn=agpl-3.0.txt AGPL-3.0-only' > $@~ echo '// @source: https://code.blicky.net/yorhel/vndb/src/branch/master/elm' >>$@~ echo '// SPDX-License-Identifier: AGPL-3.0-only' >>$@~ for fn in ${JS_FILES}; do \ echo; \ echo "(function(){'use strict'; /* $$fn */"; \ cat $$fn; \ echo "})();"; \ done >>$@~ echo '// @license-end' >>$@~ mv $@~ $@ static/f/plain.min.js: static/f/plain.js uglifyjs $< --comments '/(@license|@source|SPDX-)/' --compress \ 'pure_getters,keep_fargs=false,unsafe_comps,unsafe'\ | uglifyjs --mangle --comments all -o $@ ELM_FILES=elm/*.elm elm/*/*.elm ELM_MODULES=$(shell grep -l '^main =' ${ELM_FILES} | sed 's/^elm\///') # Patch the Javascript generated by Elm: # - Add @license and @source comments # - Redirect calls from Lib.Ffi.* to window.elmFfi_* # - Patch the virtualdom diffing algorithm to always apply the 'selected' attribute define fix-elm ( echo '// @license magnet:?xt=urn:btih:0b31508aeb0634b347b8270c7bee4d411b5d4109&dn=agpl-3.0.txt AGPL-3.0-only'; \ echo '// @license magnet:?xt=urn:btih:c80d50af7d3db9be66a4d0a86db0286e4fd33292&dn=bsd-3-clause.txt BSD-3-Clause'; \ echo '// @source: https://code.blicky.net/yorhel/vndb/src/branch/master/elm'; \ echo '// SPDX-License-Identifier: AGPL-3.0-only and BSD-3-Clause'; \ cat $@; \ echo; \ echo '// @license-end' \ ) | sed 's/var \$$author\$$project\$$Lib\$$Ffi\$$/var __unused__/g' \ | sed -E 's/\$$author\$$project\$$Lib\$$Ffi\$$([a-zA-Z0-9_]+)/window.elmFfi_\1(_Json_wrap,_Browser_call)/g' \ | sed -E "s/([^ ]+) !== 'checked'/\\1 !== 'checked' \&\& \\1 !== 'selected'/g" >$@~ mv $@~ $@ endef elm/Gen/.generated: lib/VNWeb/*.pm lib/VNWeb/*/*.pm lib/VNDB/Types.pm lib/VNDB/ExtLinks.pm lib/VNDB/Config.pm data/conf.pl util/vndb.pl elmgen static/f/elm.js: ${ELM_FILES} elm/Gen/.generated | static/f cd elm && ELM_HOME=elm-stuff elm make ${ELM_MODULES} --output ../$@ ${fix-elm} static/f/elm.min.js: ${ELM_FILES} elm/Gen/.generated | static/f cd elm && ELM_HOME=elm-stuff elm make --optimize ${ELM_MODULES} --output ../$@ ${fix-elm} uglifyjs $@ --comments '/(@license|@source|SPDX-)/' --compress \ 'pure_funcs="F2,F3,F4,F5,F6,F7,F8,F9,A2,A3,A4,A5,A6,A7,A8,A9",pure_getters,keep_fargs=false,unsafe_comps,unsafe'\ | uglifyjs --mangle --comments all -o $@~ mv $@~ $@ # Multi # may wait indefinitely, ^C and kill -9 in that case define multi-stop if [ -s data/multi.pid ]; then\ kill `cat data/multi.pid`;\ while [ -s data/multi.pid ]; do\ if kill -0 `cat data/multi.pid`; then sleep 1;\ else rm -f data/multi.pid; fi\ done;\ fi endef define multi-start util/multi.pl endef multi-stop: $(multi-stop) multi-start: $(multi-start) multi-restart: $(multi-stop) $(multi-start)