第22章 Cargo 构建缓存
target 目录。要修改 target-dir 的位置,可以设置 CARGO_TARGET_DIR 环境变量、build.target-dir 配置值,或使用 --target-dir 命令行标志。要修改 build-dir 的位置,可以设置 CARGO_BUILD_BUILD_DIR 环境变量或build.build-dir 配置值。
制品分为两大类:
- 最终构建制品
- 最终构建制品是面向 Cargo 最终用户的输出
- 例如 bin crate 的二进制文件、
cargo doc的输出、Cargo--timings报告 - 存储在 target-dir 中
- 中间构建制品
- 中间构建制品是 Cargo 和 Rust 编译器内部使用的
- 最终用户通常不需要与中间构建制品交互
- 存储在 Cargo build-dir 中
--target 标志为特定平台构建。如果未指定 --target,Cargo 将以针对宿主架构构建的模式运行。输出会存放在目标目录的根目录下,每个 profile 存放在独立的子目录中:
| 目录 | 说明 |
|---|---|
target/debug/ | 包含 dev profile 的输出。 |
target/release/ | 包含 release profile 的输出(使用 --release 选项)。 |
target/foo/ | 包含 foo profile 的构建输出(使用 --profile=foo 选项)。 |
由于历史原因,dev 和 test profile 的输出存放在 debug 目录中,release 和 bench profile 的输出存放在 release 目录中。用户自定义的 profile 则存放在与 profile 同名的目录里。
使用 --target 为其他目标平台构建时,输出会放到以该 target 命名的目录下:
| 目录 | 示例 |
|---|---|
target/<triple>/debug/ | target/thumbv7em-none-eabihf/debug/ |
target/<triple>/release/ | target/thumbv7em-none-eabihf/release/ |
注意:不使用
--target时,Cargo 会让构建脚本和 proc macro 与你的依赖共享编译结果,且每次调用rustc都使用同一份RUSTFLAGS。而使用--target时,构建脚本和 proc macro 会单独构建(针对宿主架构),不共享RUSTFLAGS。
在 profile 目录(如 debug 或 release)内,构建产物按如下目录存放:
| 目录 | 说明 |
|---|---|
target/debug/ | 存放所构建包的输出,即二进制可执行文件和library target。 |
target/debug/examples/ | 存放example target。 |
有些命令会把输出放到 target 目录顶层下的专用目录中:
| 目录 | 说明 |
|---|---|
target/doc/ | 存放 rustdoc 文档(cargo doc)。 |
target/package/ | 存放 cargo package 的输出。 |
Cargo 还会在 build-dir 中创建构建过程所需的若干其他目录和文件。build-dir 的目录结构被视为 Cargo 的内部实现,可能会变更。其中一些目录包括:
| 目录 | 说明 |
|---|---|
<build-dir>/debug/deps/ | 依赖项及其他制品。 |
<build-dir>/debug/incremental/ | rustc 的增量输出,用于加速后续构建的缓存。 |
<build-dir>/debug/build/ | 构建脚本的输出。 |
Dep-info 文件
每个编译制品旁边都有一个以 .d 为后缀的文件,称为“dep info”文件。该文件采用类似 Makefile 的语法,列出了重建制品所需的所有文件依赖关系。它供外部构建系统使用,以便检测是否需要重新执行 Cargo。文件中的路径默认为绝对路径。参见
build.dep-info-basedir 配置选项以使用相对路径。
# target/debug/foo.d 中示例 dep-info 文件
/path/to/myproj/target/debug/foo: /path/to/myproj/src/lib.rs /path/to/myproj/src/main.rs
共享缓存
可以使用第三方工具 sccache 在不同 workspace 之间共享已构建的依赖项。
配置 sccache 的方法是通过 cargo install sccache 安装,并在调用 Cargo 前将环境变量 RUSTC_WRAPPER 设置为 sccache。如果使用 bash,建议在
.bashrc 中添加 export RUSTC_WRAPPER=sccache。或者,也可以在 Cargo
配置 中设置 build.rustc-wrapper。更多细节请参考 sccache 文档。