This seems an old topic but I lose track of its most recent progress. Simply speaking I'd to define macros in a module (not necessarily root module) inside a crate and use it from another crate. Currently the only way to do this seems #[macro_export] which exports the macro at crate root, not the module where it is defined.
By the way I've seen several hacks using #[macro_export] with hashed macro identifiers but none of them can avoid the crate root namespace pollution. They make it hard, but not impossible, to access the hashed identifiers.
How does this allow you to use the macro from a different crate? You can't pub use a non-macro_export macro. You can pub(crate) use or pub(super) use it, but these don't export the macro to a different crate?
Ultimately there must be something exported at the crate root unless you define the macro in a separate crate and re-export it. You can make it difficult to use and hide it from documentation at the crate root, however.