[PATCH 0/4] rust: add `#[macro_export_scoped]` for scoped declarative macro

From: Gary Guo

Date: Tue Aug 11 2026 - 08:31:11 EST


Rust's declarative macro scoping rule is confusing because it was
historically purely textual scoped and the path-based scoping is added as
an afterthought.

`#[macro_export]` will make the macro available for use outside the crate,
but it also adds the macro to the root of crate. This has the issue where
it prevents us from cleanly put things in modules where they belong. Macro
2.0 is supposed to address this issue, but currently it seems that we are
unlikely to get macro 2.0 any time soon.

There is a way to approximate the scoping -- hide the macro from the crate
root using `#[doc(hidden)]`, and then re-export the macro from where they
are supposed to appear, and undo the `#[doc(hidden)]` with
`#[doc(inline)]`. We have used this approach for a few macros already.
This is not fully bullet-proof; users can still reference the items from
crate root, as it is hidden from documentation but is still present in name
resolution.

Introduce a macro `#[macro_export_scoped]`, that implements the above
trick, so people can create new properly-scoped macros easily. Also, adopt
a solution where we assign the macros non-guessable names, and then just
re-export them under intended name. This removes the possibility of
using the macro from incorrect path unintentionally.

Signed-off-by: Gary Guo <gary@xxxxxxxxxxx>
---
Gary Guo (4):
rust: macros: add `#[macro_export_scoped]`
rust: build_assert: remove macro from crate root
rust: list: convert to use `#[macro_export_scoped]`
rust: io: convert to use `#[macro_export_scoped]`

rust/kernel/build_assert.rs | 24 +++++----------
rust/kernel/configfs.rs | 4 +--
rust/kernel/firmware.rs | 4 +--
rust/kernel/io.rs | 27 +++++++----------
rust/kernel/list/arc.rs | 4 +--
rust/kernel/list/arc_field.rs | 4 +--
rust/kernel/list/impl_list_item_mod.rs | 14 ++++-----
rust/kernel/ptr.rs | 6 +---
rust/kernel/sync/atomic.rs | 2 +-
rust/macros/lib.rs | 25 ++++++++++++++++
rust/macros/macro_export_scoped.rs | 53 ++++++++++++++++++++++++++++++++++
11 files changed, 108 insertions(+), 59 deletions(-)
---
base-commit: 6b8c8af514d739d0335f5579b585e02babe8a727
change-id: 20260811-macro_export_scoped-5ce38b5db968

Best regards,
--
Gary Guo <gary@xxxxxxxxxxx>