aboutsummaryrefslogblamecommitdiff
path: root/v2/src/bin/makemake
blob: 3f4679d88f805647b900245ac77823714b3ed330 (plain) (tree)

































































                                                                            

            

        
     
         
         

 
                 

              





















                                                    

                                    

                                   

                                                             
                  

                       

                                                                                 










                                                                             

                                                                                                      
                                           

                                                                                

                                
 
                                                                    
 


                                                                                                                                                     
 

                                                                                                                       
                             
            
 









                                                                                   
 
                     

                                                                             


                                                        

                                                                            


                                                       

                                                                             


                                                        

                                                                       


                                                   

                                                                     
                                                 
 
                                                                             

                                                              
 


                   
 
              














                                                             

 
                                                                                   


                                                           
    


                         




                                          

                                               

 

                                     

                             
                                 
                         
                           
                                
                                
#!/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 '\.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 '.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$' |
	grep -v '\.uncolored$' |
	varlist 'static-content'