buildman: using wrong libgcc.a

Message ID 5452A2A6.5000601@broadcom.com
State New
Headers show

Commit Message

Steve Rae Oct. 30, 2014, 8:42 p.m.
Hmmmm -- maybe it would be better to specify the entire path for the 
CROSS_COMPILE, and not rely on the PATH to find the cross compile tools:


On 14-10-30 09:57 AM, Steve Rae wrote:
> Hi Simon,
>
> In my environment, buildman and MAKEALL are not producing the same results.
>
> It seems that buildman is accidentally picking up the wrong libgcc.a ...
>
>
> *** buildman ***
>
> $ cat ~/.buildman
> [toolchain]
> eldk:
> /opt/eldk-5.4/armv7a/sysroots/i686-eldk-linux/usr/bin/armv7a-vfp-neon-linux-gnueabi
>
>
> [toolchain-alias]
> $
>
>
> $ tools/buildman/buildman --list-tool-chains
> No section: 'make-flags'
> Scanning for tool chains
>     - scanning path
> '/opt/eldk-5.4/armv7a/sysroots/i686-eldk-linux/usr/bin/armv7a-vfp-neon-linux-gnueabi'
>
>        - looking in
> '/opt/eldk-5.4/armv7a/sysroots/i686-eldk-linux/usr/bin/armv7a-vfp-neon-linux-gnueabi/.'
>
>           - found
> '/opt/eldk-5.4/armv7a/sysroots/i686-eldk-linux/usr/bin/armv7a-vfp-neon-linux-gnueabi/./armv7a-gcc'
>
> Tool chain test:  OK
>           - found
> '/opt/eldk-5.4/armv7a/sysroots/i686-eldk-linux/usr/bin/armv7a-vfp-neon-linux-gnueabi/./arm-linux-gnueabi-gcc'
>
> Tool chain test:  OK
>        - looking in
> '/opt/eldk-5.4/armv7a/sysroots/i686-eldk-linux/usr/bin/armv7a-vfp-neon-linux-gnueabi/bin'
>
>        - looking in
> '/opt/eldk-5.4/armv7a/sysroots/i686-eldk-linux/usr/bin/armv7a-vfp-neon-linux-gnueabi/usr/bin'
>
> List of available toolchains (2):
> arm       :
> /opt/eldk-5.4/armv7a/sysroots/i686-eldk-linux/usr/bin/armv7a-vfp-neon-linux-gnueabi/./arm-linux-gnueabi-gcc
>
> armv7a    :
> /opt/eldk-5.4/armv7a/sysroots/i686-eldk-linux/usr/bin/armv7a-vfp-neon-linux-gnueabi/./armv7a-gcc
>
> $
>
>
> $ tools/buildman/buildman bcm28155_ap -x bcm28155_w1d -fk
> No section: 'make-flags'
> WARNING: no status info for 'Ippo_q8h'
> WARNING: no maintainers for 'Ippo_q8h'
> Building current source for 1 boards (1 thread, 8 jobs per thread)
>      1    0    0 /1      bcm28155_ap
> $
>
>
> $ head -14 ../current/current/bcm28155_ap/u-boot.map
> Archive member included because of file (symbol)
>
> /usr/lib/gcc/arm-linux-gnueabi/4.6/libgcc.a(_udivsi3.o)
>                                arch/arm/cpu/armv7/bcm281xx/built-in.o
> (__aeabi_uidiv)
> /usr/lib/gcc/arm-linux-gnueabi/4.6/libgcc.a(_divsi3.o)
>                                common/built-in.o (__aeabi_idiv)
> /usr/lib/gcc/arm-linux-gnueabi/4.6/libgcc.a(_lshrdi3.o)
>                                lib/built-in.o (__aeabi_llsr)
> /usr/lib/gcc/arm-linux-gnueabi/4.6/libgcc.a(_ashldi3.o)
>                                drivers/mmc/built-in.o (__aeabi_llsl)
> /usr/lib/gcc/arm-linux-gnueabi/4.6/libgcc.a(_dvmd_lnx.o)
>
> /usr/lib/gcc/arm-linux-gnueabi/4.6/libgcc.a(_udivsi3.o) (__aeabi_idiv0)
>
> Discarded input sections
> $
>
>
> *** MAKEALL ***
>
> $
> CROSS_COMPILE_ARM=/opt/eldk-5.4/armv7a/sysroots/i686-eldk-linux/usr/bin/armv7a-vfp-neon-linux-gnueabi/arm-linux-gnueabi-
> ./MAKEALL -b bcm28155_ap
> $
>
>
> $ head -14 u-boot.map
> Archive member included because of file (symbol)
>
> /opt/eldk-5.4/armv7a/sysroots/armv7a-vfp-neon-linux-gnueabi/usr/lib/arm-linux-gnueabi/4.7.2/libgcc.a(_udivsi3.o)
>
>                                arch/arm/cpu/armv7/bcm281xx/built-in.o
> (__aeabi_uidiv)
> /opt/eldk-5.4/armv7a/sysroots/armv7a-vfp-neon-linux-gnueabi/usr/lib/arm-linux-gnueabi/4.7.2/libgcc.a(_divsi3.o)
>
>                                common/built-in.o (__aeabi_idiv)
> /opt/eldk-5.4/armv7a/sysroots/armv7a-vfp-neon-linux-gnueabi/usr/lib/arm-linux-gnueabi/4.7.2/libgcc.a(_lshrdi3.o)
>
>                                lib/built-in.o (__aeabi_llsr)
> /opt/eldk-5.4/armv7a/sysroots/armv7a-vfp-neon-linux-gnueabi/usr/lib/arm-linux-gnueabi/4.7.2/libgcc.a(_ashldi3.o)
>
>                                drivers/mmc/built-in.o (__aeabi_llsl)
> /opt/eldk-5.4/armv7a/sysroots/armv7a-vfp-neon-linux-gnueabi/usr/lib/arm-linux-gnueabi/4.7.2/libgcc.a(_dvmd_lnx.o)
>
>
> /opt/eldk-5.4/armv7a/sysroots/armv7a-vfp-neon-linux-gnueabi/usr/lib/arm-linux-gnueabi/4.7.2/libgcc.a(_udivsi3.o)
> (__aeabi_idiv0)
>
> Discarded input sections
> $

