[PATCH 1/2] rust: support overriding crate_name

From: Alice Ryhl

Date: Tue Feb 24 2026 - 04:40:09 EST


Currently you cannot filter out the crate-name argument
RUSTFLAGS_REMOVE_stem.o because the Rust filter-out invocation does not
include that particular argument. Since --crate-name is an argument that
can't be passed multiple times, this means that it's currently not
possible to override the crate name. Thus, add a RUST_CRATENAME_ option
to make this possible.

The logic for getting the crate name in generate_rust_analyzer.py is a
bit hacky, but I'm not sure how to do it otherwise.

Signed-off-by: Alice Ryhl <aliceryhl@xxxxxxxxxx>
---
scripts/Makefile.build | 4 +++-
scripts/generate_rust_analyzer.py | 21 ++++++++++++++++++---
2 files changed, 21 insertions(+), 4 deletions(-)

diff --git a/scripts/Makefile.build b/scripts/Makefile.build
index 32e209bc7985..dea8320e5bde 100644
--- a/scripts/Makefile.build
+++ b/scripts/Makefile.build
@@ -324,6 +324,8 @@ rust_allowed_features := asm_const,asm_goto,arbitrary_self_types,lint_reasons,of
# `--out-dir` is required to avoid temporaries being created by `rustc` in the
# current working directory, which may be not accessible in the out-of-tree
# modules case.
+rust_cratename = $(if $(RUST_CRATENAME_$(target-stem).o),$(RUST_CRATENAME_$(target-stem).o),$(basename $(notdir $@)))
+
rust_common_cmd = \
OBJTREE=$(abspath $(objtree)) \
RUST_MODFILE=$(modfile) $(RUSTC_OR_CLIPPY) $(rust_flags) \
@@ -332,7 +334,7 @@ rust_common_cmd = \
-Zcrate-attr='feature($(rust_allowed_features))' \
-Zunstable-options --extern pin_init --extern kernel \
--crate-type rlib -L $(objtree)/rust/ \
- --crate-name $(basename $(notdir $@)) \
+ --crate-name $(rust_cratename) \
--sysroot=/dev/null \
--out-dir $(dir $@) --emit=dep-info=$(depfile)

diff --git a/scripts/generate_rust_analyzer.py b/scripts/generate_rust_analyzer.py
index f9b545104f21..4126acdc03ec 100755
--- a/scripts/generate_rust_analyzer.py
+++ b/scripts/generate_rust_analyzer.py
@@ -8,6 +8,7 @@ import json
import logging
import os
import pathlib
+import re
import subprocess
import sys

@@ -194,6 +195,16 @@ def generate_crates(srctree, objtree, sysroot_src, external_src, cfgs, core_edit
except FileNotFoundError:
return False

+ def get_crate_name(build_file, target):
+ try:
+ contents = build_file.read_text()
+ match = re.search(rf'RUST_CRATENAME_{target}\.o\s*[:=]+\s*(\w+)', contents)
+ if match:
+ return match.group(1)
+ except FileNotFoundError:
+ pass
+ return target
+
# Then, the rest outside of `rust/`.
#
# We explicitly mention the top-level folders we want to cover.
@@ -206,13 +217,17 @@ def generate_crates(srctree, objtree, sysroot_src, external_src, cfgs, core_edit
name = path.name.replace(".rs", "")

# Skip those that are not crate roots.
- if not is_root_crate(path.parent / "Makefile", name) and \
- not is_root_crate(path.parent / "Kbuild", name):
+ makefile = path.parent / "Makefile"
+ kbuild = path.parent / "Kbuild"
+ if not is_root_crate(makefile, name) and \
+ not is_root_crate(kbuild, name):
continue

logging.info("Adding %s", name)
+ crate_name = get_crate_name(makefile, name)
+
append_crate(
- name,
+ crate_name,
path,
["core", "kernel", "pin_init"],
cfg=cfg,

--
2.53.0.371.g1d285c8824-goog