[OE-core] [oe-core][patch v2] sanity.bbclass: correct the gcc_arch check logic

Randy MacLeod randy.macleod at windriver.com
Wed Jun 26 22:16:38 UTC 2013


On 13-06-19 11:28 PM, Luo Zhenhua-B19537 wrote:
> Ping.
>
>> -----Original Message-----
>> From: Luo Zhenhua-B19537
>> Sent: Tuesday, June 18, 2013 9:26 PM
>> To: 'Richard Purdie'; Randy MacLeod
>> Cc: openembedded-core at lists.openembedded.org; Yu Zongchun-B40527
>> Subject: RE: [OE-core] [oe-core][patch v2] sanity.bbclass: correct the
>> gcc_arch check logic
>>
>> Hi Randy,
>>
>> During the test on my machine with gcc-4.1.2, if -march=native is not
>> supported by host gcc, a non-zero value(256) returns, otherwise 0 returns.
>>
>> [LOG]
>> status is 256
>> result is gcc_test.c:1: error: bad value (native) for -march= switch
>> gcc_test.c:1: error: bad value (native) for -mtune= switch
>>
>> Please confirm if this is same as your result.

Yes it's essentially the same.

Mark decided that the previous test program that
checked for the existence of:
    __GCC_HAVE_SYNC_COMPARE_AND_SWAP_4
would be better done as a check for:
    __sync_bool_compare_and_swap
I believe he got the idea from looking at glib's configure script.

I'm working on properly checking on which value to give to march:
native,i686,x86-64. More tomorrow.

// Randy

Test results and prelim code if you are interested.


Here's how that test behaves with the old toolchain:

### What's the host setup?

$ gcc --version
gcc (GCC) 4.1.2 20080704 (Red Hat 4.1.2-54)
Copyright (C) 2006 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

$ head -1 /etc/issue
CentOS release 5.9 (Final)


### Old test and results: All options fail, returning a status of 1.

$ gcc  -o /tmp/jj /tmp/gcc-jj.c
/tmp/gcc-jj.c: In function ‘main’:
/tmp/gcc-jj.c:1: error: ‘__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4’ undeclared 
(first use in this function)
/tmp/gcc-jj.c:1: error: (Each undeclared identifier is reported only once
/tmp/gcc-jj.c:1: error: for each function it appears in.)

$ echo $?
1


$ gcc -march=native -o /tmp/jj /tmp/gcc-jj.c
/tmp/gcc-jj.c:1: error: bad value (native) for -march= switch
/tmp/gcc-jj.c:1: error: bad value (native) for -mtune= switch
$ echo $?
1

$ gcc -march=i686 -o /tmp/jj /tmp/gcc-jj.c
/tmp/gcc-jj.c: In function ‘main’:
/tmp/gcc-jj.c:1: error: ‘__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4’ undeclared 
(first use in this function)
/tmp/gcc-jj.c:1: error: (Each undeclared identifier is reported only once
/tmp/gcc-jj.c:1: error: for each function it appears in.)
$ echo $?
1




### New test and results: -march=`mangle uname -m` works.

$ cat /tmp/gcc_test.c
int main (){ volatile int atomic = 2; __sync_bool_compare_and_swap 
(&atomic, 2, 3); return 0;}


$ gcc -o /tmp/jj /tmp/gcc_test.c
/tmp/ccEVX7IX.o: In function `main':
gcc_test.c:(.text+0x2f): undefined reference to 
`__sync_bool_compare_and_swap_4'
collect2: ld returned 1 exit status
$ echo $?
1

$ gcc -march=native -o /tmp/jj /tmp/gcc_test.c
/tmp/gcc_test.c:1: error: bad value (native) for -march= switch
/tmp/gcc_test.c:1: error: bad value (native) for -mtune= switch
$ echo $?
1

$ uname -m
i686

$ gcc -march=i686 -o /tmp/jj /tmp/gcc_test.c
rmacleod at yow-lpggp1 .../wrs/b/snty  $ echo $?
0

So you see that -march=native isn't useful for gcc-4.1.2 but
-march=`munged uname -m` is.


I'm in the middle of writing a more complete test but
my lack of python development is showing:


-# Checks if necessary to add option march to host gcc
+# Checks if necessary to add march option to host gcc
  def check_gcc_march(sanity_data):
-    result = False
+    result = ""

      # Check if -march not in BUILD_CFLAGS
      if sanity_data.getVar("BUILD_CFLAGS",True).find("-march") < 0:
