I love Makefiles, they are my prefered way to manage builds. Not just for C or C++, I also use it for Golang for example. To me, it is the best way to manage build commands in a single place.

As I love CLI tools in general, and working with them, the --help flag is often a great help, but Make does not offer this out of the box, and navigating complex Makefiles can be challenging.

I can’t remember where or when, but a few years ago, I found a snippet somewhere of a Makefile command that adds a coloured text output of all Makefile commands. Using it is as simple as making the following your first Makefile command:

.PHONY: help
help: ## Shows all commands
	@echo 'All Makefile commands:'
	@grep -h -E '^[a-zA-Z_-]+:.*?## .*$$' $(MAKEFILE_LIST) | awk 'BEGIN {FS = ":.*?## "}; {printf "\033[36m%-30s\033[0m %s\n", $$1, $$2}'

After adding this, you can simply add comments after your other Makefile commands with two # characters, like this:

.PHONY: dev
dev: CFLAGS = $(CFLAGS_DEV) ## Development build for /src and /example
dev: clean $(LIB) $(EXAMPLE)

This will now be automatically generate help output when running make help, or when you have defined this as your first Make command, with simply make

make help output