Message ID | 20241009-rustc-option-bootstrap-v3-1-5fa0d520efba@google.com (mailing list archive) |
---|---|
State | New |
Headers | show |
Series | [v3] Kbuild: fix issues with rustc-option | expand |
On Wed, Oct 9, 2024 at 8:42 PM Alice Ryhl <aliceryhl@google.com> wrote: > > Fix a few different compiler errors that cause rustc-option to give > wrong results. > > If KBUILD_RUSTFLAGS or the flags being tested contain any -Z flags, then > the error below is generated. The RUSTC_BOOTSTRAP environment variable > is added to fix this error. > > error: the option `Z` is only accepted on the nightly compiler > help: consider switching to a nightly toolchain: `rustup default nightly` > note: selecting a toolchain with `+toolchain` arguments require a rustup proxy; > see <https://rust-lang.github.io/rustup/concepts/index.html> > note: for more information about Rust's stability policy, see > <https://doc.rust-lang.org/book/appendix-07-nightly-rust.html#unstable-features> > error: 1 nightly option were parsed > > Note that RUSTC_BOOTSTRAP is also defined in the top-level Makefile, but > its value is unfortunately *not* inherited from the environment. That > said, this is changing as of commit 98da874c4303 ("[SV 10593] Export > variables to $(shell ...) commands"), which is part of Make 4.4. > > The probe may also fail with the error message below. To fix it, the > /dev/null argument is replaced with a file containing the crate > attribute #![no_core]. The #![no_core] attribute ensures that rustc does > not look for the standard library. It's not possible to instead supply a > standard library to rustc, as we need `rustc-option` before the Rust > standard library is compiled. > > error[E0463]: can't find crate for `std` > | > = note: the `aarch64-unknown-none` target may not be installed > = help: consider downloading the target with `rustup target add aarch64-unknown-none` > = help: consider building the standard library from source with `cargo build -Zbuild-std` > > The -o and --out-dir parameters are altered to fix this warning: > > warning: ignoring --out-dir flag due to -o flag > > The --sysroot flag is provided as we would otherwise require it to be > present in KBUILD_RUSTFLAGS. The --emit=obj flag is used to write the > resulting rlib to /dev/null instead of writing it to a file in > $(TMPOUT). > > I verified that the Kconfig version of rustc-option doesn't have the > same issues. > > Fixes: c42297438aee ("kbuild: rust: Define probing macros for rustc") > Co-developed-by: Miguel Ojeda <ojeda@kernel.org> > Signed-off-by: Miguel Ojeda <ojeda@kernel.org> > Signed-off-by: Alice Ryhl <aliceryhl@google.com> > --- > Based on top of: > https://lore.kernel.org/r/20241009102821.2675718-1-masahiroy@kernel.org > --- > Changes in v3: > - Use stdin instead of a rust/probe.rs file. > - Fix --out-dir argument. > - Move RUSTC_BOOTSTRAP to __rustc-option. > - Add --sysroot and --emit=obj flags. > - Rebase on top of [PATCH] kbuild: refactor cc-option-yn, cc-disable-warning, rust-option-yn macros > - Link to v2: https://lore.kernel.org/r/20241008-rustc-option-bootstrap-v2-1-e6e155b8f9f3@google.com V3 looks good to me. Miguel, Will you apply this together with my rustc-option-yn refactoring? Acked-by: Masahiro Yamada <masahiroy@kernel.org> -- Best Regards Masahiro Yamada
On Wed, Oct 9, 2024 at 1:42 PM Alice Ryhl <aliceryhl@google.com> wrote: > > Note that RUSTC_BOOTSTRAP is also defined in the top-level Makefile, but > its value is unfortunately *not* inherited from the environment. That I would perhaps say ", but Make-exported variables are not inherited" or similar to be a bit more precise (because the external environment, as in the `make` environment, is exported unlike those variables). > not look for the standard library. It's not possible to instead supply a > standard library to rustc, as we need `rustc-option` before the Rust > standard library is compiled. The error message mentions `std`, so to clarify I would perhaps add ".... standard library (i.e. `core`)" or similar, i.e. one could think `no_std` is enough otherwise (which would be better if we could, since it is stable unlike `no_core`, but we don't want it here either). > The -o and --out-dir parameters are altered to fix this warning: > > warning: ignoring --out-dir flag due to -o flag > > The --sysroot flag is provided as we would otherwise require it to be > present in KBUILD_RUSTFLAGS. The --emit=obj flag is used to write the > resulting rlib to /dev/null instead of writing it to a file in > $(TMPOUT). "the resulting object file" (i.e. the rlib is not written even if we wrote to a file). > I verified that the Kconfig version of rustc-option doesn't have the > same issues. Thanks for checking this. We may want to make it closer to what we do her, but that can be done later. Cheers, Miguel
On Wed, Oct 9, 2024 at 2:52 PM Masahiro Yamada <masahiroy@kernel.org> wrote: > > V3 looks good to me. > > Miguel, > Will you apply this together with my rustc-option-yn refactoring? > > Acked-by: Masahiro Yamada <masahiroy@kernel.org> Sure -- thanks! Cheers, Miguel
On Wed, Oct 9, 2024 at 2:53 PM Miguel Ojeda <miguel.ojeda.sandonis@gmail.com> wrote: > > On Wed, Oct 9, 2024 at 1:42 PM Alice Ryhl <aliceryhl@google.com> wrote: > > > > Note that RUSTC_BOOTSTRAP is also defined in the top-level Makefile, but > > its value is unfortunately *not* inherited from the environment. That > > I would perhaps say ", but Make-exported variables are not inherited" > or similar to be a bit more precise (because the external environment, > as in the `make` environment, is exported unlike those variables). > > > not look for the standard library. It's not possible to instead supply a > > standard library to rustc, as we need `rustc-option` before the Rust > > standard library is compiled. > > The error message mentions `std`, so to clarify I would perhaps add > ".... standard library (i.e. `core`)" or similar, i.e. one could think > `no_std` is enough otherwise (which would be better if we could, since > it is stable unlike `no_core`, but we don't want it here either). > > > The -o and --out-dir parameters are altered to fix this warning: > > > > warning: ignoring --out-dir flag due to -o flag > > > > The --sysroot flag is provided as we would otherwise require it to be > > present in KBUILD_RUSTFLAGS. The --emit=obj flag is used to write the > > resulting rlib to /dev/null instead of writing it to a file in > > $(TMPOUT). > > "the resulting object file" (i.e. the rlib is not written even if we > wrote to a file). > > > I verified that the Kconfig version of rustc-option doesn't have the > > same issues. > > Thanks for checking this. We may want to make it closer to what we do > her, but that can be done later. > > Cheers, > Miguel That all sounds good to me. Feel free to make the suggested rewordings when you apply this. Otherwise I can send a v4 if you prefer. Alice
On Wed, Oct 9, 2024 at 2:58 PM Alice Ryhl <aliceryhl@google.com> wrote: > > That all sounds good to me. Feel free to make the suggested rewordings > when you apply this. Otherwise I can send a v4 if you prefer. No worries (but thanks!). Cheers, Miguel
On Wed, Oct 9, 2024 at 1:42 PM Alice Ryhl <aliceryhl@google.com> wrote: > > Fix a few different compiler errors that cause rustc-option to give > wrong results. > > If KBUILD_RUSTFLAGS or the flags being tested contain any -Z flags, then > the error below is generated. The RUSTC_BOOTSTRAP environment variable > is added to fix this error. > > error: the option `Z` is only accepted on the nightly compiler > help: consider switching to a nightly toolchain: `rustup default nightly` > note: selecting a toolchain with `+toolchain` arguments require a rustup proxy; > see <https://rust-lang.github.io/rustup/concepts/index.html> > note: for more information about Rust's stability policy, see > <https://doc.rust-lang.org/book/appendix-07-nightly-rust.html#unstable-features> > error: 1 nightly option were parsed > > Note that RUSTC_BOOTSTRAP is also defined in the top-level Makefile, but > its value is unfortunately *not* inherited from the environment. That > said, this is changing as of commit 98da874c4303 ("[SV 10593] Export > variables to $(shell ...) commands"), which is part of Make 4.4. > > The probe may also fail with the error message below. To fix it, the > /dev/null argument is replaced with a file containing the crate > attribute #![no_core]. The #![no_core] attribute ensures that rustc does > not look for the standard library. It's not possible to instead supply a > standard library to rustc, as we need `rustc-option` before the Rust > standard library is compiled. > > error[E0463]: can't find crate for `std` > | > = note: the `aarch64-unknown-none` target may not be installed > = help: consider downloading the target with `rustup target add aarch64-unknown-none` > = help: consider building the standard library from source with `cargo build -Zbuild-std` > > The -o and --out-dir parameters are altered to fix this warning: > > warning: ignoring --out-dir flag due to -o flag > > The --sysroot flag is provided as we would otherwise require it to be > present in KBUILD_RUSTFLAGS. The --emit=obj flag is used to write the > resulting rlib to /dev/null instead of writing it to a file in > $(TMPOUT). > > I verified that the Kconfig version of rustc-option doesn't have the > same issues. > > Fixes: c42297438aee ("kbuild: rust: Define probing macros for rustc") > Co-developed-by: Miguel Ojeda <ojeda@kernel.org> > Signed-off-by: Miguel Ojeda <ojeda@kernel.org> > Signed-off-by: Alice Ryhl <aliceryhl@google.com> Applied to `rust-fixes` -- thanks everyone! [ Reworded as discussed in the list. - Miguel ] Cheers, Miguel
diff --git a/scripts/Makefile.compiler b/scripts/Makefile.compiler index 73d611d383b2..e0842496d26e 100644 --- a/scripts/Makefile.compiler +++ b/scripts/Makefile.compiler @@ -73,8 +73,11 @@ ld-option = $(call try-run, $(LD) $(KBUILD_LDFLAGS) $(1) -v,$(1),$(2),$(3)) # __rustc-option # Usage: MY_RUSTFLAGS += $(call __rustc-option,$(RUSTC),$(MY_RUSTFLAGS),-Cinstrument-coverage,-Zinstrument-coverage) +# TODO: remove RUSTC_BOOTSTRAP=1 when we raise the minimum GNU Make version to 4.4 __rustc-option = $(call try-run,\ - $(1) $(2) $(3) --crate-type=rlib /dev/null --out-dir=$$TMPOUT -o "$$TMP",$(3),$(4)) + echo '#![allow(missing_docs)]#![feature(no_core)]#![no_core]' | RUSTC_BOOTSTRAP=1\ + $(1) --sysroot=/dev/null $(filter-out --sysroot=/dev/null,$(2)) $(3)\ + --crate-type=rlib --out-dir=$(TMPOUT) --emit=obj=- - >/dev/null,$(3),$(4)) # rustc-option # Usage: rustflags-y += $(call rustc-option,-Cinstrument-coverage,-Zinstrument-coverage)