[Buildroot] [PATCH v2 1/1] toolchain: handle toolchains with multiple ld*.so.* files

Arnout Vandecappelle arnout at mind.be
Thu Aug 26 12:24:07 UTC 2021



On 26/08/2021 13:24, Baruch Siach wrote:
> Hi Arnout, Jonah,
> 
> On Wed, Aug 25 2021, Arnout Vandecappelle wrote:
>> On 24/08/2021 22:38, Jonah Petri wrote:
>>> Some 3rd party vendor toolchains have multiple files which match
>>> these glob patterns.  In this case, the shell script failed.
>>> Switching to use find and xargs solves the issue.
>>>
>>> Signed-off-by: Jonah Petri <jonah at petri.us>
>>
>>  Applied to master, thanks.
> 
> It looks like this breaks the ARM aarch64 external toolchain. Both ld.so
> existence test and ld.so listing command are broken. See this libnl
> failure:
> 
>   http://autobuild.buildroot.net/results/afe/afe44f4b6a3c53e5864cfb10b04529011e72cf5c/
> 
> I have no idea why we don't see much wider breakage in the autobuilder.
> 
> The patch below fixes the build here, but I'm not entirely sure it is
> the correct fix.
> 
> Since this is a risky change and we are close to release, I'd suggest to
> revert this change in master, and consider it again for next.

 Reverted.

 There's indeed a lot wrong with this...

> 
> diff --git a/toolchain/helpers.mk b/toolchain/helpers.mk
> index 5ed149d57d31..3aefd1d0096e 100644
> --- a/toolchain/helpers.mk
> +++ b/toolchain/helpers.mk
> @@ -135,8 +135,8 @@ copy_toolchain_sysroot = \
>  			$(call simplify_symlink,$$i,$(STAGING_DIR)) ; \
>  		done ; \
>  	fi ; \
> -       if ! find -wholename $(STAGING_DIR)'/lib/ld*.so.*' > /dev/null; then \
> -               find -wholename $${ARCH_SYSROOT_DIR}'/lib/ld*.so.*' -print0 | xargs -0 -I % cp % $(STAGING_DIR)/lib/; \
> +       if [ ! -e $(STAGING_DIR)/lib/ld*.so.* ]; then \
> +               find $${ARCH_SYSROOT_DIR} -wholename '*/lib/ld*.so.*' -print0 | xargs -0 -I % cp % $(STAGING_DIR)/lib/; \
>  	fi ; \
>  	if [ `readlink -f $${SYSROOT_DIR}` != `readlink -f $${ARCH_SYSROOT_DIR}` ] ; then \
>  		if [ ! -d $${ARCH_SYSROOT_DIR}/usr/include ] ; then \
> 
> baruch
> 
>>> ---
>>> Changes v1->v2:
>>> 	Add SOB
>>>
>>>  toolchain/helpers.mk | 6 ++----
>>>  1 file changed, 2 insertions(+), 4 deletions(-)
>>>
>>> diff --git a/toolchain/helpers.mk b/toolchain/helpers.mk
>>> index dfb2581ed5..5ed149d57d 100644
>>> --- a/toolchain/helpers.mk
>>> +++ b/toolchain/helpers.mk
>>> @@ -135,10 +135,8 @@ copy_toolchain_sysroot = \
>>>  			$(call simplify_symlink,$$i,$(STAGING_DIR)) ; \
>>>  		done ; \
>>>  	fi ; \
>>> -	if [ ! -e $(STAGING_DIR)/lib/ld*.so.* ]; then \
>>> -		if [ -e $${ARCH_SYSROOT_DIR}/lib/ld*.so.* ]; then \
>>> -			cp -a $${ARCH_SYSROOT_DIR}/lib/ld*.so.* $(STAGING_DIR)/lib/ ; \
>>> -		fi ; \
>>> +       if ! find -wholename $(STAGING_DIR)'/lib/ld*.so.*' > /dev/null; then \

 With no path, find defaults to the current directory. However, STAGING_DIR is
the full absolute directory, so wholename is never going to match it. It should
probably be

find $(STAGINGDIR) -wholename $(STAGINGDIR)/lib/ld*.so.*

 In addition, however, find's exit code doesn't say anything about whether it
was found or not. So we instead have to use the printed output and check if it's
non-empty.

 Finally, as an optimisation, we could use -quit to make sure it exits after the
first match instead of needlessly continuing.


 As Baruch said, however, this is too risky for master, so if a v3 comes it will
be applied to next.


 Regards,
 Arnout

>>> +               find -wholename $${ARCH_SYSROOT_DIR}'/lib/ld*.so.*' -print0 | xargs -0 -I % cp % $(STAGING_DIR)/lib/; \
>>>  	fi ; \
>>>  	if [ `readlink -f $${SYSROOT_DIR}` != `readlink -f $${ARCH_SYSROOT_DIR}` ] ; then \
>>>  		if [ ! -d $${ARCH_SYSROOT_DIR}/usr/include ] ; then \
>>>
>> _______________________________________________
>> buildroot mailing list
>> buildroot at busybox.net
>> http://lists.busybox.net/mailman/listinfo/buildroot
> 
> 


More information about the buildroot mailing list