Patchwork base.bbclass: Fix matching of SOC_FAMILY in COMPATIBLE_MACHINE

login
register
mail settings
Submitter Otavio Salvador
Date April 6, 2013, 5:17 p.m.
Message ID <1365268668-15483-1-git-send-email-otavio@ossystems.com.br>
Download mbox | patch
Permalink /patch/47583/
State New
Headers show

Comments

Otavio Salvador - April 6, 2013, 5:17 p.m.
When a SOC_FAMILY has more than one value, split by ':' as usual
OVERRIDES, this were not being properly checked in COMPATIBLE_MACHINE
matching as we need to iterate over each SoC family and check if it is
compatible or not.

Signed-off-by: Otavio Salvador <otavio@ossystems.com.br>
---
 meta/classes/base.bbclass | 12 +++++++-----
 1 file changed, 7 insertions(+), 5 deletions(-)
Eric BENARD - April 6, 2013, 6:02 p.m.
Hi Otavio,

Le Sat,  6 Apr 2013 14:17:48 -0300,
Otavio Salvador <otavio@ossystems.com.br> a écrit :

> When a SOC_FAMILY has more than one value, split by ':' as usual
> OVERRIDES, this were not being properly checked in COMPATIBLE_MACHINE
> matching as we need to iterate over each SoC family and check if it is
> compatible or not.
> 
> Signed-off-by: Otavio Salvador <otavio@ossystems.com.br>
> ---
>  meta/classes/base.bbclass | 12 +++++++-----
>  1 file changed, 7 insertions(+), 5 deletions(-)
> 
> diff --git a/meta/classes/base.bbclass b/meta/classes/base.bbclass
> index abd6a52..6f24064 100644
> --- a/meta/classes/base.bbclass
> +++ b/meta/classes/base.bbclass
> @@ -515,11 +515,13 @@ python () {
>          need_machine = d.getVar('COMPATIBLE_MACHINE', True)
>          if need_machine:
>              import re
> -            this_machine = d.getVar('MACHINE', True)
> -            if this_machine and not re.match(need_machine, this_machine):
> -                this_soc_family = d.getVar('SOC_FAMILY', True)
> -                if (this_soc_family and not re.match(need_machine, this_soc_family)) or not this_soc_family:
> -                    raise bb.parse.SkipPackage("incompatible with machine %s (not in COMPATIBLE_MACHINE)" % this_machine)
> +            compat_machines = [d.getVar('MACHINE', True)]
> +            compat_machines.extend((d.getVar('SOC_FAMILY', True) or "").split(":"))
> +            for this_machine in compat_machines:
> +                if re.match(need_machine, this_machine):
> +                    break
> +            else:
> +                raise bb.parse.SkipPackage("incompatible with machine %s (not in COMPATIBLE_MACHINE)" % this_machine)
>  
aren't you breaking this log here vs what is was supposed to
print before ?

Eric
Otavio Salvador - April 6, 2013, 8:58 p.m.
On Sat, Apr 6, 2013 at 3:02 PM, Eric Bénard <eric@eukrea.com> wrote:
> Hi Otavio,
>
> Le Sat,  6 Apr 2013 14:17:48 -0300,
> Otavio Salvador <otavio@ossystems.com.br> a écrit :
>
>> When a SOC_FAMILY has more than one value, split by ':' as usual
>> OVERRIDES, this were not being properly checked in COMPATIBLE_MACHINE
>> matching as we need to iterate over each SoC family and check if it is
>> compatible or not.
>>
>> Signed-off-by: Otavio Salvador <otavio@ossystems.com.br>
>> ---
>>  meta/classes/base.bbclass | 12 +++++++-----
>>  1 file changed, 7 insertions(+), 5 deletions(-)
>>
>> diff --git a/meta/classes/base.bbclass b/meta/classes/base.bbclass
>> index abd6a52..6f24064 100644
>> --- a/meta/classes/base.bbclass
>> +++ b/meta/classes/base.bbclass
>> @@ -515,11 +515,13 @@ python () {
>>          need_machine = d.getVar('COMPATIBLE_MACHINE', True)
>>          if need_machine:
>>              import re
>> -            this_machine = d.getVar('MACHINE', True)
>> -            if this_machine and not re.match(need_machine, this_machine):
>> -                this_soc_family = d.getVar('SOC_FAMILY', True)
>> -                if (this_soc_family and not re.match(need_machine, this_soc_family)) or not this_soc_family:
>> -                    raise bb.parse.SkipPackage("incompatible with machine %s (not in COMPATIBLE_MACHINE)" % this_machine)
>> +            compat_machines = [d.getVar('MACHINE', True)]
>> +            compat_machines.extend((d.getVar('SOC_FAMILY', True) or "").split(":"))
>> +            for this_machine in compat_machines:
>> +                if re.match(need_machine, this_machine):
>> +                    break
>> +            else:
>> +                raise bb.parse.SkipPackage("incompatible with machine %s (not in COMPATIBLE_MACHINE)" % this_machine)
>>
> aren't you breaking this log here vs what is was supposed to
> print before ?

The 'else' is used when no 'break' is done inside of for loop.

--
Otavio Salvador                             O.S. Systems
E-mail: otavio@ossystems.com.br  http://www.ossystems.com.br
Mobile: +55 53 9981-7854              http://projetos.ossystems.com.br
Eric BENARD - April 7, 2013, 5:37 a.m.
Le Sat, 6 Apr 2013 17:58:30 -0300,
Otavio Salvador <otavio@ossystems.com.br> a écrit :

> On Sat, Apr 6, 2013 at 3:02 PM, Eric Bénard <eric@eukrea.com> wrote:
> > Hi Otavio,
> >
> > Le Sat,  6 Apr 2013 14:17:48 -0300,
> > Otavio Salvador <otavio@ossystems.com.br> a écrit :
> >
> >> When a SOC_FAMILY has more than one value, split by ':' as usual
> >> OVERRIDES, this were not being properly checked in COMPATIBLE_MACHINE
> >> matching as we need to iterate over each SoC family and check if it is
> >> compatible or not.
> >>
> >> Signed-off-by: Otavio Salvador <otavio@ossystems.com.br>
> >> ---
> >>  meta/classes/base.bbclass | 12 +++++++-----
> >>  1 file changed, 7 insertions(+), 5 deletions(-)
> >>
> >> diff --git a/meta/classes/base.bbclass b/meta/classes/base.bbclass
> >> index abd6a52..6f24064 100644
> >> --- a/meta/classes/base.bbclass
> >> +++ b/meta/classes/base.bbclass
> >> @@ -515,11 +515,13 @@ python () {
> >>          need_machine = d.getVar('COMPATIBLE_MACHINE', True)
> >>          if need_machine:
> >>              import re
> >> -            this_machine = d.getVar('MACHINE', True)
> >> -            if this_machine and not re.match(need_machine, this_machine):
> >> -                this_soc_family = d.getVar('SOC_FAMILY', True)
> >> -                if (this_soc_family and not re.match(need_machine, this_soc_family)) or not this_soc_family:
> >> -                    raise bb.parse.SkipPackage("incompatible with machine %s (not in COMPATIBLE_MACHINE)" % this_machine)
> >> +            compat_machines = [d.getVar('MACHINE', True)]
> >> +            compat_machines.extend((d.getVar('SOC_FAMILY', True) or "").split(":"))
> >> +            for this_machine in compat_machines:
> >> +                if re.match(need_machine, this_machine):
> >> +                    break
> >> +            else:
> >> +                raise bb.parse.SkipPackage("incompatible with machine %s (not in COMPATIBLE_MACHINE)" % this_machine)
> >>
> > aren't you breaking this log here vs what is was supposed to
> > print before ?
> 
> The 'else' is used when no 'break' is done inside of for loop.
> 
but will this_machine contain the value of the MACHINE variable ?

Eric
Otavio Salvador - April 8, 2013, 1:31 p.m.
On Sun, Apr 7, 2013 at 2:37 AM, Eric Bénard <eric@eukrea.com> wrote:
> Le Sat, 6 Apr 2013 17:58:30 -0300,
> Otavio Salvador <otavio@ossystems.com.br> a écrit :
>
>> On Sat, Apr 6, 2013 at 3:02 PM, Eric Bénard <eric@eukrea.com> wrote:
>> > Hi Otavio,
>> >
>> > Le Sat,  6 Apr 2013 14:17:48 -0300,
>> > Otavio Salvador <otavio@ossystems.com.br> a écrit :
>> >
>> >> When a SOC_FAMILY has more than one value, split by ':' as usual
>> >> OVERRIDES, this were not being properly checked in COMPATIBLE_MACHINE
>> >> matching as we need to iterate over each SoC family and check if it is
>> >> compatible or not.
>> >>
>> >> Signed-off-by: Otavio Salvador <otavio@ossystems.com.br>
>> >> ---
>> >>  meta/classes/base.bbclass | 12 +++++++-----
>> >>  1 file changed, 7 insertions(+), 5 deletions(-)
>> >>
>> >> diff --git a/meta/classes/base.bbclass b/meta/classes/base.bbclass
>> >> index abd6a52..6f24064 100644
>> >> --- a/meta/classes/base.bbclass
>> >> +++ b/meta/classes/base.bbclass
>> >> @@ -515,11 +515,13 @@ python () {
>> >>          need_machine = d.getVar('COMPATIBLE_MACHINE', True)
>> >>          if need_machine:
>> >>              import re
>> >> -            this_machine = d.getVar('MACHINE', True)
>> >> -            if this_machine and not re.match(need_machine, this_machine):
>> >> -                this_soc_family = d.getVar('SOC_FAMILY', True)
>> >> -                if (this_soc_family and not re.match(need_machine, this_soc_family)) or not this_soc_family:
>> >> -                    raise bb.parse.SkipPackage("incompatible with machine %s (not in COMPATIBLE_MACHINE)" % this_machine)
>> >> +            compat_machines = [d.getVar('MACHINE', True)]
>> >> +            compat_machines.extend((d.getVar('SOC_FAMILY', True) or "").split(":"))
>> >> +            for this_machine in compat_machines:
>> >> +                if re.match(need_machine, this_machine):
>> >> +                    break
>> >> +            else:
>> >> +                raise bb.parse.SkipPackage("incompatible with machine %s (not in COMPATIBLE_MACHINE)" % this_machine)
>> >>
>> > aren't you breaking this log here vs what is was supposed to
>> > print before ?
>>
>> The 'else' is used when no 'break' is done inside of for loop.
>>
> but will this_machine contain the value of the MACHINE variable ?

Yes, check:

...
+            compat_machines = [d.getVar('MACHINE', True)]
+            compat_machines.extend((d.getVar('SOC_FAMILY', True) or
"").split(":"))
...

--
Otavio Salvador                             O.S. Systems
E-mail: otavio@ossystems.com.br  http://www.ossystems.com.br
Mobile: +55 53 9981-7854              http://projetos.ossystems.com.br
Eric BENARD - April 8, 2013, 1:37 p.m.
Hi Otavio,

Le Mon, 8 Apr 2013 10:31:17 -0300,
Otavio Salvador <otavio@ossystems.com.br> a écrit :

> On Sun, Apr 7, 2013 at 2:37 AM, Eric Bénard <eric@eukrea.com> wrote:
> > Le Sat, 6 Apr 2013 17:58:30 -0300,
> > Otavio Salvador <otavio@ossystems.com.br> a écrit :
> >
> >> On Sat, Apr 6, 2013 at 3:02 PM, Eric Bénard <eric@eukrea.com> wrote:
> >> > Hi Otavio,
> >> >
> >> > Le Sat,  6 Apr 2013 14:17:48 -0300,
> >> > Otavio Salvador <otavio@ossystems.com.br> a écrit :
> >> >> +            compat_machines = [d.getVar('MACHINE', True)]
> >> >> +            compat_machines.extend((d.getVar('SOC_FAMILY', True) or "").split(":"))
> >> >> +            for this_machine in compat_machines:
> >> >> +                if re.match(need_machine, this_machine):
> >> >> +                    break
> >> >> +            else:
> >> >> +                raise bb.parse.SkipPackage("incompatible with machine %s (not in COMPATIBLE_MACHINE)" % this_machine)
> >> >>
> >> > aren't you breaking this log here vs what is was supposed to
> >> > print before ?
> >>
> >> The 'else' is used when no 'break' is done inside of for loop.
> >>
> > but will this_machine contain the value of the MACHINE variable ?
> 
> Yes, check:
> 
> ...
> +            compat_machines = [d.getVar('MACHINE', True)]
> +            compat_machines.extend((d.getVar('SOC_FAMILY', True) or
> "").split(":"))
> ...
> 
I'm not very experienced in python so sorry is that's a stupid
remark but after these lines you are using this_machine to go
through the content of compat_machines so in the end, when it reach the
log message it will contain the last value in compat_machine (and thus
the last one in SOC_FAMILY instead of the machine name) ?

Eric
Otavio Salvador - April 8, 2013, 1:44 p.m.
On Mon, Apr 8, 2013 at 10:37 AM, Eric Bénard <eric@eukrea.com> wrote:
> Hi Otavio,
>
> Le Mon, 8 Apr 2013 10:31:17 -0300,
> Otavio Salvador <otavio@ossystems.com.br> a écrit :
>
>> On Sun, Apr 7, 2013 at 2:37 AM, Eric Bénard <eric@eukrea.com> wrote:
>> > Le Sat, 6 Apr 2013 17:58:30 -0300,
>> > Otavio Salvador <otavio@ossystems.com.br> a écrit :
>> >
>> >> On Sat, Apr 6, 2013 at 3:02 PM, Eric Bénard <eric@eukrea.com> wrote:
>> >> > Hi Otavio,
>> >> >
>> >> > Le Sat,  6 Apr 2013 14:17:48 -0300,
>> >> > Otavio Salvador <otavio@ossystems.com.br> a écrit :
>> >> >> +            compat_machines = [d.getVar('MACHINE', True)]
>> >> >> +            compat_machines.extend((d.getVar('SOC_FAMILY', True) or "").split(":"))
>> >> >> +            for this_machine in compat_machines:
>> >> >> +                if re.match(need_machine, this_machine):
>> >> >> +                    break
>> >> >> +            else:
>> >> >> +                raise bb.parse.SkipPackage("incompatible with machine %s (not in COMPATIBLE_MACHINE)" % this_machine)
>> >> >>
>> >> > aren't you breaking this log here vs what is was supposed to
>> >> > print before ?
>> >>
>> >> The 'else' is used when no 'break' is done inside of for loop.
>> >>
>> > but will this_machine contain the value of the MACHINE variable ?
>>
>> Yes, check:
>>
>> ...
>> +            compat_machines = [d.getVar('MACHINE', True)]
>> +            compat_machines.extend((d.getVar('SOC_FAMILY', True) or
>> "").split(":"))
>> ...
>>
> I'm not very experienced in python so sorry is that's a stupid
> remark but after these lines you are using this_machine to go
> through the content of compat_machines so in the end, when it reach the
> log message it will contain the last value in compat_machine (and thus
> the last one in SOC_FAMILY instead of the machine name) ?

Indeed this is indeed a bug. I will follow-up with a proper fix for it.

--
Otavio Salvador                             O.S. Systems
E-mail: otavio@ossystems.com.br  http://www.ossystems.com.br
Mobile: +55 53 9981-7854              http://projetos.ossystems.com.br

Patch

diff --git a/meta/classes/base.bbclass b/meta/classes/base.bbclass
index abd6a52..6f24064 100644
--- a/meta/classes/base.bbclass
+++ b/meta/classes/base.bbclass
@@ -515,11 +515,13 @@  python () {
         need_machine = d.getVar('COMPATIBLE_MACHINE', True)
         if need_machine:
             import re
-            this_machine = d.getVar('MACHINE', True)
-            if this_machine and not re.match(need_machine, this_machine):
-                this_soc_family = d.getVar('SOC_FAMILY', True)
-                if (this_soc_family and not re.match(need_machine, this_soc_family)) or not this_soc_family:
-                    raise bb.parse.SkipPackage("incompatible with machine %s (not in COMPATIBLE_MACHINE)" % this_machine)
+            compat_machines = [d.getVar('MACHINE', True)]
+            compat_machines.extend((d.getVar('SOC_FAMILY', True) or "").split(":"))
+            for this_machine in compat_machines:
+                if re.match(need_machine, this_machine):
+                    break
+            else:
+                raise bb.parse.SkipPackage("incompatible with machine %s (not in COMPATIBLE_MACHINE)" % this_machine)
 
 
         bad_licenses = (d.getVar('INCOMPATIBLE_LICENSE', True) or "").split()