Comments

Jeroen Hofstee Oct. 30, 2014, 8:57 p.m. | #1
Hello Steve,

On 30-10-14 21:42, Steve Rae wrote:
> Hmmmm -- maybe it would be better to specify the entire path for the 
> CROSS_COMPILE, and not rely on the PATH to find the cross compile tools:
>
> diff --git a/tools/buildman/toolchain.py b/tools/buildman/toolchain.py
> index 27dc318..58c7b1f 100644
> --- a/tools/buildman/toolchain.py
> +++ b/tools/buildman/toolchain.py
> @@ -33,6 +33,7 @@ class Toolchain:
>          self.cross = os.path.basename(fname)[:-3]
>          pos = self.cross.find('-')
>          self.arch = self.cross[:pos] if pos != -1 else 'sandbox'
> +        self.cross = fname[:-3]
>

A bit off topic, but is it possible to stop adding these magic 3
constants. strlen("clang") != 3. strlen("cc") isn't either. Anyway
I am aware buildman is already full with it, so I am fine with
one more (for now).

Regards,
Jeroen
Simon Glass Nov. 3, 2014, 9:14 p.m. | #2
Hi,

On 30 October 2014 14:57, Jeroen Hofstee <jeroen@myspectrum.nl> wrote:
> Hello Steve,
>
> On 30-10-14 21:42, Steve Rae wrote:
>>
>> Hmmmm -- maybe it would be better to specify the entire path for the
>> CROSS_COMPILE, and not rely on the PATH to find the cross compile tools:
>>
>> diff --git a/tools/buildman/toolchain.py b/tools/buildman/toolchain.py
>> index 27dc318..58c7b1f 100644
>> --- a/tools/buildman/toolchain.py
>> +++ b/tools/buildman/toolchain.py
>> @@ -33,6 +33,7 @@ class Toolchain:
>>          self.cross = os.path.basename(fname)[:-3]
>>          pos = self.cross.find('-')
>>          self.arch = self.cross[:pos] if pos != -1 else 'sandbox'
>> +        self.cross = fname[:-3]
>>
>
> A bit off topic, but is it possible to stop adding these magic 3
> constants. strlen("clang") != 3. strlen("cc") isn't either. Anyway
> I am aware buildman is already full with it, so I am fine with
> one more (for now).

This should be isolated to Toolchain. I'd be happy to have a fix that
solves this once and for all. What is needed?

Regards,
Simon
Jeroen Hofstee Nov. 5, 2014, 6:46 p.m. | #3
Hello Simon,

