Why is that weird? Procedural macros are compiler plugins. They get compiled for the platform you're building on, not the one you're building for, and so they need to be a separate compilation unit. In Rust, the crate is the compilation unit.
Because you can't just throw together a simple procedural macro to use in a specific project, as you can in other languages.