On Mon, 22 Apr 2024 11:06:44 +0200 Miguel Ojeda <ojeda@xxxxxxxxxx> wrote: > If one attempts to build an essentially empty file somewhere in the > kernel tree, it leads to a build error because the compiler does not > recognize the `new_uninit` unstable feature: > > error[E0635]: unknown feature `new_uninit` > --> <crate attribute>:1:9 > | > 1 | feature(new_uninit) > | ^^^^^^^^^^ > > The reason is that we pass `-Zcrate-attr='feature(new_uninit)'` (together > with `-Zallow-features=new_uninit`) to let non-`rust/` code use that > unstable feature. > > However, the compiler only recognizes the feature if the `alloc` crate > is resolved (the feature is an `alloc` one). `--extern alloc`, which we > pass, is not enough to resolve the crate. > > Introducing a reference like `use alloc;` or `extern crate alloc;` > solves the issue, thus this is not seen in normal files. For instance, > `use`ing the `kernel` prelude introduces such a reference, since `alloc` > is used inside. > > While normal use of the build system is not impacted by this, it can still > be fairly confusing for kernel developers [1], thus use the unstable > `force` option of `--extern` [2] (added in Rust 1.71 [3]) to force the > compiler to resolve `alloc`. > > This new unstable feature is only needed meanwhile we use the other > unstable feature, since then we will not need `-Zcrate-attr`. > > Cc: stable@xxxxxxxxxxxxxxx # v6.6+ > Reported-by: Daniel Almeida <daniel.almeida@xxxxxxxxxxxxx> > Reported-by: Julian Stecklina <julian.stecklina@xxxxxxxxxxxxxxxxxxxxx> > Closes: https://rust-for-linux.zulipchat.com/#narrow/stream/288089-General/topic/x/near/424096982 [1] > Fixes: 2f7ab1267dc9 ("Kbuild: add Rust support") > Link: https://github.com/rust-lang/rust/issues/111302 [2] > Link: https://github.com/rust-lang/rust/pull/109421 [3] > Signed-off-by: Miguel Ojeda <ojeda@xxxxxxxxxx> > --- Reviewed-by: Gary Guo <gary@xxxxxxxxxxx> > scripts/Makefile.build | 2 +- > 1 file changed, 1 insertion(+), 1 deletion(-) > > diff --git a/scripts/Makefile.build b/scripts/Makefile.build > index baf86c0880b6..533a7799fdfe 100644 > --- a/scripts/Makefile.build > +++ b/scripts/Makefile.build > @@ -273,7 +273,7 @@ rust_common_cmd = \ > -Zallow-features=$(rust_allowed_features) \ > -Zcrate-attr=no_std \ > -Zcrate-attr='feature($(rust_allowed_features))' \ > - --extern alloc --extern kernel \ > + -Zunstable-options --extern force:alloc --extern kernel \ > --crate-type rlib -L $(objtree)/rust/ \ > --crate-name $(basename $(notdir $@)) \ > --sysroot=/dev/null \ > > base-commit: 4cece764965020c22cff7665b18a012006359095