On 03-11-14 22:14, Simon Glass wrote:
> Hi,
>
> On 30 October 2014 14:57, Jeroen Hofstee <jeroen@myspectrum.nl> wrote:
>> Hello Steve,
>>
>> On 30-10-14 21:42, Steve Rae wrote:
>>> Hmmmm -- maybe it would be better to specify the entire path for the
>>> CROSS_COMPILE, and not rely on the PATH to find the cross compile tools:
>>>
>>> diff --git a/tools/buildman/toolchain.py b/tools/buildman/toolchain.py
>>> index 27dc318..58c7b1f 100644
>>> --- a/tools/buildman/toolchain.py
>>> +++ b/tools/buildman/toolchain.py
>>> @@ -33,6 +33,7 @@ class Toolchain:
>>>           self.cross = os.path.basename(fname)[:-3]
>>>           pos = self.cross.find('-')
>>>           self.arch = self.cross[:pos] if pos != -1 else 'sandbox'
>>> +        self.cross = fname[:-3]
>>>
>> A bit off topic, but is it possible to stop adding these magic 3
>> constants. strlen("clang") != 3. strlen("cc") isn't either. Anyway
>> I am aware buildman is already full with it, so I am fine with
>> one more (for now).
> This should be isolated to Toolchain. I'd be happy to have a fix that
> solves this once and for all. What is needed?

not that much I think. What would be needed is to store the compiler
name in the toolchain object and use the python strlen equivalent on
that instead of the hardcoded threes. And eventually pass the correct
values to CC and HOSTCC.

