aboutsummaryrefslogtreecommitdiff
#!/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
.mapentry
'

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.mapentry \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"

		echo "$CONTENT_PREFIX/$lang/${coll_path}index.series: \$($c.$lang.conf)"
		echo "\$($c.$lang.html): $CONTENT_PREFIX/$lang/${coll_path}index.series"

		printf '\n\n'
	done

	coll_path="$(coll2path "$lang" slide)"
	git ls-files "$CONTENT_PREFIX/$lang/$coll_path"*.slides |
		varlist "slide.$lang.slides"
	git ls-files "$CONTENT_PREFIX/$lang/$coll_path"*.slides |
		sed 's/^\(.*\)\.slides$/\1.pdf: \1.ps/'
	printf '\n\n'

	echo "slide.$lang.pdf = \$(slide.$lang.slides:.slides=.pdf)"
	echo "all-generated.$lang.slides = \$(slide.$lang.slides)"
	echo "all-generated.$lang.pdf = \$(slide.$lang.pdf)"

	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.series|" |
		varlist "all-generated.$lang.series"

	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 '.series' '.categories' '.extrahtml' '.extrafeeds' '.index' '.xml' '.pdf' |
		sed "s|^\(.*\)\$|\$(all-generated.$lang\1)|" |
		varlist "all-generated.$lang"


	printf '\n'
done


git ls-files |
	grep '\.uncolored' |
	varlist 'svgs.uncolored'
# shellcheck disable=2016
printf 'svgs = $(svgs.uncolored:.uncolored=)\n\n'


{
	git ls-files |
		grep '\.page' |
		sed "s|^$CONTENT_PREFIX\(.*\)\.page|\1.md|"

	git ls-files |
		grep '\.uncolored' |
		sed "s|^$CONTENT_PREFIX\(.*\)\.uncolored|\1|"
} > "$CONTENT_PREFIX"/.gitignore


for e in $(extensions '.series' '.categories' '.extrahtml' '.extrafeeds' '.index' '.xml' '.pdf'); 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$' |
	grep -v '\.uncolored$' |
	grep -v '\.slides$' |
	grep -v '\.ps$' |
	varlist 'static-content'