meson: use the more specific cpu arch in cross file

Submitted by Ruslan Babayev on July 26, 2020, 1:56 a.m. | Patch ID: 174740

Details

Message ID 20200726015614.2875-1-ruslan@babayev.com
State New
Headers show

Commit Message

Ruslan Babayev July 26, 2020, 1:56 a.m.
'cpu' unlike 'cpu_family' must be a more specific subtype for the CPU.

Signed-off-by: Ruslan Babayev <ruslan@babayev.com>
---
 meta/classes/meson.bbclass                         | 14 ++++++++++++--
 .../meson/nativesdk-meson_0.53.2.bb                | 12 +++++++++++-
 2 files changed, 23 insertions(+), 3 deletions(-)

Patch hide | download patch | download mbox

diff --git a/meta/classes/meson.bbclass b/meta/classes/meson.bbclass
index ff52d20e56..0caa7a37c2 100644
--- a/meta/classes/meson.bbclass
+++ b/meta/classes/meson.bbclass
@@ -62,6 +62,16 @@  def meson_cpu_family(var, d):
     else:
         return arch
 
+def meson_cpu(prefix, d):
+    import re
+    arch = d.getVar(prefix + "_ARCH")
+    tune_ccargs = d.getVar("TUNE_CCARGS")
+    m = re.search(r"(?<=-march=)\w+|(?<=-mcpu=)\w+", tune_ccargs)
+    if m:
+        return m.group(0)
+    else:
+        return arch
+
 # Map our OS values to what Meson expects:
 # https://mesonbuild.com/Reference-tables.html#operating-system-names
 def meson_operating_system(var, d):
@@ -110,13 +120,13 @@  gtkdoc_exe_wrapper = '${B}/gtkdoc-qemuwrapper'
 [host_machine]
 system = '${@meson_operating_system('HOST_OS', d)}'
 cpu_family = '${@meson_cpu_family('HOST_ARCH', d)}'
-cpu = '${HOST_ARCH}'
+cpu = '${@meson_cpu('HOST', d)}'
 endian = '${@meson_endian('HOST', d)}'
 
 [target_machine]
 system = '${@meson_operating_system('TARGET_OS', d)}'
 cpu_family = '${@meson_cpu_family('TARGET_ARCH', d)}'
-cpu = '${TARGET_ARCH}'
+cpu = '${@meson_cpu('TARGET', d)}'
 endian = '${@meson_endian('TARGET', d)}'
 EOF
 }
diff --git a/meta/recipes-devtools/meson/nativesdk-meson_0.53.2.bb b/meta/recipes-devtools/meson/nativesdk-meson_0.53.2.bb
index 67add2c25e..021bff0992 100644
--- a/meta/recipes-devtools/meson/nativesdk-meson_0.53.2.bb
+++ b/meta/recipes-devtools/meson/nativesdk-meson_0.53.2.bb
@@ -6,6 +6,16 @@  inherit siteinfo
 SRC_URI += "file://meson-setup.py \
             file://meson-wrapper"
 
+def meson_cpu(var, d):
+    import re
+    arch = d.getVar(var)
+    tune_ccargs = d.getVar("TUNE_CCARGS")
+    m = re.search(r"(?<=-march=)\w+|(?<=-mcpu=)\w+", tune_ccargs)
+    if m:
+        return m.group(0)
+    else:
+        return arch
+
 def meson_endian(prefix, d):
     arch, os = d.getVar(prefix + "_ARCH"), d.getVar(prefix + "_OS")
     sitedata = siteinfo_data_for_machine(arch, os, d)
@@ -44,7 +54,7 @@  cpp_link_args = @LDFLAGS
 [host_machine]
 system = '${SDK_OS}'
 cpu_family = '${SDK_ARCH}'
-cpu = '${SDK_ARCH}'
+cpu = '${@meson_cpu("SDK_ARCH", d)}'
 endian = '${@meson_endian("SDK", d)}'
 EOF
 

Comments

Ross Burton July 27, 2020, 10:52 a.m.
On Sun, 26 Jul 2020 at 02:56, Ruslan Babayev <ruslan@babayev.com> wrote:
> 'cpu' unlike 'cpu_family' must be a more specific subtype for the CPU.

