构建缓存

Cargo会把构建输出保存在 "target" 文件夹中。默认情况下这个文件夹是你的 workspace 根目录下的 target 文件夹。 如果要改变输出位置,可以设置 CARGO_TARGET_DIR environment variable "环境变量"、 build.target-dir config参数,或者 --target-dir 命令行标志(flag)。

这个文件夹的布局取决于你是否使用 --target 标志来为特定平台构建。如果没有设置 --target 标志,Cargo 会按宿主机的架构进行构建。 输出文件保存在target文件夹,每个特定编译设置 (profile) 的输出文件会在放在单独的子文件夹中。

文件夹描述
target/debug/包含 dev 编译设置的输出文件。
target/release/包含 release 编译设置 (构建时带 --release 选项) 的输出文件。
target/foo/包含 foo 编译设置 (构建时带 --profile=foo 选项) 的输出文件。

由于历史原因, devtest 编译设置的输出文件被放在 debug 文件夹中, releasebench 编译设置的输出文件被放在 release 文件夹。用户自定义编译设置的输出文件放在同名的文件夹中。

当为另一种架构 (非宿主架构,命令行带 --target 参数) 而构建,输出文件会放在带有目标架构名字的文件夹中:

文件夹例子
target/<triple>/debug/target/thumbv7em-none-eabihf/debug/
target/<triple>/release/target/thumbv7em-none-eabihf/release/

注意: 如果没有使用 --target,Cargo会把你的依赖共享给构建脚本(build scripts)和过程宏(proc macros)使用。 RUSTFLAGS 会在每次 rustc 调用时使用。 如果使用了 --target 标志,构建脚本和过程宏会为宿主架构单独构建,不会获取 RUSTFLAGS 中的参数。

在每个编译设置(profile)的输出文件夹中 (比如 debugrelease),制品会被放在以下几个文件夹中:

文件夹描述
target/debug/包含该包的制品 (二进制可执行文件库文件).
target/debug/examples/包含示例的制品 example targets.

一些命令会把生成文件放在 target目录的顶层:

目录描述
target/doc/包含 rustdoc 生成的文档 (cargo doc 命令)。
target/package/包含 cargo packagecargo publish 命令生成的文件。

Cargo还会生成构建过程需要的其他文件和文件夹,它们的组织结构看做Cargo内部项,可能会更改。其中几个文件夹:

目录描述
target/debug/deps/依赖以及其他制品。
target/debug/incremental/rustc 增量编译输出,加速构建过程的一些缓存文件。
target/debug/build/构建脚本 的输出。

Dep-info files

还有一个后缀为 .d 的 "依赖信息" 文件(dep info),类似Makefile,记录了再次构建所需的文件依赖。 这个文件用于提供给外部的构建系统,判断是否需要再次执行Cargo。文件中的文件路径在默认情况下都是绝对路径。如何设置为相对路径见 build.dep-info-basedir

# dep-info 文件的例子: target/debug/foo.d
/path/to/myproj/target/debug/foo: /path/to/myproj/src/lib.rs /path/to/myproj/src/main.rs

共享缓存

第三方工具 sccache 可以跨工作空间共享构建依赖。

通过 cargo install sccache 下载 sccache。在执行Cargo前,将 RUSTC_WRAPPER 环境变量设置为 sccache。 如果你用的是bash,那么可以把 export RUSTC_WRAPPER=sccache 添加到 .bashrc 。 或者你可以在 Cargo配置文件 中设置 build.rustc-wrapper 。查看sccache的文档来获取更多细节。