Hi Mukesh, This patch doesn’t apply on top of mainline, which tree did you base it off?
On Fri, Apr 17, 2026 at 08:52:50PM +0530, Mukesh Kumar Chaurasiya (IBM) wrote: > When building Rust code for powerpc64le with LLVM=1 and -j1, rustc > encounters an error: "multiple candidates for `rmeta` dependency `core` > found", with two candidates: > 1. The host's standard library from the rustup toolchain > 2. The kernel's custom libcore.rmeta in the rust/ directory > > This occurs because the build system uses `-L$(objtree)/rust` for host > library builds (proc_macro2, quote, syn), which causes rustc to search > the rust/ directory. During this search, rustc finds both the kernel's > custom libcore.rmeta and gains access to the host's standard library, > creating a conflict. > > The solution is to separate host libraries into a dedicated rust/host/ > subdirectory and use `-L$(objtree)/rust/host` for host builds instead > of `-L$(objtree)/rust`. This ensures that: > > 1. Host library builds (proc_macro2, quote, syn) only search rust/host/ > and never encounter the kernel's libcore.rmeta > 2. Proc macro builds use `-L$(objtree)/rust/host` to find their > dependencies > > Special handling is added for rustdoc-pin_init, which is a host build > (to access the alloc crate) but depends on proc macros from the main > rust/ directory. It uses explicit `--extern` paths to reference the > proc macros without adding `-L$(objtree)/rust`, which would reintroduce > the conflict. > > The rust/host/ directory is added to clean-files to ensure it's removed > during `make clean`. > > Link: https://github.com/Rust-for-Linux/linux/issues/105 > Link: https://github.com/linuxppc/issues/issues/451 > Signed-off-by: Mukesh Kumar Chaurasiya (IBM) <[email protected]> > --- > rust/Makefile | 38 +++++++++++++++++++++----------------- > 1 file changed, 21 insertions(+), 17 deletions(-) > > diff --git a/rust/Makefile b/rust/Makefile > index 9801af2e1e02..e234b8a39358 100644 > --- a/rust/Makefile > +++ b/rust/Makefile > @@ -3,6 +3,9 @@ > # Where to place rustdoc generated documentation > rustdoc_output := $(objtree)/Documentation/output/rust/rustdoc > > +# Clean generated host directory > +clean-files := host/ > + > obj-$(CONFIG_RUST) += core.o compiler_builtins.o ffi.o > always-$(CONFIG_RUST) += exports_core_generated.h > > @@ -27,7 +30,7 @@ endif > > obj-$(CONFIG_RUST) += exports.o > > -always-$(CONFIG_RUST) += libproc_macro2.rlib libquote.rlib libsyn.rlib > +always-$(CONFIG_RUST) += host/libproc_macro2.rlib host/libquote.rlib > host/libsyn.rlib > > always-$(CONFIG_RUST_KERNEL_DOCTESTS) += doctests_kernel_generated.rs > always-$(CONFIG_RUST_KERNEL_DOCTESTS) += doctests_kernel_generated_kunit.c > @@ -150,7 +153,7 @@ quiet_cmd_rustdoc = RUSTDOC $(if $(rustdoc_host),H, ) $< > OBJTREE=$(abspath $(objtree)) \ > $(RUSTDOC) $(filter-out $(skip_flags) --remap-path-prefix=% > --remap-path-scope=%, \ > $(if > $(rustdoc_host),$(rust_common_flags),$(rust_flags))) \ The issue is here ↑, --remap-path-prefix=% got removed and the two previous lines got merged into one. > - $(rustc_target_flags) -L$(objtree)/$(obj) \ > + $(rustc_target_flags) -L$(objtree)/$(obj)$(if > $(rustdoc_host),/host) \ > -Zunstable-options --generate-link-to-definition \ > --output $(rustdoc_output) \ > --crate-name $(subst rustdoc-,,$@) \ […] Thanks anyway for iterating on this series! I’ve started writing a DRM driver based off a previous version. :) -- Link Mauve
