Good stuff! I have come to many of the same conclusions and even many of the same implementations—especially Make as the primary developer interface to a project.
My variations include:
Here’s a representative example of the style of Makefile I use:
Here’s a slightly more complex example; I especially like how coverage is done in this project:
Neat. Thank you for the compliment and for sharing. I really like the conditional definition of release in the second example. I’m going to meditate on that a bit and see if there’s a way I can safeguard some tasks similarly. Our releases are done on CI; no one can should push from local builds but I think I’ve got some other tasks worth guarding.
I’m glad you saw something interesting there.
For a slightly wilder Make experiment, check out this alternative way of specifying PHONY targets: https://twitter.com/benji_york/status/1550138533494628357