#!/bin/sh set -eu usage() { cat <<-'EOF' Usage: makemake makemake -h EOF } help() { cat <<-'EOF' Options: -h, --help show this message Generate make(1) code for later evaluation by make(1). What this scripts does is fill the gap where make(1) can't handle globs and dynamic dependencies, and uses some ad-hoc scripts to generate those. EOF } for flag in "$@"; do case "$flag" in --) break ;; --help) usage help exit ;; *) ;; esac done while getopts 'h' flag; do case "$flag" in h) usage help exit ;; *) usage >&2 exit 2 ;; esac done shift $((OPTIND - 1)) varlist() { printf '%s = \\\n' "$1" sed \ -e 's/^/ /' \ -e 's/$/ \\/' printf '\n' } EXTENSIONS=' .conf .content .html .snippets .htmlbody ' COLL_EXTENSIONS=' .categoryentry .indexentry .xmlentry ' page_ext_filter="^($(echo "$COLL_EXTENSIONS" | tr ' ' '\n' | grep . | paste -sd'|' ))\$" extensions() { echo "$EXTENSIONS" "$COLL_EXTENSIONS" "$@" | tr ' ' '\n' | grep . } printf '.POSIX:\n\n\n' for lang in $(langs); do for c in pages $(collections); do if [ "$c" = 'pages' ]; then filter="$page_ext_filter" src='page' coll_path='' else filter='^$' src='md' coll_path="$(coll2path "$lang" "$c")" fi mds() { git ls-files "$CONTENT_PREFIX/$lang/$coll_path"*."$src" | sed 's|\.page$|.md|' } exts() { extensions | grep -Ev "$filter" } mds | varlist "$c.$lang.md" exts | sed "s|^\(.*\)\$|$c.$lang\1 = \$($c.$lang.md:.md=\1)|" exts | sed "s|^\(.*\)\$|\$($c.$lang\1)|" | varlist "$c.$lang" mds | sed 's/^\(.*\)\.md$/\1.conf \1.content: \1.md/' mds | sed 's/^\(.*\)\.md$/\1.categoryentry \1.indexentry \1.html: \1.conf \1.content/' mds | sed 's/^\(.*\)\.md$/\1.snippets \1.htmlbody: \1.html/' if [ "$c" = 'pages' ]; then mds | sed 's|\.md$|\.page|' | varlist "pages.$lang.page" mds | sed "s|^\(.*\).md$|\1.md: \1.page|" continue fi mds | sed 's/^\(.*\)\.md$/\1.xmlentry: \1.htmlbody/' echo "$CONTENT_PREFIX/$lang/${coll_path}index.categories: \$($c.$lang.categoryentry)" echo "$CONTENT_PREFIX/$lang/${coll_path}index.html: \$($c.$lang.indexentry) $CONTENT_PREFIX/$lang/${coll_path}index.categories" echo "$CONTENT_PREFIX/$lang/${coll_path}feed.xml: \$($c.$lang.xmlentry) $CONTENT_PREFIX/$lang/${coll_path}index.categories" echo "$CONTENT_PREFIX/$lang/${coll_path}index.extrahtml: $CONTENT_PREFIX/$lang/${coll_path}index.html" echo "$CONTENT_PREFIX/$lang/${coll_path}index.extrafeeds: $CONTENT_PREFIX/$lang/${coll_path}feed.xml" printf '\n\n' done for e in $(extensions); do { if ! printf '%s\n' "$e" | grep -qE "$page_ext_filter"; then echo pages fi collections } | sed "s|^\(.*\)\$|\$(\1.$lang$e)|" | varlist "all-generated.$lang$e" done collections | xargs -I% coll2path "$lang" % | sed "s|^\(.*\)\$|$CONTENT_PREFIX/$lang/\1index.categories|" | varlist "all-generated.$lang.categories" collections | xargs -I% coll2path "$lang" % | sed "s|^\(.*\)\$|$CONTENT_PREFIX/$lang/\1index.extrahtml|" | varlist "all-generated.$lang.extrahtml" collections | xargs -I% coll2path "$lang" % | sed "s|^\(.*\)\$|$CONTENT_PREFIX/$lang/\1index.extrafeeds|" | varlist "all-generated.$lang.extrafeeds" collections | xargs -I% coll2path "$lang" % | sed "s|^\(.*\)\$|$CONTENT_PREFIX/$lang/\1index.html|" | varlist "all-generated.$lang.index" collections | xargs -I% coll2path "$lang" % | sed "s|^\(.*\)\$|$CONTENT_PREFIX/$lang/\1feed.xml|" | varlist "all-generated.$lang.xml" extensions '.categories' '.extrahtml' '.extrafeeds' '.index' '.xml' | sed "s|^\(.*\)\$|\$(all-generated.$lang\1)|" | varlist "all-generated.$lang" printf '\n' done git ls-files | grep '\.page' | sed "s|^$CONTENT_PREFIX\(.*\)\.page|\1.md|" > "$CONTENT_PREFIX"/.gitignore for e in $(extensions '.categories' '.extrahtml' '.extrafeeds' '.index' '.xml'); do langs | sed "s|^\(.*\)\$|\$(all-generated.\1$e)|" | varlist "all-generated$e" done # shellcheck disable=2016 langs | sed 's|^\(.*\)$|$(pages.\1.md)|' | varlist 'pages-mds' # shellcheck disable=2016 langs | sed 's|^\(.*\)$|$(all-generated.\1)|' | varlist 'all-generated' git ls-files src/ | grep -v ^"$CONTENT_PREFIX"/ | varlist 'non-content' git ls-files "$CONTENT_PREFIX"/ | grep -v '\.md$' | grep -v '\.page$' | varlist 'static-content'