Can you elaborate here some more?

Ross
-=-=-=-=-=-=-=-=-=-=-=-
Links: You receive all messages sent to this group.

View/Reply Online (#140978): https://lists.openembedded.org/g/openembedded-core/message/140978
Mute This Topic: https://lists.openembedded.org/mt/75796683/3617530
Group Owner: openembedded-core+owner@lists.openembedded.org
Unsubscribe: https://lists.openembedded.org/g/openembedded-core/unsub  [oe-patchwork@oe-patch.openembedded.org]
-=-=-=-=-=-=-=-=-=-=-=-
Ruslan Babayev July 27, 2020, 7:03 p.m.
Hi Ross,

According to https://mesonbuild.com/Cross-compilation.html

There are two different values for the CPU. The first one is cpu_family. It
is a general type of the CPU. This should have a value from the CPU Family
table <https://mesonbuild.com/Reference-tables.html#cpu-families>. *Note* that
meson does not add el to end cpu_family value for little endian systems.
Big endian and little endian mips are both just mips, with the endian field
set approriately.

The second value is cpu which is a more specific subtype for the CPU.
Typical values for a x86 CPU family might include i386 or i586 and for arm
 family armv5 or armv7hl. Note that CPU type strings are very system
dependent. You might get a different value if you check its value on the
same machine but with different operating systems.
At the moment both 'cpu_family' and 'cpu' are being set to TARGET_ARCH
(like x86_64) in meson cross file.

TUNE_CCARSG usually contains the exact subfamily either as -march= or
-mcpu=

The meson_cpu function will use regex to search for -march and if that's
missing for -mcpu value. If both flags are missing it defaults to
TARGET_ARCH.

Ruslan


On Mon, Jul 27, 2020 at 3:52 AM Ross Burton <ross@burtonini.com> wrote:

> On Sun, 26 Jul 2020 at 02:56, Ruslan Babayev <ruslan@babayev.com> wrote:
> > 'cpu' unlike 'cpu_family' must be a more specific subtype for the CPU.
>
> Can you elaborate here some more?
>
> Ross
>
-=-=-=-=-=-=-=-=-=-=-=-
Links: You receive all messages sent to this group.

View/Reply Online (#141011): https://lists.openembedded.org/g/openembedded-core/message/141011
Mute This Topic: https://lists.openembedded.org/mt/75796683/3617530
Group Owner: openembedded-core+owner@lists.openembedded.org
Unsubscribe: https://lists.openembedded.org/g/openembedded-core/unsub  [oe-patchwork@oe-patch.openembedded.org]
-=-=-=-=-=-=-=-=-=-=-=-
Ruslan Babayev July 29, 2020, 9:04 p.m.
Hi Ross,

What do you think of the patch? Any objections to merging it? Do you have
any feedback?

Thanks,
Ruslan

On Mon, Jul 27, 2020 at 12:03 PM Ruslan Babayev <ruslan@babayev.com> wrote:

> Hi Ross,
>
> According to https://mesonbuild.com/Cross-compilation.html
>
> There are two different values for the CPU. The first one is cpu_family.
> It is a general type of the CPU. This should have a value from the CPU
> Family table <https://mesonbuild.com/Reference-tables.html#cpu-families>.
> *Note* that meson does not add el to end cpu_family value for little
> endian systems. Big endian and little endian mips are both just mips,
> with the endian field set approriately.
>
> The second value is cpu which is a more specific subtype for the CPU.
> Typical values for a x86 CPU family might include i386 or i586 and for arm
>  family armv5 or armv7hl. Note that CPU type strings are very system
> dependent. You might get a different value if you check its value on the
> same machine but with different operating systems.
> At the moment both 'cpu_family' and 'cpu' are being set to TARGET_ARCH
> (like x86_64) in meson cross file.
>
> TUNE_CCARSG usually contains the exact subfamily either as -march= or
> -mcpu=
>
> The meson_cpu function will use regex to search for -march and if that's
> missing for -mcpu value. If both flags are missing it defaults to
> TARGET_ARCH.
>
> Ruslan
>
>
> On Mon, Jul 27, 2020 at 3:52 AM Ross Burton <ross@burtonini.com> wrote:
>
>> On Sun, 26 Jul 2020 at 02:56, Ruslan Babayev <ruslan@babayev.com> wrote:
>> > 'cpu' unlike 'cpu_family' must be a more specific subtype for the CPU.
>>
>> Can you elaborate here some more?
>>
>> Ross
>>
>
-=-=-=-=-=-=-=-=-=-=-=-
Links: You receive all messages sent to this group.

View/Reply Online (#141103): https://lists.openembedded.org/g/openembedded-core/message/141103
Mute This Topic: https://lists.openembedded.org/mt/75796683/3617530
Group Owner: openembedded-core+owner@lists.openembedded.org
Unsubscribe: https://lists.openembedded.org/g/openembedded-core/unsub  [oe-patchwork@oe-patch.openembedded.org]
-=-=-=-=-=-=-=-=-=-=-=-
Khem Raj July 30, 2020, 4:55 a.m.
On 7/25/20 6:56 PM, Ruslan Babayev wrote:
> 'cpu' unlike 'cpu_family' must be a more specific subtype for the CPU.
> 

since mcpu/march should provide the right values already, do we need 
this additional logic in meson? dont we get needed settings to meson
already?

perhaps you can describe some missing cases this would address will help 
understand the usecase

> Signed-off-by: Ruslan Babayev <ruslan@babayev.com>
> ---
>   meta/classes/meson.bbclass                         | 14 ++++++++++++--
>   .../meson/nativesdk-meson_0.53.2.bb                | 12 +++++++++++-
>   2 files changed, 23 insertions(+), 3 deletions(-)
> 
> diff --git a/meta/classes/meson.bbclass b/meta/classes/meson.bbclass
> index ff52d20e56..0caa7a37c2 100644
> --- a/meta/classes/meson.bbclass
> +++ b/meta/classes/meson.bbclass
> @@ -62,6 +62,16 @@ def meson_cpu_family(var, d):
>       else:
>           return arch
>   
> +def meson_cpu(prefix, d):
> +    import re
> +    arch = d.getVar(prefix + "_ARCH")
> +    tune_ccargs = d.getVar("TUNE_CCARGS")
> +    m = re.search(r"(?<=-march=)\w+|(?<=-mcpu=)\w+", tune_ccargs)
> +    if m:
> +        return m.group(0)
> +    else:
> +        return arch
> +
>   # Map our OS values to what Meson expects:
>   # https://mesonbuild.com/Reference-tables.html#operating-system-names
>   def meson_operating_system(var, d):
> @@ -110,13 +120,13 @@ gtkdoc_exe_wrapper = '${B}/gtkdoc-qemuwrapper'
>   [host_machine]
>   system = '${@meson_operating_system('HOST_OS', d)}'
>   cpu_family = '${@meson_cpu_family('HOST_ARCH', d)}'
> -cpu = '${HOST_ARCH}'
> +cpu = '${@meson_cpu('HOST', d)}'
>   endian = '${@meson_endian('HOST', d)}'
>   
>   [target_machine]
>   system = '${@meson_operating_system('TARGET_OS', d)}'
>   cpu_family = '${@meson_cpu_family('TARGET_ARCH', d)}'
> -cpu = '${TARGET_ARCH}'
> +cpu = '${@meson_cpu('TARGET', d)}'
>   endian = '${@meson_endian('TARGET', d)}'
>   EOF
>   }
> diff --git a/meta/recipes-devtools/meson/nativesdk-meson_0.53.2.bb b/meta/recipes-devtools/meson/nativesdk-meson_0.53.2.bb
> index 67add2c25e..021bff0992 100644
> --- a/meta/recipes-devtools/meson/nativesdk-meson_0.53.2.bb
> +++ b/meta/recipes-devtools/meson/nativesdk-meson_0.53.2.bb
> @@ -6,6 +6,16 @@ inherit siteinfo
>   SRC_URI += "file://meson-setup.py \
>               file://meson-wrapper"
>   
> +def meson_cpu(var, d):
> +    import re
> +    arch = d.getVar(var)
> +    tune_ccargs = d.getVar("TUNE_CCARGS")
> +    m = re.search(r"(?<=-march=)\w+|(?<=-mcpu=)\w+", tune_ccargs)
> +    if m:
> +        return m.group(0)
> +    else:
> +        return arch
> +
>   def meson_endian(prefix, d):
>       arch, os = d.getVar(prefix + "_ARCH"), d.getVar(prefix + "_OS")
>       sitedata = siteinfo_data_for_machine(arch, os, d)
> @@ -44,7 +54,7 @@ cpp_link_args = @LDFLAGS
>   [host_machine]
>   system = '${SDK_OS}'
>   cpu_family = '${SDK_ARCH}'
> -cpu = '${SDK_ARCH}'
> +cpu = '${@meson_cpu("SDK_ARCH", d)}'
>   endian = '${@meson_endian("SDK", d)}'
>   EOF
>   
> 
> 
> 
>
-=-=-=-=-=-=-=-=-=-=-=-
Links: You receive all messages sent to this group.

View/Reply Online (#141114): https://lists.openembedded.org/g/openembedded-core/message/141114
Mute This Topic: https://lists.openembedded.org/mt/75796683/3617530
Group Owner: openembedded-core+owner@lists.openembedded.org
Unsubscribe: https://lists.openembedded.org/g/openembedded-core/unsub  [oe-patchwork@oe-patch.openembedded.org]
-=-=-=-=-=-=-=-=-=-=-=-
Ruslan Babayev July 30, 2020, 6:12 a.m.
Currently we have both cpu_family and cpu set to TARGET_ARCH which is
wrong. As mentioned before cpu is more specific. E.g where
cpu_family='x86-64' cpu='nehalem'.

Projects using Meson can query for the host_machine.cpu() and expect a more
specific CPU type.
Here's one example:
https://github.com/DPDK/dpdk/blob/74f4d6424da1297bd6e83dcb7bd84444ca8c59dd/config/meson.build#L69




On Wed, Jul 29, 2020 at 9:55 PM Khem Raj <raj.khem@gmail.com> wrote:

>
>
> On 7/25/20 6:56 PM, Ruslan Babayev wrote:
> > 'cpu' unlike 'cpu_family' must be a more specific subtype for the CPU.
> >
>
> since mcpu/march should provide the right values already, do we need
> this additional logic in meson? dont we get needed settings to meson
> already?
>
> perhaps you can describe some missing cases this would address will help
> understand the usecase
>
> > Signed-off-by: Ruslan Babayev <ruslan@babayev.com>
> > ---
> >   meta/classes/meson.bbclass                         | 14 ++++++++++++--
> >   .../meson/nativesdk-meson_0.53.2.bb                | 12 +++++++++++-
> >   2 files changed, 23 insertions(+), 3 deletions(-)
> >
> > diff --git a/meta/classes/meson.bbclass b/meta/classes/meson.bbclass
> > index ff52d20e56..0caa7a37c2 100644
> > --- a/meta/classes/meson.bbclass
> > +++ b/meta/classes/meson.bbclass
> > @@ -62,6 +62,16 @@ def meson_cpu_family(var, d):
> >       else:
> >           return arch
> >
> > +def meson_cpu(prefix, d):
> > +    import re
> > +    arch = d.getVar(prefix + "_ARCH")
> > +    tune_ccargs = d.getVar("TUNE_CCARGS")
> > +    m = re.search(r"(?<=-march=)\w+|(?<=-mcpu=)\w+", tune_ccargs)
> > +    if m:
> > +        return m.group(0)
> > +    else:
> > +        return arch
> > +
> >   # Map our OS values to what Meson expects:
> >   # https://mesonbuild.com/Reference-tables.html#operating-system-names
> >   def meson_operating_system(var, d):
> > @@ -110,13 +120,13 @@ gtkdoc_exe_wrapper = '${B}/gtkdoc-qemuwrapper'
> >   [host_machine]
> >   system = '${@meson_operating_system('HOST_OS', d)}'
> >   cpu_family = '${@meson_cpu_family('HOST_ARCH', d)}'
> > -cpu = '${HOST_ARCH}'
> > +cpu = '${@meson_cpu('HOST', d)}'
> >   endian = '${@meson_endian('HOST', d)}'
> >
> >   [target_machine]
> >   system = '${@meson_operating_system('TARGET_OS', d)}'
> >   cpu_family = '${@meson_cpu_family('TARGET_ARCH', d)}'
> > -cpu = '${TARGET_ARCH}'
> > +cpu = '${@meson_cpu('TARGET', d)}'
> >   endian = '${@meson_endian('TARGET', d)}'
> >   EOF
> >   }
> > diff --git a/meta/recipes-devtools/meson/nativesdk-meson_0.53.2.bb
> b/meta/recipes-devtools/meson/nativesdk-meson_0.53.2.bb
> > index 67add2c25e..021bff0992 100644
> > --- a/meta/recipes-devtools/meson/nativesdk-meson_0.53.2.bb
> > +++ b/meta/recipes-devtools/meson/nativesdk-meson_0.53.2.bb
> > @@ -6,6 +6,16 @@ inherit siteinfo
> >   SRC_URI += "file://meson-setup.py \
> >               file://meson-wrapper"
> >
> > +def meson_cpu(var, d):
> > +    import re
> > +    arch = d.getVar(var)
> > +    tune_ccargs = d.getVar("TUNE_CCARGS")
> > +    m = re.search(r"(?<=-march=)\w+|(?<=-mcpu=)\w+", tune_ccargs)
> > +    if m:
> > +        return m.group(0)
> > +    else:
> > +        return arch
> > +
> >   def meson_endian(prefix, d):
> >       arch, os = d.getVar(prefix + "_ARCH"), d.getVar(prefix + "_OS")
> >       sitedata = siteinfo_data_for_machine(arch, os, d)
> > @@ -44,7 +54,7 @@ cpp_link_args = @LDFLAGS
> >   [host_machine]
> >   system = '${SDK_OS}'
> >   cpu_family = '${SDK_ARCH}'
> > -cpu = '${SDK_ARCH}'
> > +cpu = '${@meson_cpu("SDK_ARCH", d)}'
> >   endian = '${@meson_endian("SDK", d)}'
> >   EOF
> >
> >
> >
> > 
> >
>
-=-=-=-=-=-=-=-=-=-=-=-
Links: You receive all messages sent to this group.

View/Reply Online (#141116): https://lists.openembedded.org/g/openembedded-core/message/141116
Mute This Topic: https://lists.openembedded.org/mt/75796683/3617530
Group Owner: openembedded-core+owner@lists.openembedded.org
Unsubscribe: https://lists.openembedded.org/g/openembedded-core/unsub  [oe-patchwork@oe-patch.openembedded.org]
-=-=-=-=-=-=-=-=-=-=-=-
Richard Purdie July 30, 2020, 8:49 a.m.
On Wed, 2020-07-29 at 23:12 -0700, Ruslan Babayev wrote:
> Currently we have both cpu_family and cpu set to TARGET_ARCH which is
> wrong. As mentioned before cpu is more specific. E.g where
> cpu_family='x86-64' cpu='nehalem'.
>   
> Projects using Meson can query for the host_machine.cpu() and expect
> a more specific CPU type.
> Here's one example:
> https://github.com/DPDK/dpdk/blob/74f4d6424da1297bd6e83dcb7bd84444ca8c59dd/config/meson.build#L69 

That logic looks like its basically being used to set -march. We
already set this.

Khem and Ross' question is to find out what is currently breaking that
needs this fix. In general for example, we have a much better idea of
what march should be set to in our uses cases.

Cheers

Richard
-=-=-=-=-=-=-=-=-=-=-=-
Links: You receive all messages sent to this group.

View/Reply Online (#141122): https://lists.openembedded.org/g/openembedded-core/message/141122
Mute This Topic: https://lists.openembedded.org/mt/75796683/3617530
Group Owner: openembedded-core+owner@lists.openembedded.org
Unsubscribe: https://lists.openembedded.org/g/openembedded-core/unsub  [oe-patchwork@oe-patch.openembedded.org]
-=-=-=-=-=-=-=-=-=-=-=-