如何正确注册 Rust 编译器插件?

How do I properly register a Rust compiler plugin?

我一直在努力让 Rust 编译器插件正确注册。

我有一个名为 rust_to_glsl 的单独箱子,它位于我的主要代码的子目录中。

rust_to_glsl/src/lib.rs 文件中我有以下内容

#![feature(plugin_registrar)]
#![feature(rustc_private)]
#![crate_type="dylib"]

extern crate rustc;
extern crate syntax;

#[doc(hidden)]
#[plugin_registrar]
pub fn registrar(registry: &mut rustc::plugin::Registry) {
    println!("Test");
    registry.register_macro("to_glsl", expand);
}

此外,我已经定义了实际的 expand 函数。

src/main.rs 中,我正在努力引入 plugin/crate。

#![feature(plugin)]
#![plugin(rust_to_glsl)]

然后我尝试在此处使用该宏:

fn main() {
    let glsl = to_glsl!(
        const x: uint = 5;

        static texture: &Texture2d = 1;

        fn hello() {
            min(5, 3 * 1 + 5)
        }
    );

    println!("{}", glsl);
}

如果我编译它,我会得到这个错误:

Compiling opal v0.1.0 (file:///Users/chris/Code/Rust/gl)
src/main.rs:2:11: 2:23 error: can't find crate for `rust_to_glsl`
src/main.rs:2 #![plugin(rust_to_glsl)]

在构建过程中,我注意到 rust_to_glsl 没有被编译(cargo build)。

如果我添加 extern crate rust_to_glsl,那么它会编译 rust_to_glsl。 但随后夸夸其谈地说

49:23 error: macro undefined: 'to_glsl!'
src/main.rs:49     let glsl = to_glsl!(

我不确定我是否需要 use 宏或者是否所有宏都是全局的。

原来我需要将它添加到 rust_to_glsl/Cargo.toml

[lib]
name = "rust_to_glsl"
crate-type = ["dylib"]

然后将其包含为正常的 dependency

而不是 build-dependency