# Inspired from # https://github.com/Mischback/django-calingen/blob/3f0e6db6/Makefile # and https://gist.github.com/klmr/575726c7e05d8780505a # fancy colors cyan := "$$(tput setaf 6)" green := "$$(tput setaf 2)" red := "$$(tput setaf 1)" yel := "$$(tput setaf 3)" gray := "$$(tput setaf 8)" grayb := "$$(printf "\033[1m"; tput setaf 8)" end := "$$(tput sgr0)" TARGET_STYLED_HELP_NAME = "$(cyan)TARGET$(end)" ARGUMENTS_HELP_NAME = "$(green)ARGUMENT$(end)=$(red)VALUE$(end)" # This mountrous sed is compatible with both GNU sed and BSD sed (for macOS). # That's why "-E", "|", "+", "\s", "?", and "\t" aren't used. See the details # about BSD sed vs. GNU sed: https://riptutorial.com/sed/topic/9436 target_regex := [a-zA-Z0-9%_\/%-][a-zA-Z0-9%_\/%-]* variable_regex := [^:= ][^:= ]* variable_assignment_regex := [ ]*:*[+:!\?]*= * value_regex := .* category_annotation_regex := @category * category_regex := [^<][^<]* # We first parse and markup with these ad-hoc tags, and then we turn the markup # into a colorful output. target_tag_start := target_tag_end := target_variable_tag_start := target_variable_tag_end := variable_tag_start := variable_tag_end := global_variable_tag_start := global_variable_tag_end := value_tag_start := value_tag_end := prerequisites_tag_start := prerequisites_tag_end := doc_tag_start := doc_tag_indented_start := doc_tag_indented_end := doc_tag_end := category_tag_start := category_tag_end := default_category_tag_start := default_category_tag_end := DEFAULT_CATEGORY = General .DEFAULT_GOAL := help .PHONY: help help: @echo "Usage: make [$(TARGET_STYLED_HELP_NAME) [$(TARGET_STYLED_HELP_NAME) ...]] [$(ARGUMENTS_HELP_NAME) [$(ARGUMENTS_HELP_NAME) ...]]" @cat ${MAKEFILE_LIST} \ | tr '\t' ' ' \ | sed -n -e "/^## / { \ h; \ s/.*/##/; \ :doc" \ -e "H; \ n; \ s|^## *\(.*\)|$(doc_tag_start)$(doc_tag_indented_start)\1$(doc_tag_indented_end)$(doc_tag_end)|; \ s|^## *\(.*\)|$(doc_tag_start)\1$(doc_tag_end)|; \ t doc" \ -e "s| *#[^#].*||; " \ -e "s|^\(define *\)\($(variable_regex)\)$(variable_assignment_regex)\($(value_regex)\)|$(global_variable_tag_start)\2$(global_variable_tag_end)$(value_tag_start)\3$(value_tag_end)|;" \ -e "s|^\($(variable_regex)\)$(variable_assignment_regex)\($(value_regex)\)|$(global_variable_tag_start)\1$(global_variable_tag_end)$(value_tag_start)\2$(value_tag_end)|;" \ -e "s|^\($(target_regex)\) *: *\(\($(variable_regex)\)$(variable_assignment_regex)\($(value_regex)\)\)|$(target_variable_tag_start)\1$(target_variable_tag_end)$(variable_tag_start)\3$(variable_tag_end)$(value_tag_start)\4$(value_tag_end)|;" \ -e "s|^\($(target_regex)\) *: *\($(target_regex)\( *$(target_regex)\)*\) *\(\| *\( *$(target_regex)\)*\)|$(target_tag_start)\1$(target_tag_end)$(prerequisites_tag_start)\2$(prerequisites_tag_end)|;" \ -e "s|^\($(target_regex)\) *: *\($(target_regex)\( *$(target_regex)\)*\)|$(target_tag_start)\1$(target_tag_end)$(prerequisites_tag_start)\2$(prerequisites_tag_end)|;" \ -e "s|^\($(target_regex)\) *: *\(\| *\( *$(target_regex)\)*\)|$(target_tag_start)\1$(target_tag_end)|;" \ -e "s|^\($(target_regex)\) *: *|$(target_tag_start)\1$(target_tag_end)|;" \ -e " \ G; \ s|## *\(.*\) *##|$(doc_tag_start)\1$(doc_tag_end)|; \ s|\\n||g;" \ -e "/$(category_annotation_regex)/!s|.*|$(default_category_tag_start)$(DEFAULT_CATEGORY)$(default_category_tag_end)&|" \ -e "s|^\(.*\)$(doc_tag_start)$(category_annotation_regex)\($(category_regex)\)$(doc_tag_end)|$(category_tag_start)\2$(category_tag_end)\1|" \ -e "p; \ }" \ | sort \ | sed -n \ -e "s|$(default_category_tag_start)|$(category_tag_start)|" \ -e "s|$(default_category_tag_end)|$(category_tag_end)|" \ -e "{G; s|\($(category_tag_start)$(category_regex)$(category_tag_end)\)\(.*\)\n\1|\2|; s|\n.*||; H; }" \ -e "s|$(category_tag_start)||" \ -e "s|$(category_tag_end)|:\n|" \ -e "s|$(target_variable_tag_start)|$(target_tag_start)|" \ -e "s|$(target_variable_tag_end)|$(target_tag_end)|" \ -e "s|$(target_tag_start)| $(cyan)|" \ -e "s|$(target_tag_end)|$(end) |" \ -e "s|$(prerequisites_tag_start).*$(prerequisites_tag_end)||" \ -e "s|$(variable_tag_start)|$(green)|g" \ -e "s|$(variable_tag_end)|$(end)|" \ -e "s|$(global_variable_tag_start)| $(green)|g" \ -e "s|$(global_variable_tag_end)|$(end)|" \ -e "s|$(value_tag_start)| (default: $(red)|" \ -e "s|$(value_tag_end)|$(end))|" \ -e "s|$(doc_tag_indented_start)|$(grayb)|g" \ -e "s|$(doc_tag_indented_end)|$(end)|g" \ -e "s|$(doc_tag_start)|\n |g" \ -e "s|$(doc_tag_end)||g" \ -e "p"