diff mbox series

meson: check in main meson.build for native Rust compiler

Message ID 20241014143640.196735-1-pbonzini@redhat.com
State New
Headers show
Series meson: check in main meson.build for native Rust compiler | expand

Commit Message

Paolo Bonzini Oct. 14, 2024, 2:36 p.m. UTC
A working native Rust compiler is always needed in order to compile Rust
code, even when cross compiling, in order to build the procedural macros
that QEMU uses.

Right now, the check is done in rust/qemu-api-macros/meson.build, but this
has two disadvantages.  First, it makes the build fail when the Meson "rust"
option is set to "auto" (instead, Rust support should be disabled).  Second,
add_languages() is one of the few functions that are executed even by
"meson introspect", except that "meson introspect" executes both branches
of "if" statements!  Therefore, "meson introspect" tries to look for a
Rust compiler even if the option is disabled---and then fails because
the compiler is required by rust/qemu-api-macros/meson.build.  This is
visible for example if the compilation host has a stale
scripts/meson-buildoptions.sh and no rustc installed.

Both issues can be fixed by moving the check to the main meson.build,
together with the check for the cross compiler.

Reported-by: Peter Maydell <peter.maydell@linaro.org>
---
 meson.build                      | 3 ++-
 rust/qemu-api-macros/meson.build | 2 --
 2 files changed, 2 insertions(+), 3 deletions(-)

Comments

Peter Maydell Oct. 14, 2024, 2:38 p.m. UTC | #1
On Mon, 14 Oct 2024 at 15:36, Paolo Bonzini <pbonzini@redhat.com> wrote:
>
> A working native Rust compiler is always needed in order to compile Rust
> code, even when cross compiling, in order to build the procedural macros
> that QEMU uses.
>
> Right now, the check is done in rust/qemu-api-macros/meson.build, but this
> has two disadvantages.  First, it makes the build fail when the Meson "rust"
> option is set to "auto" (instead, Rust support should be disabled).  Second,
> add_languages() is one of the few functions that are executed even by
> "meson introspect", except that "meson introspect" executes both branches
> of "if" statements!  Therefore, "meson introspect" tries to look for a
> Rust compiler even if the option is disabled---and then fails because
> the compiler is required by rust/qemu-api-macros/meson.build.  This is
> visible for example if the compilation host has a stale
> scripts/meson-buildoptions.sh and no rustc installed.
>
> Both issues can be fixed by moving the check to the main meson.build,
> together with the check for the cross compiler.
>
> Reported-by: Peter Maydell <peter.maydell@linaro.org>
> ---
>  meson.build                      | 3 ++-
>  rust/qemu-api-macros/meson.build | 2 --
>  2 files changed, 2 insertions(+), 3 deletions(-)

Missing Signed-off-by: line ?


>
> diff --git a/meson.build b/meson.build
> index aecc381932d..c85f964bed4 100644
> --- a/meson.build
> +++ b/meson.build
> @@ -71,7 +71,8 @@ if host_os == 'darwin' and \
>    objc = meson.get_compiler('objc')
>  endif
>  have_rust = false
> -if not get_option('rust').disabled() and add_languages('rust', required: get_option('rust'), native: false)
> +if not get_option('rust').disabled() and add_languages('rust', required: get_option('rust'), native: false) \
> +    and add_languages('rust', required: get_option('rust'), native: true)
>    rustc = meson.get_compiler('rust')
>    have_rust = true
>    if rustc.version().version_compare('<1.80.0')
> diff --git a/rust/qemu-api-macros/meson.build b/rust/qemu-api-macros/meson.build
> index 48af91ed389..517b9a4d2d5 100644
> --- a/rust/qemu-api-macros/meson.build
> +++ b/rust/qemu-api-macros/meson.build
> @@ -1,5 +1,3 @@
> -add_languages('rust', required: true, native: true)
> -
>  quote_dep = dependency('quote-1-rs', native: true)
>  syn_dep = dependency('syn-2-rs', native: true)
>  proc_macro2_dep = dependency('proc-macro2-1-rs', native: true)
> --
> 2.46.


thanks
-- PMM
Peter Maydell Oct. 14, 2024, 2:40 p.m. UTC | #2
On Mon, 14 Oct 2024 at 15:38, Peter Maydell <peter.maydell@linaro.org> wrote:
>
> On Mon, 14 Oct 2024 at 15:36, Paolo Bonzini <pbonzini@redhat.com> wrote:
> >
> > A working native Rust compiler is always needed in order to compile Rust
> > code, even when cross compiling, in order to build the procedural macros
> > that QEMU uses.
> >
> > Right now, the check is done in rust/qemu-api-macros/meson.build, but this
> > has two disadvantages.  First, it makes the build fail when the Meson "rust"
> > option is set to "auto" (instead, Rust support should be disabled).  Second,
> > add_languages() is one of the few functions that are executed even by
> > "meson introspect", except that "meson introspect" executes both branches
> > of "if" statements!  Therefore, "meson introspect" tries to look for a
> > Rust compiler even if the option is disabled---and then fails because
> > the compiler is required by rust/qemu-api-macros/meson.build.  This is
> > visible for example if the compilation host has a stale
> > scripts/meson-buildoptions.sh and no rustc installed.
> >
> > Both issues can be fixed by moving the check to the main meson.build,
> > together with the check for the cross compiler.
> >
> > Reported-by: Peter Maydell <peter.maydell@linaro.org>
> > ---
> >  meson.build                      | 3 ++-
> >  rust/qemu-api-macros/meson.build | 2 --
> >  2 files changed, 2 insertions(+), 3 deletions(-)
>
> Missing Signed-off-by: line ?

