From: Kyrylo Tkachov <[email protected]>
libstdc++-v3/src is built by walking SUBDIRS, and automake implements that
walk as a shell loop. The per-standard directories are therefore built one
after another no matter how large -j is, and most of them hold only a handful
of files. Sampling the compiler processes during a bootstrap shows a mean of
between 2 and 4 concurrent compiles against -j64, with exactly one source
directory active at any moment, and long stretches at a concurrency of two.
libstdc++ is the last thing to finish in every stage, so for most of that time
nothing else in the build is running and the machine is idle.
The directories are independent of each other, apart from src/experimental,
which links the convenience archives of c++23, c++26, filesystem and
libbacktrace. Give make an explicit target per directory, with that one
dependency written down, and let it overlap them. automake's own loop still
runs afterwards, finds everything built and costs nothing, so the recursion
for install, clean and the other targets is untouched.
On aarch64 a clean rebuild of libstdc++-v3/src with the final stage compiler
falls by 62%, and a release checking bootstrap by 12.8%.
Bootstrapped on aarch64-none-linux-gnu. Ok for trunk?
libstdc++-v3/ChangeLog:
* src/Makefile.am (all-recursive): Depend on all-parallel-subdirs.
(all-parallel-subdirs, all-in-%): New targets.
(all-in-experimental): Depend on the directories whose convenience
archives it links.
* src/Makefile.in: Regenerate.
Signed-off-by: Kyrylo Tkachov <[email protected]>
---
libstdc++-v3/src/Makefile.am | 20 ++++++++++++++++++++
libstdc++-v3/src/Makefile.in | 20 ++++++++++++++++++++
2 files changed, 40 insertions(+)
diff --git a/libstdc++-v3/src/Makefile.am b/libstdc++-v3/src/Makefile.am
index 35a497a1588..17fd6ed6064 100644
--- a/libstdc++-v3/src/Makefile.am
+++ b/libstdc++-v3/src/Makefile.am
@@ -46,6 +46,26 @@ endif
SUBDIRS = c++98 c++11 c++17 c++20 c++23 c++26 \
$(filesystem_dir) $(backtrace_dir) $(experimental_dir)
+# automake walks SUBDIRS with a shell loop, so the source directories are
+# built strictly one after another however large -j is. They are independent
+# of each other apart from the convenience archives that src/experimental
+# links, so build them from make instead and let it overlap them. automake's
+# own loop still runs afterwards, where it finds everything already built and
+# costs nothing, and the recursion for install, clean and the rest is
+# untouched.
+all-recursive: all-parallel-subdirs
+
+all-parallel-subdirs: $(SUBDIRS:%=all-in-%)
+
+all-in-%:
+ $(MAKE) $(AM_MAKEFLAGS) -C $* all
+
+# src/experimental links the convenience archives of these directories.
+all-in-experimental: all-in-c++23 all-in-c++26 \
+ $(filesystem_dir:%=all-in-%) $(backtrace_dir:%=all-in-%)
+
+.PHONY: all-parallel-subdirs
+
# Cross compiler support.
if VTV_CYGMIN
toolexeclib_LTLIBRARIES = libvtv.la libstdc++.la
diff --git a/libstdc++-v3/src/Makefile.in b/libstdc++-v3/src/Makefile.in
index 811d0a5ce4a..104033fd679 100644
--- a/libstdc++-v3/src/Makefile.in
+++ b/libstdc++-v3/src/Makefile.in
@@ -1020,6 +1020,26 @@ uninstall-am: uninstall-toolexeclibLTLIBRARIES
.PRECIOUS: Makefile
+# automake walks SUBDIRS with a shell loop, so the source directories are
+# built strictly one after another however large -j is. They are independent
+# of each other apart from the convenience archives that src/experimental
+# links, so build them from make instead and let it overlap them. automake's
+# own loop still runs afterwards, where it finds everything already built and
+# costs nothing, and the recursion for install, clean and the rest is
+# untouched.
+all-recursive: all-parallel-subdirs
+
+all-parallel-subdirs: $(SUBDIRS:%=all-in-%)
+
+all-in-%:
+ $(MAKE) $(AM_MAKEFLAGS) -C $* all
+
+# src/experimental links the convenience archives of these directories.
+all-in-experimental: all-in-c++23 all-in-c++26 \
+ $(filesystem_dir:%=all-in-%) $(backtrace_dir:%=all-in-%)
+
+.PHONY: all-parallel-subdirs
+
@VTV_CYGMIN_TRUE@vtv_stubs.cc:
@VTV_CYGMIN_TRUE@ rm -f $@
@VTV_CYGMIN_TRUE@ $(LN_S)
$(toplevel_srcdir)/libstdc++-v3/libsupc++/vtv_stubs.cc $@
--
2.50.1 (Apple Git-155)