diff mbox

[v2] toolchain: add a harmless link when sysroot detection is not accurate

Message ID 1453475155-49586-1-git-send-email-Vincent.Riera@imgtec.com
State Superseded
Headers show

Commit Message

Vicente Olivert Riera Jan. 22, 2016, 3:05 p.m. UTC
Sometimes is not possible to detect if the sysroots are nested or side
by side. For instance this happens for MIPS big endian, where the
sysroot and the arch-sysroot directories are the same. Examples:

Comments

Vicente Olivert Riera Feb. 2, 2016, 10:57 a.m. UTC | #1
ping

Currently Codescape MIPS toolchains are broken for big-endian. This 
patch fixes the problem.

On 22/01/16 16:05, Vicente Olivert Riera wrote:
> Sometimes is not possible to detect if the sysroots are nested or side
> by side. For instance this happens for MIPS big endian, where the
> sysroot and the arch-sysroot directories are the same. Examples:
>
> === Mentor Sourcery CodeBench toolchain
>
> $ readlink -f $(LANG=C mips-linux-gnu-gcc -print-file-name=libc.a) | sed
> -r -e 's:(usr/)?lib(32|64)?([^/]*)?/([^/]*/)?libc\.a::'
> /toolchains/mips-2015.11/mips-linux-gnu/libc/
>
> $ readlink -f $(LANG=C mips-linux-gnu-gcc -EB -print-file-name=libc.a) |
> sed -r -e 's:(usr/)?lib(32|64)?([^/]*)?/([^/]*/)?libc\.a::'
> /toolchains/mips-2015.11/mips-linux-gnu/libc/
>
> === Codescape toolchain
>
> $ readlink -f $(LANG=C mips-img-linux-gnu-gcc -print-file-name=libc.a) |
> sed -r -e 's:(usr/)?lib(32|64)?([^/]*)?/([^/]*/)?libc\.a::'
> /toolchains/mips-img-linux-gnu/2015.06-05/sysroot/mips-r6-hard/
>
> $ readlink -f $(LANG=C mips-img-linux-gnu-gcc -EB
> -print-file-name=libc.a) | sed -r -e
> 's:(usr/)?lib(32|64)?([^/]*)?/([^/]*/)?libc\.a::'
> /toolchains/mips-img-linux-gnu/2015.06-05/sysroot/mips-r6-hard/
>
> For those cases where the sysroot detection is not accurate we add a
> harmless symlink necessary for certain toolchains such as Codescape for
> MIPS. The other toolchains in this situation (unknown sysroot layout)
> don't need this symlink to work, but as stated before, this symlink is
> harmless.
>
> Signed-off-by: Vicente Olivert Riera <Vincent.Riera@imgtec.com>
> ---
> Changes v1 -> v2:
>   - Update the comment above the copy_toolchain_sysroot function.
>   - Explain in the commit log which toolchains are affected and provide
>     some outputs of -print-file-name to explain the problem.
>     (Both changes requested by Thomas Petazzoni)
>
>   toolchain/helpers.mk | 16 ++++++++++++++++
>   1 file changed, 16 insertions(+)
>
> diff --git a/toolchain/helpers.mk b/toolchain/helpers.mk
> index 70695ee..c8245f7 100644
> --- a/toolchain/helpers.mk
> +++ b/toolchain/helpers.mk
> @@ -130,6 +130,12 @@ copy_toolchain_lib_root = \
>   #
>   # * Create a symbolic link
>   #
> +# If we are in the situation where we don't know if the sysroot layout
> +# is nested of side by side, we:
> +#
> +# * Create a symbolic link because it's harmless and is necessary for
> +#   certain toolchains like Codescape for MIPS.
> +#
>   # Finally, some toolchains (i.e Linaro binary toolchains) store
>   # support libraries (libstdc++, libgcc_s) outside of the sysroot, so
>   # we simply copy all the libraries from the "support lib directory"
> @@ -160,9 +166,12 @@ copy_toolchain_sysroot = \
>   	done ; \
>   	SYSROOT_DIR_CANON=`readlink -f $${SYSROOT_DIR}` ; \
>   	ARCH_SYSROOT_DIR_CANON=`readlink -f $${ARCH_SYSROOT_DIR}` ; \
> +	echo "SYSROOT_DIR_CANON: $${ARCH_SYSROOT_DIR_CANON}" ; \
> +	echo "ARCH_SYSROOT_DIR_CANON: $${ARCH_SYSROOT_DIR_CANON}" ; \
>   	if [ $${SYSROOT_DIR_CANON} != $${ARCH_SYSROOT_DIR_CANON} ] ; then \
>   		relpath="./" ; \
>   		if [ $${ARCH_SYSROOT_DIR_CANON:0:$${\#SYSROOT_DIR_CANON}} == $${SYSROOT_DIR_CANON} ] ; then \
> +			echo "Nested sysroots detected." ; \
>   			if [ ! -d $${ARCH_SYSROOT_DIR}/usr/include ] ; then \
>   				cp -a $${SYSROOT_DIR}/usr/include $(STAGING_DIR)/usr ; \
>   			fi ; \
> @@ -174,9 +183,16 @@ copy_toolchain_sysroot = \
>   			ln -s $${relpath} $(STAGING_DIR)/$${ARCH_SUBDIR} ; \
>   			echo "Symlinking $(STAGING_DIR)/$${ARCH_SUBDIR} -> $${relpath}" ; \
>   		elif [ `dirname $${ARCH_SYSROOT_DIR_CANON}` == `dirname $${SYSROOT_DIR_CANON}` ] ; then \
> +			echo "Side by side sysroots detected." ; \
>   			ln -snf $${relpath} $(STAGING_DIR)/`basename $${ARCH_SYSROOT_DIR_CANON}` ; \
>   			echo "Symlinking $(STAGING_DIR)/`basename $${ARCH_SYSROOT_DIR_CANON}` -> $${relpath}" ; \
>   		fi ; \
> +	else \
> +		relpath="./" ; \
> +		echo "Unable to detect if sysroots are nested or side by side." ; \
> +		echo "Creating a harmless symlink necessary for certain toolchains." ; \
> +		ln -snf $${relpath} $(STAGING_DIR)/`basename $${ARCH_SYSROOT_DIR_CANON}` ; \
> +		echo "Symlinking $(STAGING_DIR)/`basename $${ARCH_SYSROOT_DIR_CANON}` -> $${relpath}" ; \
>   	fi ; \
>   	if test -n "$${SUPPORT_LIB_DIR}" ; then \
>   		cp -a $${SUPPORT_LIB_DIR}/* $(STAGING_DIR)/lib/ ; \
>
Romain Naour Feb. 2, 2016, 2:21 p.m. UTC | #2
Hi Vicente,

Le 02/02/2016 11:57, Vicente Olivert Riera a écrit :
> ping
> 
> Currently Codescape MIPS toolchains are broken for big-endian. This patch fixes
> the problem.
> 
> On 22/01/16 16:05, Vicente Olivert Riera wrote:
>> Sometimes is not possible to detect if the sysroots are nested or side
>> by side. For instance this happens for MIPS big endian, where the
>> sysroot and the arch-sysroot directories are the same. Examples:

By sometime, you mean toolchains generated by Crosstool-ng and Buildroot which
doesn't support multi-lib.

>>
>> === Mentor Sourcery CodeBench toolchain
>>
>> $ readlink -f $(LANG=C mips-linux-gnu-gcc -print-file-name=libc.a) | sed
>> -r -e 's:(usr/)?lib(32|64)?([^/]*)?/([^/]*/)?libc\.a::'
>> /toolchains/mips-2015.11/mips-linux-gnu/libc/
>>
>> $ readlink -f $(LANG=C mips-linux-gnu-gcc -EB -print-file-name=libc.a) |
>> sed -r -e 's:(usr/)?lib(32|64)?([^/]*)?/([^/]*/)?libc\.a::'
>> /toolchains/mips-2015.11/mips-linux-gnu/libc/
>>
>> === Codescape toolchain
>>
>> $ readlink -f $(LANG=C mips-img-linux-gnu-gcc -print-file-name=libc.a) |
>> sed -r -e 's:(usr/)?lib(32|64)?([^/]*)?/([^/]*/)?libc\.a::'
>> /toolchains/mips-img-linux-gnu/2015.06-05/sysroot/mips-r6-hard/
>>
>> $ readlink -f $(LANG=C mips-img-linux-gnu-gcc -EB
>> -print-file-name=libc.a) | sed -r -e
>> 's:(usr/)?lib(32|64)?([^/]*)?/([^/]*/)?libc\.a::'
>> /toolchains/mips-img-linux-gnu/2015.06-05/sysroot/mips-r6-hard/
>>
>> For those cases where the sysroot detection is not accurate we add a
>> harmless symlink necessary for certain toolchains such as Codescape for
>> MIPS. The other toolchains in this situation (unknown sysroot layout)
>> don't need this symlink to work, but as stated before, this symlink is
>> harmless.

Since Codescape are supported in Buildroot as external toolchain and the issue
appear only with it for BE, you can probability use a
TOOLCHAIN_EXTERNAL_POST_INSTALL_STAGING_HOOKS like for some Linaro toolchains
instead ?

Thoughts ?

>>
>> Signed-off-by: Vicente Olivert Riera <Vincent.Riera@imgtec.com>
>> ---
>> Changes v1 -> v2:
>>   - Update the comment above the copy_toolchain_sysroot function.
>>   - Explain in the commit log which toolchains are affected and provide
>>     some outputs of -print-file-name to explain the problem.
>>     (Both changes requested by Thomas Petazzoni)
>>
>>   toolchain/helpers.mk | 16 ++++++++++++++++
>>   1 file changed, 16 insertions(+)
>>
>> diff --git a/toolchain/helpers.mk b/toolchain/helpers.mk
>> index 70695ee..c8245f7 100644
>> --- a/toolchain/helpers.mk
>> +++ b/toolchain/helpers.mk
>> @@ -130,6 +130,12 @@ copy_toolchain_lib_root = \
>>   #
>>   # * Create a symbolic link
>>   #
>> +# If we are in the situation where we don't know if the sysroot layout
>> +# is nested of side by side, we:
>> +#
>> +# * Create a symbolic link because it's harmless and is necessary for
>> +#   certain toolchains like Codescape for MIPS.
>> +#
>>   # Finally, some toolchains (i.e Linaro binary toolchains) store
>>   # support libraries (libstdc++, libgcc_s) outside of the sysroot, so
>>   # we simply copy all the libraries from the "support lib directory"
>> @@ -160,9 +166,12 @@ copy_toolchain_sysroot = \
>>       done ; \
>>       SYSROOT_DIR_CANON=`readlink -f $${SYSROOT_DIR}` ; \
>>       ARCH_SYSROOT_DIR_CANON=`readlink -f $${ARCH_SYSROOT_DIR}` ; \
>> +    echo "SYSROOT_DIR_CANON: $${ARCH_SYSROOT_DIR_CANON}" ; \

should be SYSROOT_DIR_CANON

Best regards,
Romain

>> +    echo "ARCH_SYSROOT_DIR_CANON: $${ARCH_SYSROOT_DIR_CANON}" ; \
>>       if [ $${SYSROOT_DIR_CANON} != $${ARCH_SYSROOT_DIR_CANON} ] ; then \
>>           relpath="./" ; \
>>           if [ $${ARCH_SYSROOT_DIR_CANON:0:$${\#SYSROOT_DIR_CANON}} ==
>> $${SYSROOT_DIR_CANON} ] ; then \
>> +            echo "Nested sysroots detected." ; \
>>               if [ ! -d $${ARCH_SYSROOT_DIR}/usr/include ] ; then \
>>                   cp -a $${SYSROOT_DIR}/usr/include $(STAGING_DIR)/usr ; \
>>               fi ; \
>> @@ -174,9 +183,16 @@ copy_toolchain_sysroot = \
>>               ln -s $${relpath} $(STAGING_DIR)/$${ARCH_SUBDIR} ; \
>>               echo "Symlinking $(STAGING_DIR)/$${ARCH_SUBDIR} -> $${relpath}" ; \
>>           elif [ `dirname $${ARCH_SYSROOT_DIR_CANON}` == `dirname
>> $${SYSROOT_DIR_CANON}` ] ; then \
>> +            echo "Side by side sysroots detected." ; \
>>               ln -snf $${relpath} $(STAGING_DIR)/`basename
>> $${ARCH_SYSROOT_DIR_CANON}` ; \
>>               echo "Symlinking $(STAGING_DIR)/`basename
>> $${ARCH_SYSROOT_DIR_CANON}` -> $${relpath}" ; \
>>           fi ; \
>> +    else \
>> +        relpath="./" ; \
>> +        echo "Unable to detect if sysroots are nested or side by side." ; \
>> +        echo "Creating a harmless symlink necessary for certain toolchains." ; \
>> +        ln -snf $${relpath} $(STAGING_DIR)/`basename
>> $${ARCH_SYSROOT_DIR_CANON}` ; \
>> +        echo "Symlinking $(STAGING_DIR)/`basename $${ARCH_SYSROOT_DIR_CANON}`
>> -> $${relpath}" ; \
>>       fi ; \
>>       if test -n "$${SUPPORT_LIB_DIR}" ; then \
>>           cp -a $${SUPPORT_LIB_DIR}/* $(STAGING_DIR)/lib/ ; \
>>
> _______________________________________________
> buildroot mailing list
> buildroot@busybox.net
> http://lists.busybox.net/mailman/listinfo/buildroot
Vicente Olivert Riera Feb. 2, 2016, 3:14 p.m. UTC | #3
Hello Romain,

On 02/02/16 15:21, Romain Naour wrote:
> Hi Vicente,
>
> Le 02/02/2016 11:57, Vicente Olivert Riera a écrit :
>> ping
>>
>> Currently Codescape MIPS toolchains are broken for big-endian. This patch fixes
>> the problem.
>>
>> On 22/01/16 16:05, Vicente Olivert Riera wrote:
>>> Sometimes is not possible to detect if the sysroots are nested or side
>>> by side. For instance this happens for MIPS big endian, where the
>>> sysroot and the arch-sysroot directories are the same. Examples:
>
> By sometime, you mean toolchains generated by Crosstool-ng and Buildroot which
> doesn't support multi-lib.

Only toolchains generated by Crosstool-ng and Buildroot? Are you sure 
about that? I think the Codescape toolchains are not generated by 
Crosstool-ng and they do support multi-lib.

>>>
>>> === Mentor Sourcery CodeBench toolchain
>>>
>>> $ readlink -f $(LANG=C mips-linux-gnu-gcc -print-file-name=libc.a) | sed
>>> -r -e 's:(usr/)?lib(32|64)?([^/]*)?/([^/]*/)?libc\.a::'
>>> /toolchains/mips-2015.11/mips-linux-gnu/libc/
>>>
>>> $ readlink -f $(LANG=C mips-linux-gnu-gcc -EB -print-file-name=libc.a) |
>>> sed -r -e 's:(usr/)?lib(32|64)?([^/]*)?/([^/]*/)?libc\.a::'
>>> /toolchains/mips-2015.11/mips-linux-gnu/libc/
>>>
>>> === Codescape toolchain
>>>
>>> $ readlink -f $(LANG=C mips-img-linux-gnu-gcc -print-file-name=libc.a) |
>>> sed -r -e 's:(usr/)?lib(32|64)?([^/]*)?/([^/]*/)?libc\.a::'
>>> /toolchains/mips-img-linux-gnu/2015.06-05/sysroot/mips-r6-hard/
>>>
>>> $ readlink -f $(LANG=C mips-img-linux-gnu-gcc -EB
>>> -print-file-name=libc.a) | sed -r -e
>>> 's:(usr/)?lib(32|64)?([^/]*)?/([^/]*/)?libc\.a::'
>>> /toolchains/mips-img-linux-gnu/2015.06-05/sysroot/mips-r6-hard/
>>>
>>> For those cases where the sysroot detection is not accurate we add a
>>> harmless symlink necessary for certain toolchains such as Codescape for
>>> MIPS. The other toolchains in this situation (unknown sysroot layout)
>>> don't need this symlink to work, but as stated before, this symlink is
>>> harmless.
>
> Since Codescape are supported in Buildroot as external toolchain and the issue
> appear only with it for BE, you can probability use a
> TOOLCHAIN_EXTERNAL_POST_INSTALL_STAGING_HOOKS like for some Linaro toolchains
> instead ?
>
> Thoughts ?

Well, the whole point for this patch [1] was to get rid of that hook 
(which was the first approach when I sent the patches to add the 
Codescape toolchains) and add that functionality in the toolchain infra 
just in case more toolchains with this problem were added in the future.

1: 
https://git.busybox.net/buildroot/commit/?id=9a1e9efe2618ebbf12ed2567bcd6e8cca5619547

Maintainers, thoughts?

>>>
>>> Signed-off-by: Vicente Olivert Riera <Vincent.Riera@imgtec.com>
>>> ---
>>> Changes v1 -> v2:
>>>    - Update the comment above the copy_toolchain_sysroot function.
>>>    - Explain in the commit log which toolchains are affected and provide
>>>      some outputs of -print-file-name to explain the problem.
>>>      (Both changes requested by Thomas Petazzoni)
>>>
>>>    toolchain/helpers.mk | 16 ++++++++++++++++
>>>    1 file changed, 16 insertions(+)
>>>
>>> diff --git a/toolchain/helpers.mk b/toolchain/helpers.mk
>>> index 70695ee..c8245f7 100644
>>> --- a/toolchain/helpers.mk
>>> +++ b/toolchain/helpers.mk
>>> @@ -130,6 +130,12 @@ copy_toolchain_lib_root = \
>>>    #
>>>    # * Create a symbolic link
>>>    #
>>> +# If we are in the situation where we don't know if the sysroot layout
>>> +# is nested of side by side, we:
>>> +#
>>> +# * Create a symbolic link because it's harmless and is necessary for
>>> +#   certain toolchains like Codescape for MIPS.
>>> +#
>>>    # Finally, some toolchains (i.e Linaro binary toolchains) store
>>>    # support libraries (libstdc++, libgcc_s) outside of the sysroot, so
>>>    # we simply copy all the libraries from the "support lib directory"
>>> @@ -160,9 +166,12 @@ copy_toolchain_sysroot = \
>>>        done ; \
>>>        SYSROOT_DIR_CANON=`readlink -f $${SYSROOT_DIR}` ; \
>>>        ARCH_SYSROOT_DIR_CANON=`readlink -f $${ARCH_SYSROOT_DIR}` ; \
>>> +    echo "SYSROOT_DIR_CANON: $${ARCH_SYSROOT_DIR_CANON}" ; \
>
> should be SYSROOT_DIR_CANON

Yes, that's right.

Regards,

Vincent.

> Best regards,
> Romain
>
>>> +    echo "ARCH_SYSROOT_DIR_CANON: $${ARCH_SYSROOT_DIR_CANON}" ; \
>>>        if [ $${SYSROOT_DIR_CANON} != $${ARCH_SYSROOT_DIR_CANON} ] ; then \
>>>            relpath="./" ; \
>>>            if [ $${ARCH_SYSROOT_DIR_CANON:0:$${\#SYSROOT_DIR_CANON}} ==
>>> $${SYSROOT_DIR_CANON} ] ; then \
>>> +            echo "Nested sysroots detected." ; \
>>>                if [ ! -d $${ARCH_SYSROOT_DIR}/usr/include ] ; then \
>>>                    cp -a $${SYSROOT_DIR}/usr/include $(STAGING_DIR)/usr ; \
>>>                fi ; \
>>> @@ -174,9 +183,16 @@ copy_toolchain_sysroot = \
>>>                ln -s $${relpath} $(STAGING_DIR)/$${ARCH_SUBDIR} ; \
>>>                echo "Symlinking $(STAGING_DIR)/$${ARCH_SUBDIR} -> $${relpath}" ; \
>>>            elif [ `dirname $${ARCH_SYSROOT_DIR_CANON}` == `dirname
>>> $${SYSROOT_DIR_CANON}` ] ; then \
>>> +            echo "Side by side sysroots detected." ; \
>>>                ln -snf $${relpath} $(STAGING_DIR)/`basename
>>> $${ARCH_SYSROOT_DIR_CANON}` ; \
>>>                echo "Symlinking $(STAGING_DIR)/`basename
>>> $${ARCH_SYSROOT_DIR_CANON}` -> $${relpath}" ; \
>>>            fi ; \
>>> +    else \
>>> +        relpath="./" ; \
>>> +        echo "Unable to detect if sysroots are nested or side by side." ; \
>>> +        echo "Creating a harmless symlink necessary for certain toolchains." ; \
>>> +        ln -snf $${relpath} $(STAGING_DIR)/`basename
>>> $${ARCH_SYSROOT_DIR_CANON}` ; \
>>> +        echo "Symlinking $(STAGING_DIR)/`basename $${ARCH_SYSROOT_DIR_CANON}`
>>> -> $${relpath}" ; \
>>>        fi ; \
>>>        if test -n "$${SUPPORT_LIB_DIR}" ; then \
>>>            cp -a $${SUPPORT_LIB_DIR}/* $(STAGING_DIR)/lib/ ; \
>>>
>> _______________________________________________
>> buildroot mailing list
>> buildroot@busybox.net
>> http://lists.busybox.net/mailman/listinfo/buildroot
>
Romain Naour Feb. 2, 2016, 3:30 p.m. UTC | #4
Hi Vicente,

Le 02/02/2016 16:14, Vicente Olivert Riera a écrit :
> Hello Romain,
> 
> On 02/02/16 15:21, Romain Naour wrote:
>> Hi Vicente,
>>
>> Le 02/02/2016 11:57, Vicente Olivert Riera a écrit :
>>> ping
>>>
>>> Currently Codescape MIPS toolchains are broken for big-endian. This patch fixes
>>> the problem.
>>>
>>> On 22/01/16 16:05, Vicente Olivert Riera wrote:
>>>> Sometimes is not possible to detect if the sysroots are nested or side
>>>> by side. For instance this happens for MIPS big endian, where the
>>>> sysroot and the arch-sysroot directories are the same. Examples:
>>
>> By sometime, you mean toolchains generated by Crosstool-ng and Buildroot which
>> doesn't support multi-lib.
> 
> Only toolchains generated by Crosstool-ng and Buildroot? Are you sure about
> that? I think the Codescape toolchains are not generated by Crosstool-ng and
> they do support multi-lib.

Well, I checked with two of the autobuilder toolchains:

http://autobuild.buildroot.org/toolchains/tarballs/br-arm-cortex-a9-musl-2015.11-rc1-71-g90d1299.tar.bz2

http://autobuild.buildroot.org/toolchains/tarballs/i686-ctng-linux-gnu.tar.xz

And I get this:

SYSROOT_DIR_CANON:
/home/naourr/git/buildroot/test/musl/host/opt/ext-toolchain/arm-buildroot-linux-musleabihf/sysroot
ARCH_SYSROOT_DIR_CANON:
/home/naourr/git/buildroot/test/musl/host/opt/ext-toolchain/arm-buildroot-linux-musleabihf/sysroot

Unable to detect if sysroots are nested or side by side.
Creating a harmless symlink necessary for certain toolchains.
Symlinking
/home/naourr/git/buildroot/test/musl/host/usr/arm-buildroot-linux-musleabihf/sysroot/sysroot
-> ./


> 
>>>>
>>>> === Mentor Sourcery CodeBench toolchain
>>>>
>>>> $ readlink -f $(LANG=C mips-linux-gnu-gcc -print-file-name=libc.a) | sed
>>>> -r -e 's:(usr/)?lib(32|64)?([^/]*)?/([^/]*/)?libc\.a::'
>>>> /toolchains/mips-2015.11/mips-linux-gnu/libc/
>>>>
>>>> $ readlink -f $(LANG=C mips-linux-gnu-gcc -EB -print-file-name=libc.a) |
>>>> sed -r -e 's:(usr/)?lib(32|64)?([^/]*)?/([^/]*/)?libc\.a::'
>>>> /toolchains/mips-2015.11/mips-linux-gnu/libc/
>>>>
>>>> === Codescape toolchain
>>>>
>>>> $ readlink -f $(LANG=C mips-img-linux-gnu-gcc -print-file-name=libc.a) |
>>>> sed -r -e 's:(usr/)?lib(32|64)?([^/]*)?/([^/]*/)?libc\.a::'
>>>> /toolchains/mips-img-linux-gnu/2015.06-05/sysroot/mips-r6-hard/
>>>>
>>>> $ readlink -f $(LANG=C mips-img-linux-gnu-gcc -EB
>>>> -print-file-name=libc.a) | sed -r -e
>>>> 's:(usr/)?lib(32|64)?([^/]*)?/([^/]*/)?libc\.a::'
>>>> /toolchains/mips-img-linux-gnu/2015.06-05/sysroot/mips-r6-hard/
>>>>
>>>> For those cases where the sysroot detection is not accurate we add a
>>>> harmless symlink necessary for certain toolchains such as Codescape for
>>>> MIPS. The other toolchains in this situation (unknown sysroot layout)
>>>> don't need this symlink to work, but as stated before, this symlink is
>>>> harmless.
>>
>> Since Codescape are supported in Buildroot as external toolchain and the issue
>> appear only with it for BE, you can probability use a
>> TOOLCHAIN_EXTERNAL_POST_INSTALL_STAGING_HOOKS like for some Linaro toolchains
>> instead ?
>>
>> Thoughts ?
> 
> Well, the whole point for this patch [1] was to get rid of that hook (which was
> the first approach when I sent the patches to add the Codescape toolchains) and
> add that functionality in the toolchain infra just in case more toolchains with
> this problem were added in the future.

I understand, let see what maintainers says.

Best regards,
Romain

> 
> 1:
> https://git.busybox.net/buildroot/commit/?id=9a1e9efe2618ebbf12ed2567bcd6e8cca5619547
> 
> 
> Maintainers, thoughts?
> 
>>>>
>>>> Signed-off-by: Vicente Olivert Riera <Vincent.Riera@imgtec.com>
>>>> ---
>>>> Changes v1 -> v2:
>>>>    - Update the comment above the copy_toolchain_sysroot function.
>>>>    - Explain in the commit log which toolchains are affected and provide
>>>>      some outputs of -print-file-name to explain the problem.
>>>>      (Both changes requested by Thomas Petazzoni)
>>>>
>>>>    toolchain/helpers.mk | 16 ++++++++++++++++
>>>>    1 file changed, 16 insertions(+)
>>>>
>>>> diff --git a/toolchain/helpers.mk b/toolchain/helpers.mk
>>>> index 70695ee..c8245f7 100644
>>>> --- a/toolchain/helpers.mk
>>>> +++ b/toolchain/helpers.mk
>>>> @@ -130,6 +130,12 @@ copy_toolchain_lib_root = \
>>>>    #
>>>>    # * Create a symbolic link
>>>>    #
>>>> +# If we are in the situation where we don't know if the sysroot layout
>>>> +# is nested of side by side, we:
>>>> +#
>>>> +# * Create a symbolic link because it's harmless and is necessary for
>>>> +#   certain toolchains like Codescape for MIPS.
>>>> +#
>>>>    # Finally, some toolchains (i.e Linaro binary toolchains) store
>>>>    # support libraries (libstdc++, libgcc_s) outside of the sysroot, so
>>>>    # we simply copy all the libraries from the "support lib directory"
>>>> @@ -160,9 +166,12 @@ copy_toolchain_sysroot = \
>>>>        done ; \
>>>>        SYSROOT_DIR_CANON=`readlink -f $${SYSROOT_DIR}` ; \
>>>>        ARCH_SYSROOT_DIR_CANON=`readlink -f $${ARCH_SYSROOT_DIR}` ; \
>>>> +    echo "SYSROOT_DIR_CANON: $${ARCH_SYSROOT_DIR_CANON}" ; \
>>
>> should be SYSROOT_DIR_CANON
> 
> Yes, that's right.
> 
> Regards,
> 
> Vincent.
> 
>> Best regards,
>> Romain
>>
>>>> +    echo "ARCH_SYSROOT_DIR_CANON: $${ARCH_SYSROOT_DIR_CANON}" ; \
>>>>        if [ $${SYSROOT_DIR_CANON} != $${ARCH_SYSROOT_DIR_CANON} ] ; then \
>>>>            relpath="./" ; \
>>>>            if [ $${ARCH_SYSROOT_DIR_CANON:0:$${\#SYSROOT_DIR_CANON}} ==
>>>> $${SYSROOT_DIR_CANON} ] ; then \
>>>> +            echo "Nested sysroots detected." ; \
>>>>                if [ ! -d $${ARCH_SYSROOT_DIR}/usr/include ] ; then \
>>>>                    cp -a $${SYSROOT_DIR}/usr/include $(STAGING_DIR)/usr ; \
>>>>                fi ; \
>>>> @@ -174,9 +183,16 @@ copy_toolchain_sysroot = \
>>>>                ln -s $${relpath} $(STAGING_DIR)/$${ARCH_SUBDIR} ; \
>>>>                echo "Symlinking $(STAGING_DIR)/$${ARCH_SUBDIR} ->
>>>> $${relpath}" ; \
>>>>            elif [ `dirname $${ARCH_SYSROOT_DIR_CANON}` == `dirname
>>>> $${SYSROOT_DIR_CANON}` ] ; then \
>>>> +            echo "Side by side sysroots detected." ; \
>>>>                ln -snf $${relpath} $(STAGING_DIR)/`basename
>>>> $${ARCH_SYSROOT_DIR_CANON}` ; \
>>>>                echo "Symlinking $(STAGING_DIR)/`basename
>>>> $${ARCH_SYSROOT_DIR_CANON}` -> $${relpath}" ; \
>>>>            fi ; \
>>>> +    else \
>>>> +        relpath="./" ; \
>>>> +        echo "Unable to detect if sysroots are nested or side by side." ; \
>>>> +        echo "Creating a harmless symlink necessary for certain
>>>> toolchains." ; \
>>>> +        ln -snf $${relpath} $(STAGING_DIR)/`basename
>>>> $${ARCH_SYSROOT_DIR_CANON}` ; \
>>>> +        echo "Symlinking $(STAGING_DIR)/`basename $${ARCH_SYSROOT_DIR_CANON}`
>>>> -> $${relpath}" ; \
>>>>        fi ; \
>>>>        if test -n "$${SUPPORT_LIB_DIR}" ; then \
>>>>            cp -a $${SUPPORT_LIB_DIR}/* $(STAGING_DIR)/lib/ ; \
>>>>
>>> _______________________________________________
>>> buildroot mailing list
>>> buildroot@busybox.net
>>> http://lists.busybox.net/mailman/listinfo/buildroot
>>
Romain Naour April 30, 2016, 7:27 p.m. UTC | #5
Hi Thomas,

Le 02/02/2016 à 16:30, Romain Naour a écrit :
> Hi Vicente,
> 
> Le 02/02/2016 16:14, Vicente Olivert Riera a écrit :
>> Hello Romain,
>>
>> On 02/02/16 15:21, Romain Naour wrote:
>>> Hi Vicente,
>>>
>>> Le 02/02/2016 11:57, Vicente Olivert Riera a écrit :
>>>> ping
>>>>
>>>> Currently Codescape MIPS toolchains are broken for big-endian. This patch fixes
>>>> the problem.
>>>>
>>>> On 22/01/16 16:05, Vicente Olivert Riera wrote:
>>>>> Sometimes is not possible to detect if the sysroots are nested or side
>>>>> by side. For instance this happens for MIPS big endian, where the
>>>>> sysroot and the arch-sysroot directories are the same. Examples:
>>>
>>> By sometime, you mean toolchains generated by Crosstool-ng and Buildroot which
>>> doesn't support multi-lib.
>>
>> Only toolchains generated by Crosstool-ng and Buildroot? Are you sure about
>> that? I think the Codescape toolchains are not generated by Crosstool-ng and
>> they do support multi-lib.
> 
> Well, I checked with two of the autobuilder toolchains:
> 
> http://autobuild.buildroot.org/toolchains/tarballs/br-arm-cortex-a9-musl-2015.11-rc1-71-g90d1299.tar.bz2
> 
> http://autobuild.buildroot.org/toolchains/tarballs/i686-ctng-linux-gnu.tar.xz
> 
> And I get this:
> 
> SYSROOT_DIR_CANON:
> /home/naourr/git/buildroot/test/musl/host/opt/ext-toolchain/arm-buildroot-linux-musleabihf/sysroot
> ARCH_SYSROOT_DIR_CANON:
> /home/naourr/git/buildroot/test/musl/host/opt/ext-toolchain/arm-buildroot-linux-musleabihf/sysroot
> 
> Unable to detect if sysroots are nested or side by side.
> Creating a harmless symlink necessary for certain toolchains.
> Symlinking
> /home/naourr/git/buildroot/test/musl/host/usr/arm-buildroot-linux-musleabihf/sysroot/sysroot
> -> ./
> 
> 
>>
>>>>>
>>>>> === Mentor Sourcery CodeBench toolchain
>>>>>
>>>>> $ readlink -f $(LANG=C mips-linux-gnu-gcc -print-file-name=libc.a) | sed
>>>>> -r -e 's:(usr/)?lib(32|64)?([^/]*)?/([^/]*/)?libc\.a::'
>>>>> /toolchains/mips-2015.11/mips-linux-gnu/libc/
>>>>>
>>>>> $ readlink -f $(LANG=C mips-linux-gnu-gcc -EB -print-file-name=libc.a) |
>>>>> sed -r -e 's:(usr/)?lib(32|64)?([^/]*)?/([^/]*/)?libc\.a::'
>>>>> /toolchains/mips-2015.11/mips-linux-gnu/libc/
>>>>>
>>>>> === Codescape toolchain
>>>>>
>>>>> $ readlink -f $(LANG=C mips-img-linux-gnu-gcc -print-file-name=libc.a) |
>>>>> sed -r -e 's:(usr/)?lib(32|64)?([^/]*)?/([^/]*/)?libc\.a::'
>>>>> /toolchains/mips-img-linux-gnu/2015.06-05/sysroot/mips-r6-hard/
>>>>>
>>>>> $ readlink -f $(LANG=C mips-img-linux-gnu-gcc -EB
>>>>> -print-file-name=libc.a) | sed -r -e
>>>>> 's:(usr/)?lib(32|64)?([^/]*)?/([^/]*/)?libc\.a::'
>>>>> /toolchains/mips-img-linux-gnu/2015.06-05/sysroot/mips-r6-hard/
>>>>>
>>>>> For those cases where the sysroot detection is not accurate we add a
>>>>> harmless symlink necessary for certain toolchains such as Codescape for
>>>>> MIPS. The other toolchains in this situation (unknown sysroot layout)
>>>>> don't need this symlink to work, but as stated before, this symlink is
>>>>> harmless.
>>>
>>> Since Codescape are supported in Buildroot as external toolchain and the issue
>>> appear only with it for BE, you can probability use a
>>> TOOLCHAIN_EXTERNAL_POST_INSTALL_STAGING_HOOKS like for some Linaro toolchains
>>> instead ?
>>>
>>> Thoughts ?
>>
>> Well, the whole point for this patch [1] was to get rid of that hook (which was
>> the first approach when I sent the patches to add the Codescape toolchains) and
>> add that functionality in the toolchain infra just in case more toolchains with
>> this problem were added in the future.
> 
> I understand, let see what maintainers says.

Like for CodeSourcery AArch64 toolchain recently [1], what about adding a
post-install hook instead ?

[1]
https://git.busybox.net/buildroot/commit/?id=4d39ca1c2ab19766abf0430abe9b65ba0e16602b

Best regards,
Romain

> 
> Best regards,
> Romain
> 
>>
>> 1:
>> https://git.busybox.net/buildroot/commit/?id=9a1e9efe2618ebbf12ed2567bcd6e8cca5619547
>>
>>
>> Maintainers, thoughts?
>>
>>>>>
>>>>> Signed-off-by: Vicente Olivert Riera <Vincent.Riera@imgtec.com>
>>>>> ---
>>>>> Changes v1 -> v2:
>>>>>    - Update the comment above the copy_toolchain_sysroot function.
>>>>>    - Explain in the commit log which toolchains are affected and provide
>>>>>      some outputs of -print-file-name to explain the problem.
>>>>>      (Both changes requested by Thomas Petazzoni)
>>>>>
Thomas Petazzoni May 1, 2016, 11:59 a.m. UTC | #6
Hello,

On Sat, 30 Apr 2016 21:27:33 +0200, Romain Naour wrote:

> >> Well, the whole point for this patch [1] was to get rid of that hook (which was
> >> the first approach when I sent the patches to add the Codescape toolchains) and
> >> add that functionality in the toolchain infra just in case more toolchains with
> >> this problem were added in the future.  
> > 
> > I understand, let see what maintainers says.  
> 
> Like for CodeSourcery AArch64 toolchain recently [1], what about adding a
> post-install hook instead ?
> 
> [1]
> https://git.busybox.net/buildroot/commit/?id=4d39ca1c2ab19766abf0430abe9b65ba0e16602b

Yeah, I don't know. There's a trade-off here:

 - By having the logic in the common external toolchain logic, it's
   usually more complicated, but at least it works for "custom"
   external toolchains as well.
  
 - By having a custom logic only for this toolchain, it's usually much
   simpler, but it doesn't work for custom external toolchains.

Not easy to decide which approach is the most appropriate.

Thomas
diff mbox

Patch

=== Mentor Sourcery CodeBench toolchain

$ readlink -f $(LANG=C mips-linux-gnu-gcc -print-file-name=libc.a) | sed
-r -e 's:(usr/)?lib(32|64)?([^/]*)?/([^/]*/)?libc\.a::'
/toolchains/mips-2015.11/mips-linux-gnu/libc/

$ readlink -f $(LANG=C mips-linux-gnu-gcc -EB -print-file-name=libc.a) |
sed -r -e 's:(usr/)?lib(32|64)?([^/]*)?/([^/]*/)?libc\.a::'
/toolchains/mips-2015.11/mips-linux-gnu/libc/

=== Codescape toolchain

$ readlink -f $(LANG=C mips-img-linux-gnu-gcc -print-file-name=libc.a) |
sed -r -e 's:(usr/)?lib(32|64)?([^/]*)?/([^/]*/)?libc\.a::'
/toolchains/mips-img-linux-gnu/2015.06-05/sysroot/mips-r6-hard/

$ readlink -f $(LANG=C mips-img-linux-gnu-gcc -EB
-print-file-name=libc.a) | sed -r -e
's:(usr/)?lib(32|64)?([^/]*)?/([^/]*/)?libc\.a::'
/toolchains/mips-img-linux-gnu/2015.06-05/sysroot/mips-r6-hard/

For those cases where the sysroot detection is not accurate we add a
harmless symlink necessary for certain toolchains such as Codescape for
MIPS. The other toolchains in this situation (unknown sysroot layout)
don't need this symlink to work, but as stated before, this symlink is
harmless.

Signed-off-by: Vicente Olivert Riera <Vincent.Riera@imgtec.com>
---
Changes v1 -> v2:
 - Update the comment above the copy_toolchain_sysroot function.
 - Explain in the commit log which toolchains are affected and provide
   some outputs of -print-file-name to explain the problem.
   (Both changes requested by Thomas Petazzoni)

 toolchain/helpers.mk | 16 ++++++++++++++++
 1 file changed, 16 insertions(+)

diff --git a/toolchain/helpers.mk b/toolchain/helpers.mk
index 70695ee..c8245f7 100644
--- a/toolchain/helpers.mk
+++ b/toolchain/helpers.mk
@@ -130,6 +130,12 @@  copy_toolchain_lib_root = \
 #
 # * Create a symbolic link
 #
+# If we are in the situation where we don't know if the sysroot layout
+# is nested of side by side, we:
+#
+# * Create a symbolic link because it's harmless and is necessary for
+#   certain toolchains like Codescape for MIPS.
+#
 # Finally, some toolchains (i.e Linaro binary toolchains) store
 # support libraries (libstdc++, libgcc_s) outside of the sysroot, so
 # we simply copy all the libraries from the "support lib directory"
@@ -160,9 +166,12 @@  copy_toolchain_sysroot = \
 	done ; \
 	SYSROOT_DIR_CANON=`readlink -f $${SYSROOT_DIR}` ; \
 	ARCH_SYSROOT_DIR_CANON=`readlink -f $${ARCH_SYSROOT_DIR}` ; \
+	echo "SYSROOT_DIR_CANON: $${ARCH_SYSROOT_DIR_CANON}" ; \
+	echo "ARCH_SYSROOT_DIR_CANON: $${ARCH_SYSROOT_DIR_CANON}" ; \
 	if [ $${SYSROOT_DIR_CANON} != $${ARCH_SYSROOT_DIR_CANON} ] ; then \
 		relpath="./" ; \
 		if [ $${ARCH_SYSROOT_DIR_CANON:0:$${\#SYSROOT_DIR_CANON}} == $${SYSROOT_DIR_CANON} ] ; then \
+			echo "Nested sysroots detected." ; \
 			if [ ! -d $${ARCH_SYSROOT_DIR}/usr/include ] ; then \
 				cp -a $${SYSROOT_DIR}/usr/include $(STAGING_DIR)/usr ; \
 			fi ; \
@@ -174,9 +183,16 @@  copy_toolchain_sysroot = \
 			ln -s $${relpath} $(STAGING_DIR)/$${ARCH_SUBDIR} ; \
 			echo "Symlinking $(STAGING_DIR)/$${ARCH_SUBDIR} -> $${relpath}" ; \
 		elif [ `dirname $${ARCH_SYSROOT_DIR_CANON}` == `dirname $${SYSROOT_DIR_CANON}` ] ; then \
+			echo "Side by side sysroots detected." ; \
 			ln -snf $${relpath} $(STAGING_DIR)/`basename $${ARCH_SYSROOT_DIR_CANON}` ; \
 			echo "Symlinking $(STAGING_DIR)/`basename $${ARCH_SYSROOT_DIR_CANON}` -> $${relpath}" ; \
 		fi ; \
+	else \
+		relpath="./" ; \
+		echo "Unable to detect if sysroots are nested or side by side." ; \
+		echo "Creating a harmless symlink necessary for certain toolchains." ; \
+		ln -snf $${relpath} $(STAGING_DIR)/`basename $${ARCH_SYSROOT_DIR_CANON}` ; \
+		echo "Symlinking $(STAGING_DIR)/`basename $${ARCH_SYSROOT_DIR_CANON}` -> $${relpath}" ; \
 	fi ; \
 	if test -n "$${SUPPORT_LIB_DIR}" ; then \
 		cp -a $${SUPPORT_LIB_DIR}/* $(STAGING_DIR)/lib/ ; \