When I tried that, subprocess was barfing some (at least for me not
easily, [no I don't recall which one exactly] explainable) error, so I gave
up and created a script called *-gcc invoking clang and all was fine 
again ;)

So yes, it would be nice if buildman did not make such an assumption.
It is not strictly clang related as well, at least on FreeBSD you can 
install
many gcc compilers, which will be named gcc44, gcc45.. gcc5 etc.

As already mentioned, it is not related to this patch, it adds just another
hardcoded magic 3 value.

Regards,
Jeroen
Steve Rae Nov. 5, 2014, 7:05 p.m. | #4
On 14-11-05 10:46 AM, Jeroen Hofstee wrote:
> Hello Simon,
>
> On 03-11-14 22:14, Simon Glass wrote:
>> Hi,
>>
>> On 30 October 2014 14:57, Jeroen Hofstee <jeroen@myspectrum.nl> wrote:
>>> Hello Steve,
>>>
>>> On 30-10-14 21:42, Steve Rae wrote:
>>>> Hmmmm -- maybe it would be better to specify the entire path for the
>>>> CROSS_COMPILE, and not rely on the PATH to find the cross compile
>>>> tools:
>>>>
>>>> diff --git a/tools/buildman/toolchain.py b/tools/buildman/toolchain.py
>>>> index 27dc318..58c7b1f 100644
>>>> --- a/tools/buildman/toolchain.py
>>>> +++ b/tools/buildman/toolchain.py
>>>> @@ -33,6 +33,7 @@ class Toolchain:
>>>>           self.cross = os.path.basename(fname)[:-3]
>>>>           pos = self.cross.find('-')
>>>>           self.arch = self.cross[:pos] if pos != -1 else 'sandbox'
>>>> +        self.cross = fname[:-3]
>>>>
>>> A bit off topic, but is it possible to stop adding these magic 3
>>> constants. strlen("clang") != 3. strlen("cc") isn't either. Anyway
>>> I am aware buildman is already full with it, so I am fine with
>>> one more (for now).
>> This should be isolated to Toolchain. I'd be happy to have a fix that
>> solves this once and for all. What is needed?
>
> not that much I think. What would be needed is to store the compiler
> name in the toolchain object and use the python strlen equivalent on
> that instead of the hardcoded threes. And eventually pass the correct
> values to CC and HOSTCC.
>
> When I tried that, subprocess was barfing some (at least for me not
> easily, [no I don't recall which one exactly] explainable) error, so I gave
> up and created a script called *-gcc invoking clang and all was fine
> again ;)
>
> So yes, it would be nice if buildman did not make such an assumption.
> It is not strictly clang related as well, at least on FreeBSD you can
> install
> many gcc compilers, which will be named gcc44, gcc45.. gcc5 etc.
>
> As already mentioned, it is not related to this patch, it adds just another
> hardcoded magic 3 value.
>
> Regards,
> Jeroen
( updated the subject line for this discussion topic... )
In my experience, we would normally set the CROSS_COMPILE variable to 
the "prefix" of the cross compiler toolchain, for example:
 
CROSS_COMPILE=/opt/eldk-5.4/armv7a/sysroots/i686-eldk-linux/usr/bin/armv7a-vfp-neon-linux-gnueabi/arm-linux-gnueabi-
Perhaps if the "~/.buildman" defined these "prefixes" (rather than 
"directories"), then maybe it would be more consistent and simpler....
[ and I suspect that this magic "-3" would go away; isn't this "-3" 
because we need to strip "gcc" off the end of the string ?!?!?! ]
Thanks, Steve
Wolfgang Denk Nov. 5, 2014, 7:09 p.m. | #5
Dear Steve,

In message <545A74E6.5010208@broadcom.com> you wrote:
> 
> In my experience, we would normally set the CROSS_COMPILE variable to 
> the "prefix" of the cross compiler toolchain, for example:
>  
> CROSS_COMPILE=/opt/eldk-5.4/armv7a/sysroots/i686-eldk-linux/usr/bin/armv7a-vfp-neon-linux-gnueabi/arm-linux-gnueabi-

Actually we should have only

	CROSS_COMPILE=arm-linux-gnueabi-

and make the PATH take care of where to pick the tools from.

Best regards,

Wolfgang Denk
Steve Rae Nov. 5, 2014, 7:36 p.m. | #6
On 14-11-05 11:09 AM, Wolfgang Denk wrote:
> Dear Steve,
>
> In message <545A74E6.5010208@broadcom.com> you wrote:
>>
>> In my experience, we would normally set the CROSS_COMPILE variable to
>> the "prefix" of the cross compiler toolchain, for example:
>>
>> CROSS_COMPILE=/opt/eldk-5.4/armv7a/sysroots/i686-eldk-linux/usr/bin/armv7a-vfp-neon-linux-gnueabi/arm-linux-gnueabi-
>
> Actually we should have only
>
> 	CROSS_COMPILE=arm-linux-gnueabi-
>
> and make the PATH take care of where to pick the tools from.
>
> Best regards,
>
> Wolfgang Denk
>
Actually, that would be unfortunate, because I currently have:
- /usr/bin/arm-linux-gnueabi-gcc
- 
/opt/eldk-5.4/armv7a/sysroots/i686-eldk-linux/usr/bin/armv7a-vfp-neon-linux-gnueabi/arm-linux-gnueabi-gcc
- (and others)
installed on my machine....
If $PATH" was to "take care of it", then somehow $PATH would need to be 
constantly "rearranged" so that the desired compiler is selected correctly.
IMO it would be best to specify the "absolute path to the prefix" 
completely, and not rely on PATH at all!
Thanks, Steve
Wolfgang Denk Nov. 5, 2014, 10:59 p.m. | #7
Dear Steve,

In message <545A7C54.30204@broadcom.com> you wrote:
> 
> Actually, that would be unfortunate, because I currently have:
> - /usr/bin/arm-linux-gnueabi-gcc
> - 
> /opt/eldk-5.4/armv7a/sysroots/i686-eldk-linux/usr/bin/armv7a-vfp-neon-linux-gnueabi/arm-linux-gnueabi-gcc
> - (and others)
> installed on my machine....

This is pretty normal.

> If $PATH" was to "take care of it", then somehow $PATH would need to be 
> constantly "rearranged" so that the desired compiler is selected correctly.

Yes, this is what is supposed to happen, for a variety of reasons.
Often you select not only the compilers, but more o tools from a
specific "SDK" that way.

Usually there will be scripts that do all this for you; with ELDK,
that would be "eldk-switch".

> IMO it would be best to specify the "absolute path to the prefix" 
> completely, and not rely on PATH at all!

No, this is bound to fail.

Best regards,

Wolfgang Denk

Patch

diff --git a/tools/buildman/toolchain.py b/tools/buildman/toolchain.py
index 27dc318..58c7b1f 100644
--- a/tools/buildman/toolchain.py
+++ b/tools/buildman/toolchain.py
@@ -33,6 +33,7 @@  class Toolchain:
          self.cross = os.path.basename(fname)[:-3]
          pos = self.cross.find('-')
          self.arch = self.cross[:pos] if pos != -1 else 'sandbox'
+        self.cross = fname[:-3]

          env = self.MakeEnvironment()

@@ -82,7 +83,6 @@  class Toolchain:
          """
          env = dict(os.environ)
          env['CROSS_COMPILE'] = self.cross
-        env['PATH'] += (':' + self.path)
          return env