[PATCH v2 3/6] Makefile: Do not force elf last for the others and tests passes
Sam James
sam@gentoo.org
Fri Jul 3 10:59:32 GMT 2026
Adhemerval Zanella <adhemerval.zanella@linaro.org> writes:
> The requirement that the elf subdirectory comes last in the
> subdirectory ordering stems from its lib pass: the rtld link consumes
> $(common-objpfx)libc_pic.a, which aggregates every other
> subdirectory's objects.
>
> The others, tests, and xtests classes have no such dependency: everything
> they consume from other subdirectories is provided by the pass barriers
> (others after lib, tests after others). Keep elf last only for the
> object-building classes and let its others and tests sub-makes run
> concurrently with the other subdirectories.
>
> With elf no longer forced last for those classes, the Depend edges
> pointing to elf (e.g. support/Depend) no longer create a cycle there,
> so honor them instead of dropping them.
>
> This improves the make check withr run-built-tests=no, specially on
with
> machine with many cores. Results on a x86_64 machine [1] it improves
> from 190s to 181s, while on a aarch64 machine [2] it improves from
> 298.726s to 243.098s.
>
> Build results remain bit-identical and the tests.sum failure sets are
> unchanged.
>
> [1] Ryzen 5900x, 12c/24t, gcc 16.1.1, binutils 2.26, and GNU make 4.3
> [2] N1, 80c, gcc 15.1.1, binutils 2.25, GNU make 4.3
> ---
> Makefile | 34 +++++++++++++++++++++++-----------
> 1 file changed, 23 insertions(+), 11 deletions(-)
>
> diff --git a/Makefile b/Makefile
> index 45dc36942a8..a6e5317de7b 100644
> --- a/Makefile
> +++ b/Makefile
> @@ -508,21 +508,28 @@ endef
> # * The edges requested by the Depend files (emitted by gen-sorted.awk
> # as subdir-deps-*) are preserved.
> #
> -# * elf stays last, as in the sorted list. Its rtld build recurses into
> -# the other subdirectories' object directories via elf/rtld-Rules.
> +# * elf stays last for the object-building classes, as in the sorted
> +# list: its rtld link consumes $(common-objpfx)libc_pic.a, which
> +# aggregates every other subdirectory's objects, and its rtld-Rules
> +# recursion compiles into the other subdirectories' object
> +# directories. The others/tests/xtests classes have no such
> +# dependency (the pass barriers below provide everything they need),
> +# so elf is unordered there.
> #
> # * Only target classes without cross-directory file conflicts use this
> # sparse ordering; everything else (install, clean, abi, stubs) keeps
> # the previous total order via a serial chain.
>
> -+parallel_subdir_targets := \
> - subdir_lib \
> - objects \
> ++elf_last_subdir_targets := \
> + subdir_lib objects \
> objs \
> + subdir_objs \
> + # +elf_last_subdir_targets
> ++parallel_subdir_targets := \
> + $(+elf_last_subdir_targets) \
> others \
> tests \
> xtests \
> - subdir_objs \
> # +parallel_subdir_targets
> +serial_subdir_targets := $(filter-out $(+parallel_subdir_targets),\
> $(+subdir_targets))
> @@ -552,14 +559,19 @@ $(foreach t,$(+ordered_parallel_subdir_targets),$(eval \
> $(foreach d,$(+subdir-pregen),$(foreach t,$(+ordered_parallel_subdir_targets),$(eval \
> $(d)/$(t): $(addsuffix /$(t),$(+subdir-pregen-prev))))\
> $(eval +subdir-pregen-prev := $(d)))
> -# Edges pointing to elf are dropped; the sorted list always forces elf
> -# last, overriding any Depend request, and the elf-last edges below would
> -# otherwise create a cycle.
> -$(foreach t,$(+ordered_parallel_subdir_targets),$(foreach d,$(+subdir-rest),$(eval \
> +# For the classes where elf is forced last, edges pointing to elf are
> +# dropped: the sorted list always overrides such Depend requests today
> +# (e.g. support/Depend), and the elf-last edges below would otherwise
> +# create a cycle. The remaining classes honor them.
> +$(foreach t,$(+elf_last_subdir_targets),$(foreach d,$(+subdir-rest),$(eval \
> $(d)/$(t): $(addsuffix /$(t),\
> $(filter-out elf,$(filter $(subdirs),$(subdir-deps-$(d))))))))
> +$(foreach t,$(filter-out $(+elf_last_subdir_targets),\
> + $(+ordered_parallel_subdir_targets)),\
> + $(foreach d,$(+subdir-rest),$(eval \
> + $(d)/$(t): $(addsuffix /$(t),$(filter $(subdirs),$(subdir-deps-$(d)))))))
> ifneq (,$(filter elf,$(subdirs)))
> -$(foreach t,$(+ordered_parallel_subdir_targets),$(eval \
> +$(foreach t,$(+elf_last_subdir_targets),$(eval \
> elf/$(t): $(addsuffix /$(t),$(filter-out elf,$(subdirs)))))
> endif
Not a huge fan of how complex this is but it already was pretty
complex and the comments help.
Reviewed-by: Sam James <sam@gentoo.org>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 418 bytes
Desc: not available
URL: <https://sourceware.org/pipermail/libc-alpha/attachments/20260703/442e22c0/attachment.sig>
More information about the Libc-alpha
mailing list