In the systems I have seen:
* Because the rules are generated. Building a subpart sometimes means invoking a generated rule.
* Because make is used for other things: building binaries, libraries, examples, test suite, documentation -- then executing them, preparing a test environment, installing them, generating distribution packages, etc.
* Because the system is a framework, and each rule relates to one of many plugins (Buildroot for example).
* Because the system is just very large and complex (linux).
Now to go back to automake. It is still very useful to have automated checks of compliance -- either about some extended warnings supported only by some compilers and not others (clang vs GCC), allowing extensions, static analysis, coverage, etc. That being said, automake is
terrible. The two passes to generate the actual build systems means most people are actually reading generated makefile and debugging
that. As was said by GP, it is also sub-optimal regarding use of make.
Frankly, it is just much simpler to directly work with makefiles, or change build tool altogether (meson + ninja is nice). Autotools has always been a nightmare to work with in my experience.
Keeping with make, I much prefer musl way for example, where a POSIX shell script examines the dependencies and configures a single makefile giving the project state, then the actual makefiles will consume it to operate properly.