This operation takes 2-5 seconds on every build, but doesn't actually need to
run most of the time. Now we cache it and see if it needs a rebuild (fast)
before actually rebuilding (slow).
Previously even 'make clean' would first produce dependency information (slow)
and sinclude all the metadata, possibly restarting the make, before removing
the things it just did.
Now dependencies are only processed when something explicitly depends on them,
by calling 'make' on the rules around generated files, rather than sincluding
them.
Net result: make clean is faster and safer. Additionally, bash tab-completion
for 'make' does not run the slow 'find' any more.
In this case, the 'clean' step would nuke the metadata files, but they have
already been read, so in-memory state is fine. This triggered a couple of
pathological conditions that would not normally be hit. This commit fills in
those nodes in the DAG, even though they are not directly needed in most
builds.
Also fix some whitespace for readability.
On OSX - default BSD grep breaks gen_conversion. Let's just
make sure we use --color=never everywhere, so we don't trip
over GREP_OPTIONS/GREP_COLOR in a user environment.
Fixes#29013