Like there isn’t for any other language out there including C itself!
What Cargo’s build.rs does is just the same as what Autotool’s configure.ac, CMake’s CMakeLists.txt or Meson’s meson.build does in light cyan.
Since there is no standard for defining dependencies across platforms and/or build systems, you end up with installation instructions in the readme.
That post is written too much from the point of view deep inside Meson. If you were trying to integrate something built with Meson into a larger project built with, say, Maven, you’d be cursing in just the same way. When mixing build systems, neither can see what is going on in another one, no matter which ones you choose.
Instead the closest-to-practical approach when building heterogeneous suites of software is to use a meta-build system like Yocto’s BitBake or BuildStream that treats each part, with its own build system, as a little black box, declares dependencies between them, and then lets each build in a sandbox with the dependencies already declared. But you can do this for a specific system, not for all of them, because they are too different.
I would probably go a bit further and suggest that build.rs should be able to define any number of generation steps with dependencies and outputs. That way if multiple components need to be generated, only the ones that have changed inputs can be re-run.
Though we can also simply have a library to take care of that and simply use it from the build.rs…