rust/Makefile | 32 +++++++++++++++++++++++--------- scripts/generate_rust_analyzer.py | 13 +++++-------- 2 files changed, 28 insertions(+), 17 deletions(-)
Plumb `pin-init{,-internal}` cfgs from Makefile to rust-analyzer and
automatically interpret `--cfg <crate>=<cfg>` as applying to <crate>.
Signed-off-by: Tamir Duberstein <tamird@kernel.org>
---
rust/Makefile | 32 +++++++++++++++++++++++---------
scripts/generate_rust_analyzer.py | 13 +++++--------
2 files changed, 28 insertions(+), 17 deletions(-)
diff --git a/rust/Makefile b/rust/Makefile
index 5d357dce1704..2461c5835a7e 100644
--- a/rust/Makefile
+++ b/rust/Makefile
@@ -210,16 +210,30 @@ rustdoc-ffi: private is-kernel-object := y
rustdoc-ffi: $(src)/ffi.rs rustdoc-core FORCE
+$(call if_changed,rustdoc)
+pin_init_internal-cfgs := \
+ kernel
+
+pin_init_internal-flags := \
+ $(call cfgs-to-flags,$(pin_init_internal-cfgs))
+
rustdoc-pin_init_internal: private rustdoc_host = yes
-rustdoc-pin_init_internal: private rustc_target_flags = --cfg kernel \
+rustdoc-pin_init_internal: private rustc_target_flags = $(pin_init_internal-flags) \
--extern proc_macro --crate-type proc-macro
rustdoc-pin_init_internal: $(src)/pin-init/internal/src/lib.rs \
rustdoc-clean FORCE
+$(call if_changed,rustdoc)
+pin_init-cfgs := \
+ kernel
+
+pin_init-flags := \
+ --extern pin_init_internal \
+ --extern macros \
+ $(call cfgs-to-flags,$(pin_init-cfgs))
+
rustdoc-pin_init: private rustdoc_host = yes
-rustdoc-pin_init: private rustc_target_flags = --extern pin_init_internal \
- --extern macros --extern alloc --cfg kernel --cfg feature=\"alloc\"
+rustdoc-pin_init: private rustc_target_flags = $(pin_init-flags) \
+ --extern alloc --cfg feature=\"alloc\"
rustdoc-pin_init: $(src)/pin-init/src/lib.rs rustdoc-pin_init_internal \
rustdoc-macros FORCE
+$(call if_changed,rustdoc)
@@ -272,14 +286,13 @@ rusttestlib-macros: $(src)/macros/lib.rs \
rusttestlib-proc_macro2 rusttestlib-quote rusttestlib-syn FORCE
+$(call if_changed,rustc_test_library)
-rusttestlib-pin_init_internal: private rustc_target_flags = --cfg kernel \
+rusttestlib-pin_init_internal: private rustc_target_flags = $(pin_init_internal-flags) \
--extern proc_macro
rusttestlib-pin_init_internal: private rustc_test_library_proc = yes
rusttestlib-pin_init_internal: $(src)/pin-init/internal/src/lib.rs FORCE
+$(call if_changed,rustc_test_library)
-rusttestlib-pin_init: private rustc_target_flags = --extern pin_init_internal \
- --extern macros --cfg kernel
+rusttestlib-pin_init: private rustc_target_flags = $(pin_init-flags)
rusttestlib-pin_init: $(src)/pin-init/src/lib.rs rusttestlib-macros \
rusttestlib-pin_init_internal $(obj)/$(libpin_init_internal_name) FORCE
+$(call if_changed,rustc_test_library)
@@ -547,7 +560,7 @@ $(obj)/$(libmacros_name): $(src)/macros/lib.rs $(obj)/libproc_macro2.rlib \
$(obj)/libquote.rlib $(obj)/libsyn.rlib FORCE
+$(call if_changed_dep,rustc_procmacro)
-$(obj)/$(libpin_init_internal_name): private rustc_target_flags = --cfg kernel
+$(obj)/$(libpin_init_internal_name): private rustc_target_flags = $(pin_init_internal-flags)
$(obj)/$(libpin_init_internal_name): $(src)/pin-init/internal/src/lib.rs FORCE
+$(call if_changed_dep,rustc_procmacro)
@@ -570,6 +583,8 @@ rust-analyzer:
--cfgs='proc_macro2=$(proc_macro2-cfgs)' \
--cfgs='quote=$(quote-cfgs)' \
--cfgs='syn=$(syn-cfgs)' \
+ --cfgs='pin_init_internal=$(pin_init_internal-cfgs)' \
+ --cfgs='pin_init=$(pin_init-cfgs)' \
$(realpath $(srctree)) $(realpath $(objtree)) \
$(rustc_sysroot) $(RUST_LIB_SRC) $(if $(KBUILD_EXTMOD),$(srcroot)) \
> rust-project.json
@@ -642,8 +657,7 @@ $(obj)/compiler_builtins.o: $(src)/compiler_builtins.rs $(obj)/core.o FORCE
+$(call if_changed_rule,rustc_library)
$(obj)/pin_init.o: private skip_gendwarfksyms = 1
-$(obj)/pin_init.o: private rustc_target_flags = --extern pin_init_internal \
- --extern macros --cfg kernel
+$(obj)/pin_init.o: private rustc_target_flags = $(pin_init-flags)
$(obj)/pin_init.o: $(src)/pin-init/src/lib.rs $(obj)/compiler_builtins.o \
$(obj)/$(libpin_init_internal_name) $(obj)/$(libmacros_name) FORCE
+$(call if_changed_rule,rustc_library)
diff --git a/scripts/generate_rust_analyzer.py b/scripts/generate_rust_analyzer.py
index 147d0cc94068..b96d3cbe3df1 100755
--- a/scripts/generate_rust_analyzer.py
+++ b/scripts/generate_rust_analyzer.py
@@ -35,7 +35,9 @@ def generate_crates(srctree, objtree, sysroot_src, external_src, cfgs, core_edit
crates_indexes = {}
crates_cfgs = args_crates_cfgs(cfgs)
- def append_crate(display_name, root_module, deps, cfg=[], is_workspace_member=True, is_proc_macro=False, edition="2021"):
+ def append_crate(display_name, root_module, deps, cfg=None, is_workspace_member=True, is_proc_macro=False, edition="2021"):
+ if cfg is None:
+ cfg = crates_cfgs.get(display_name, [])
crate = {
"display_name": display_name,
"root_module": str(root_module),
@@ -60,7 +62,7 @@ def generate_crates(srctree, objtree, sysroot_src, external_src, cfgs, core_edit
def append_sysroot_crate(
display_name,
deps,
- cfg=[],
+ cfg=None,
edition="2021",
):
append_crate(
@@ -75,7 +77,7 @@ def generate_crates(srctree, objtree, sysroot_src, external_src, cfgs, core_edit
# NB: sysroot crates reexport items from one another so setting up our transitive dependencies
# here is important for ensuring that rust-analyzer can resolve symbols. The sources of truth
# for this dependency graph are `(sysroot_src / crate / "Cargo.toml" for crate in crates)`.
- append_sysroot_crate("core", [], cfg=crates_cfgs.get("core", []), edition=core_edition)
+ append_sysroot_crate("core", [], edition=core_edition)
append_sysroot_crate("alloc", ["core"])
append_sysroot_crate("std", ["alloc", "core"])
append_sysroot_crate("proc_macro", ["core", "std"])
@@ -90,21 +92,18 @@ def generate_crates(srctree, objtree, sysroot_src, external_src, cfgs, core_edit
"proc_macro2",
srctree / "rust" / "proc-macro2" / "lib.rs",
["core", "alloc", "std", "proc_macro"],
- cfg=crates_cfgs["proc_macro2"],
)
append_crate(
"quote",
srctree / "rust" / "quote" / "lib.rs",
["alloc", "proc_macro", "proc_macro2"],
- cfg=crates_cfgs["quote"],
)
append_crate(
"syn",
srctree / "rust" / "syn" / "lib.rs",
["proc_macro", "proc_macro2", "quote"],
- cfg=crates_cfgs["syn"],
)
append_crate(
@@ -124,7 +123,6 @@ def generate_crates(srctree, objtree, sysroot_src, external_src, cfgs, core_edit
"pin_init_internal",
srctree / "rust" / "pin-init" / "internal" / "src" / "lib.rs",
[],
- cfg=["kernel"],
is_proc_macro=True,
)
@@ -132,7 +130,6 @@ def generate_crates(srctree, objtree, sysroot_src, external_src, cfgs, core_edit
"pin_init",
srctree / "rust" / "pin-init" / "src" / "lib.rs",
["core", "pin_init_internal", "macros"],
- cfg=["kernel"],
)
append_crate(
---
base-commit: 0f61b1860cc3f52aef9036d7235ed1f017632193
change-id: 20260116-rust-analyzer-pin-init-duplication-a22d05221771
Best regards,
--
Tamir Duberstein <tamird@kernel.org>
On Fri, Jan 16, 2026 at 5:11 PM Tamir Duberstein <tamird@kernel.org> wrote:
>
> Plumb `pin-init{,-internal}` cfgs from Makefile to rust-analyzer and
> automatically interpret `--cfg <crate>=<cfg>` as applying to <crate>.
So I guess the goal is to simplify things and avoid duplicate
information, which is good, but in general commits should explain why
the change is done (i.e. not just what is done), even if it may seem
obvious (for patches you receive, then you should ask the same to
submitters! :).
In addition, for the `rust/Makefile` ones, I try to mark those as
"rust: kbuild:" where possible/reasonable -- for instance, this could
be split into two patches. The first one would be the "rust: kbuild:"
factoring out the flags into the new variables and the second would
then be the rust-analyzer one that only would need the extra two
arguments in `rust/Makefile`.
The changes themselves seem fine.
Cc'ing Kbuild as well (there is no major change here, but still, I do
it out of habit).
Thanks!
Cheers,
Miguel
On Fri, Jan 16, 2026 at 2:42 PM Miguel Ojeda
<miguel.ojeda.sandonis@gmail.com> wrote:
>
> On Fri, Jan 16, 2026 at 5:11 PM Tamir Duberstein <tamird@kernel.org> wrote:
> >
> > Plumb `pin-init{,-internal}` cfgs from Makefile to rust-analyzer and
> > automatically interpret `--cfg <crate>=<cfg>` as applying to <crate>.
>
> So I guess the goal is to simplify things and avoid duplicate
> information, which is good, but in general commits should explain why
> the change is done (i.e. not just what is done), even if it may seem
> obvious (for patches you receive, then you should ask the same to
> submitters! :).
>
> In addition, for the `rust/Makefile` ones, I try to mark those as
> "rust: kbuild:" where possible/reasonable -- for instance, this could
> be split into two patches. The first one would be the "rust: kbuild:"
> factoring out the flags into the new variables and the second would
> then be the rust-analyzer one that only would need the extra two
> arguments in `rust/Makefile`.
Sounds good, will send as two patches in v2.
> The changes themselves seem fine.
>
> Cc'ing Kbuild as well (there is no major change here, but still, I do
> it out of habit).
>
> Thanks!
>
> Cheers,
> Miguel
Thanks!
© 2016 - 2026 Red Hat, Inc.