diff mbox series

[v3] Kbuild: fix issues with rustc-option

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

Commit Message

Alice Ryhl Oct. 9, 2024, 11:41 a.m. UTC
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

Changes in v2:
- Add `export` to RUSTC_BOOTSTRAP.
- Fix error about core being missing.
- Fix warning about -o flag.
- Link to v1: https://lore.kernel.org/r/20241008-rustc-option-bootstrap-v1-1-9eb06261d4f7@google.com
---
 scripts/Makefile.compiler | 5 ++++-
 1 file changed, 4 insertions(+), 1 deletion(-)


---
base-commit: 1ba227507e8459788bf0e192700347c941e3e218
change-id: 20241008-rustc-option-bootstrap-607e5bf3114c

Best regards,

Comments

Masahiro Yamada Oct. 9, 2024, 12:51 p.m. UTC | #1
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
Miguel Ojeda Oct. 9, 2024, 12:53 p.m. UTC | #2
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
Miguel Ojeda Oct. 9, 2024, 12:54 p.m. UTC | #3
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
Alice Ryhl Oct. 9, 2024, 12:57 p.m. UTC | #4
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
Miguel Ojeda Oct. 9, 2024, 1 p.m. UTC | #5
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
Miguel Ojeda Oct. 14, 2024, 9:58 p.m. UTC | #6
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 mbox series

Patch

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)