Oh, and is there any better order in which to apply this
patch and your other fix, or does it not matter?

-- PMM
Paolo Bonzini Oct. 14, 2024, 2:43 p.m. UTC | #3
On Mon, Oct 14, 2024 at 4:41 PM Peter Maydell <peter.maydell@linaro.org> wrote:
>
> On Mon, 14 Oct 2024 at 15:38, Peter Maydell <peter.maydell@linaro.org> wrote:
> >
> > On Mon, 14 Oct 2024 at 15:36, Paolo Bonzini <pbonzini@redhat.com> wrote:
> > >
> > > A working native Rust compiler is always needed in order to compile Rust
> > > code, even when cross compiling, in order to build the procedural macros
> > > that QEMU uses.
> > >
> > > Right now, the check is done in rust/qemu-api-macros/meson.build, but this
> > > has two disadvantages.  First, it makes the build fail when the Meson "rust"
> > > option is set to "auto" (instead, Rust support should be disabled).  Second,
> > > add_languages() is one of the few functions that are executed even by
> > > "meson introspect", except that "meson introspect" executes both branches
> > > of "if" statements!  Therefore, "meson introspect" tries to look for a
> > > Rust compiler even if the option is disabled---and then fails because
> > > the compiler is required by rust/qemu-api-macros/meson.build.  This is
> > > visible for example if the compilation host has a stale
> > > scripts/meson-buildoptions.sh and no rustc installed.
> > >
> > > Both issues can be fixed by moving the check to the main meson.build,
> > > together with the check for the cross compiler.
> > >
> > > Reported-by: Peter Maydell <peter.maydell@linaro.org>
> > > ---
> > >  meson.build                      | 3 ++-
> > >  rust/qemu-api-macros/meson.build | 2 --
> > >  2 files changed, 2 insertions(+), 3 deletions(-)
> >
> > Missing Signed-off-by: line ?

Ugh, yes (my OpenBSD VM does not have the usual git hooks :)).

Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>

> Oh, and is there any better order in which to apply this
> patch and your other fix, or does it not matter?

It's not super important but I guess this one could go first, since it
affects non-incremental builds (as in CI) as well.

Paolo
Peter Maydell Oct. 14, 2024, 4:04 p.m. UTC | #4
On Mon, 14 Oct 2024 at 15:36, Paolo Bonzini <pbonzini@redhat.com> wrote:
>
> A working native Rust compiler is always needed in order to compile Rust
> code, even when cross compiling, in order to build the procedural macros
> that QEMU uses.
>
> Right now, the check is done in rust/qemu-api-macros/meson.build, but this
> has two disadvantages.  First, it makes the build fail when the Meson "rust"
> option is set to "auto" (instead, Rust support should be disabled).  Second,
> add_languages() is one of the few functions that are executed even by
> "meson introspect", except that "meson introspect" executes both branches
> of "if" statements!  Therefore, "meson introspect" tries to look for a
> Rust compiler even if the option is disabled---and then fails because
> the compiler is required by rust/qemu-api-macros/meson.build.  This is
> visible for example if the compilation host has a stale
> scripts/meson-buildoptions.sh and no rustc installed.
>
> Both issues can be fixed by moving the check to the main meson.build,
> together with the check for the cross compiler.
>
> Reported-by: Peter Maydell <peter.maydell@linaro.org>
> ---


Applied directly to git, thanks.

-- PMM
diff mbox series

Patch

diff --git a/meson.build b/meson.build
index aecc381932d..c85f964bed4 100644
--- a/meson.build
+++ b/meson.build
@@ -71,7 +71,8 @@  if host_os == 'darwin' and \
   objc = meson.get_compiler('objc')
 endif
 have_rust = false
-if not get_option('rust').disabled() and add_languages('rust', required: get_option('rust'), native: false)
+if not get_option('rust').disabled() and add_languages('rust', required: get_option('rust'), native: false) \
+    and add_languages('rust', required: get_option('rust'), native: true)
   rustc = meson.get_compiler('rust')
   have_rust = true
   if rustc.version().version_compare('<1.80.0')
diff --git a/rust/qemu-api-macros/meson.build b/rust/qemu-api-macros/meson.build
index 48af91ed389..517b9a4d2d5 100644
--- a/rust/qemu-api-macros/meson.build
+++ b/rust/qemu-api-macros/meson.build
@@ -1,5 +1,3 @@ 
-add_languages('rust', required: true, native: true)
-
 quote_dep = dependency('quote-1-rs', native: true)
 syn_dep = dependency('syn-2-rs', native: true)
 proc_macro2_dep = dependency('proc-macro2-1-rs', native: true)