@@ -293,12 +293,22 @@ def check_gcc_march(sanity_data):
          # Check if GCC could work without march
          status,result = oe.utils.getstatusoutput("${BUILD_PREFIX}gcc 
gcc_test.c -o gcc_test")
          if status != 0:
-            # Check if GCC could work with march
+            # Check if GCC could work with march=native
              status,result = 
oe.utils.getstatusoutput("${BUILD_PREFIX}gcc -march=native gcc_test.c -o 
gcc_test")
-            if status != 0:
-                result = True
+            if status == 0:
+                result = "native"
              else:
-                result = False
+                # Check if GCC could work with march=i686
+                status,result = 
oe.utils.getstatusoutput("${BUILD_PREFIX}gcc -march=x86-64 gcc_test.c -o 
gcc_test")
+                if status == 0:
+                    result = "x86-64"
+                else:
+                    # Check if GCC could work with march=i686
+                    status,result = 
oe.utils.getstatusoutput("${BUILD_PREFIX}gcc -march=i686 gcc_test.c -o 
gcc_test")
+                    if status == 0:
+                        result = "i686"
+                    else:
+                        result = "none"


...

-    if check_gcc_march(d):
-        status.addresult("Your gcc version is older than 4.5, please 
add the following param to local.conf\n \
-        BUILD_CFLAGS_append = \" -march=native\"\n")
+    gcc_march_option = check_gcc_march(d)
+    if gcc_march_option != "":
+        if gcc_march_option == "none":
+            status.addresult("Your gcc version is too old.\n \
+        else:
+            status.addresult("Your gcc version is older than 4.5, 
please add the following param to local.conf\n \
+                   BUILD_CFLAGS_append = \" -march=%s\"\n", 
gcc_march_option)



I'll clean this up to actually work and probably use
${BUILD_ARCH} instead of i686/x86-64.

More tomorrow.

// Randy

>>
>>
>> Best Regards,
>>
>> Zhenhua
>>
>>
>>> -----Original Message-----
>>> From: Richard Purdie [mailto:richard.purdie at linuxfoundation.org]
>>> Sent: Tuesday, June 18, 2013 9:04 PM
>>> To: Luo Zhenhua-B19537; Randy MacLeod
>>> Cc: openembedded-core at lists.openembedded.org; Yu Zongchun-B40527
>>> Subject: Re: [OE-core] [oe-core][patch v2] sanity.bbclass: correct the
>>> gcc_arch check logic
>>>
>>> On Tue, 2013-06-18 at 21:08 +0800, Zhenhua Luo wrote:
>>>> The gcc arch check result is incorrect when gcc version is older
>>>> than
>>> 4.5.
>>>> Sanity checker requests user to add "-march=native" into
>>>> BUILD_CFLAGS even if the flag is not supported by host gcc.
>>>>
>>>> The status is 0 when -march=native is supported by host gcc, so set
>>>> result to True, otherwise set result to False.
>>>>
>>>> Signed-off-by: Zhenhua Luo <zhenhua.luo at freescale.com>
>>>> ---
>>>>   meta/classes/sanity.bbclass |    2 +-
>>>>   1 file changed, 1 insertion(+), 1 deletion(-)
>>>>
>>>> diff --git a/meta/classes/sanity.bbclass
>>>> b/meta/classes/sanity.bbclass index 3b9934b..ee09679 100644
>>>> --- a/meta/classes/sanity.bbclass
>>>> +++ b/meta/classes/sanity.bbclass
>>>> @@ -325,7 +325,7 @@ def check_gcc_march(sanity_data):
>>>>           if status != 0:
>>>>               # Check if GCC could work with march
>>>>               status,result =
>>> oe.utils.getstatusoutput("${BUILD_PREFIX}gcc -march=native gcc_test.c
>>> -o
>>> gcc_test")
>>>> -            if status != 0:
>>>> +            if status == 0:
>>>>                   result = True
>>>>               else:
>>>>                   result = False
>>>
>>> Can you and Randy please sort out what the correct value is here please.
>>> This appears to directly revert
>>> http://git.yoctoproject.org/cgit.cgi/poky/commit/?id=ad276d7d89190c57a
>>> 152
>>> 867d7278ee18f784ff2c
>>>
>>> Cheers,
>>>
>>> Richard
>>>
>>>
>


-- 
# Randy MacLeod. SMTS, Linux, Wind River
Direct: 613.963.1350



More information about the Openembedded-core mailing list