Here's an easy way to generate makefile help command from its comments that I saw some time ago somewhere.
.DEFAULT_GOAL := help
help:
    @grep -E '^[a-zA-Z0-9_-]+:.*?## .*$$' $(MAKEFILE_LIST) | sort | awk 'BEGIN {FS = ":.*?## "}; {printf "\033[36m%-15s\033[0m %s\n", $$1, $$2}'
command1: command2 ## Alias of command2
    echo 'Done!'
command2: ## run command2
    echo 'Running command2'
command3: # Unlisted command
    @echo "I'm private"
Explanation
- 
.DEFAULT_GOALwill run provided make command if none is specified, so by doingmakeit will executemake help - 
@grep -E '^[a-zA-Z0-9_-]+:.*?## .*$$' $(MAKEFILE_LIST):- 
@will suppress output because by default make will print out the command it's executing - 
grep ...will look for lines that have commands with comments separated by## - 
'^[a-zA-Z0-9_-]+:.*?## .*$$'means search from start of line, any alphanumeric,_and-command names followed by:and any character until##to end of line (since$has special meaning in make, we have to escape it so end of line becomes$$) - 
MAKEFILE_LISTis make variable that refers to the makefile name in this case 
 - 
 - 
sortto get alphabetically sorted output - 
awk 'BEGIN {FS = ":.*?## "}; {printf "\033[36m%-15s\033[0m %s\n", $$1, $$2}':- pipe the lines through 
awkand set theFSfield separator to be whatever between the command and help text (modify##if you want different separator) - for each match print with color: 
\033[36m%-15s\033[0m %s\nso we will get command, padded with 15 spaces, followed by the help text - again since we're inside make escape 
$1&$2for column number with$$1&$$2 
 - pipe the lines through 
 - For commands you don't want to be listed as 
helpoutput, simply don't comment or use single#likecommand3example 
Output
$ make
command1        Alias of command2
command2        run command2
    
Top comments (1)
This is gold!