Message ID | 1453475155-49586-1-git-send-email-Vincent.Riera@imgtec.com |
---|---|
State | Superseded |
Headers | show |
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/ ; \ >
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
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 >
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 >>
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) >>>>>
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
=== 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/ ; \