[PATCH 0/4] rust: add `#[macro_export_scoped]` for scoped declarative macro
Gary Guo <[email protected]>
| Newsgroups | org.kernel.vger.rust-for-linux,dev.linux.lists.driver-core,org.kernel.vger.linux-kernel |
|---|---|
| Message-ID | <[email protected]> |
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 <[email protected]> --- 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 <[email protected]>