在 Fuchsia 上使用 cargo

Rust 生态系统中的许多工具认为你在使用 cargo 。这些工具,在我们的构建中没有对应的,倒是有一个公用程序来生成 Cargo.toml 文件。你可以运行 cargo (例如 cargo check)来使用它。

这个功能由志愿者维护。 GN 和 Cargo 有一些不互相匹配的设计,可能导致生成的 Cargo.toml 文件完全不能工作或者需要手动调整。因此,cargo 在 Fuchsia 树里是不受官方支持的; 可能时不时会中断。

生成 Cargo.toml 文件 {#cargo-toml-gen}

为了生成基于 GN 构建图的 cargo 文件,要把--cargo-toml-gen 参数添加到 fx set 命令中或者是 //build/rust:cargo_toml_gen 目标指向 $OUT_DIR/args.gnuniverse_package_labels。这会让 gn gen 多增加几秒钟。确保在更新设置之后完整运行一次 fx build

  1. fx set PRODUCT.BOARD --cargo-toml-gen <other fx args>
  2. fx build

注意: 如果一个 fx build 需要一个 Cargo.toml 来完成,比如在一个例子里, cbindgen 需要为了一个 Rust crate 而运行以产生新的 C 绑定,你可能需要使用 //build/rust:cargo_toml_gen 构建目标来替代。这个目标将只构建 Cargo.toml 文件。

大多数编辑器都要求一个靠近 src/ 目录的 Cargo.toml 文件。可以使用下边的命令来产生这些文件的符号链接,//garnet/foo/path/to/target:label 是你期望的 GN 目标工作的路径:

  1. fx gen-cargo garnet/foo/path/to/target:some_label

注意: 上边的说明不适用于 rustc_staticlib 目标,例如,用于生成 C 绑定的 Rust crates 一般都使用了 rustc_staticlib 目标模板。对于 rustc_staticlib 目标,你应该使用下面的命令来替代。

  1. fx gen-cargo garnet/foo/path/to/target:_some_label_rustc_static

要注意这个标签必须指向一个 rustc_... GN template(而非一个 Fuchsia 包或者其它 GN 目标)。例如:

  1. rustc_binary("some_label") {
  2. ...
  3. }

生成 .cargo/config 文件 {#cargo-config-gen}

一些插件要求有一个 .cargo/config 文件来允许 cargo 正确的在 Fuchsia 上进行操作(例如,运行 cargo check)。简易生成这个文件的方式是使用 fargo 工具。

  1. 安装 rustup
  2. 运行下边的脚本命令配置 rustup 使用 Fuchsia Rust 工具链:

    1. rustup toolchain link fuchsia $($FUCHSIA_DIR/scripts/youcompleteme/paths.py VSCODE_RUST_TOOLCHAIN)
    2. rustup default fuchsia
  3. 参照 fargo 入门说明,在你的 $FUCHSIA_DIR 目录中克隆并安装 fargo 工具。

  4. 创建你的配置:

    1. cd $FUCHSIA_DIR && fargo write-config
    2. # 要注意 fargo readme 中关于架构改变的注意事项
    3. # https://fuchsia.googlesource.com/fargo/#creating-a-cargo_config