[PATCH v2 3/6] Makefile: Do not force elf last for the others and tests passes
Adhemerval Zanella Netto
adhemerval.zanella@linaro.org
Fri Jul 3 15:49:33 GMT 2026
On 03/07/26 07:59, Sam James wrote:
> 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
Ack.
>
>> 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.
I tend to agree, and the build dependencies are not straightforward visible
without parsing the multiple implicit rules we have. I tried to not avoid adding
*more* complexity, but I don't see a way to simplify it without refactoring
*a lot* of Make rules.
>
> Reviewed-by: Sam James <sam@gentoo.org>
More information about the Libc-alpha
mailing list