Run the bootstrap object comparison in parallel

The stage 2 and stage 3 object comparison runs one command per object in a
serial shell loop.  Everything after it waits while an otherwise idle machine
compares thousands of objects.

Generate one make target per object and run the comparisons through $(MAKE),
so they share the original jobserver.  Keep the generated makefile and result
shards invocation-specific, clean them on normal and signal exits, and sort
the shards before creating the traditional .bad_compare diagnostic.  Files in
the exclusion list still only warn.  Comparator statuses other than zero or
one now report an operational error instead of being treated as equal.

The tail-based fallback for cmp implementations without byte skipping used
fixed temporary names.  Give those files process-specific names, clean them
with a trap, and preserve the same status contract for tail failures and
signals.

On highly parallel AArch64 and x86_64 systems this reduces comparison wall
time by about 95%.

ChangeLog:

	* Makefile.tpl ([+compare-target+]): Run object comparisons through an
	invocation-specific parallel sub-make.  Collect sorted failure shards
	and clean temporary state on exit.
	* Makefile.in: Regenerate.
	* configure: Regenerate.

config/ChangeLog:

	* acx.m4 (ACX_PROG_CMP_IGNORE_INITIAL): Use process-specific temporary
	files and clean them on exit.  Diagnose tail failures as errors.

Signed-off-by: Kyrylo Tkachov <ktkachov@nvidia.com>
4 files changed