There are two main Makefile linters that we’re currently aware of: https://github.com/mrtazz/checkmake (written in Go) and https://github.com/mcandre/unmake (written in Rust, very new). We don’t yet use either of them, although perhaps we should. The only form of Makefile linting we currently use is a “selfcheck” make target that we often run in CI just to ensure that the file isn’t egregiously malformed.
We sometimes want to make a specific change in a large percentage of our Makefiles, for example when making dependency management improvements or adding new development utilities. Unfortunately, there isn’t yet a good Makefile parser/editor for Python; in fact, we’re unaware of any decent ones implemented in any language other than Perl (Makefile::DOM, etc.). So when we want to do a bulk Makefile edit, we’ve historically resorted to sed for simple changes and manual effort for more complex ones.