From bb9fc46a068ae8de4286b7672da559eb23a6263b Mon Sep 17 00:00:00 2001 From: sunface Date: Wed, 23 Feb 2022 10:32:01 +0800 Subject: [PATCH] update cargo profile --- contents/cargo/reference/profiles.md | 48 +++++++++++++++++++++++++++- 1 file changed, 47 insertions(+), 1 deletion(-) diff --git a/contents/cargo/reference/profiles.md b/contents/cargo/reference/profiles.md index 6a47f349..ebbba7fd 100644 --- a/contents/cargo/reference/profiles.md +++ b/contents/cargo/reference/profiles.md @@ -45,6 +45,15 @@ cargo build --profile release-lto 与默认的 profile 相同,自定义 profile 的编译结果也存放在 [`target/`](https://course.rs/cargo/guide/build-cache.html) 下的同名目录中,例如 `--profile release-lto` 的输出结果存储在 `target/release-lto` 中。 +## 选择 profile + +- 默认使用 `dev` : `cargo build`, `cargo rustc`, `cargo check`, 和 `cargo run` +- 默认使用 `test`: `cargo test` +- 默认使用 `bench`: `cargo bench` +- 默认使用 `release`: `cargo install`, `cargo build --release`, `cargo build --release` +- 使用自定义 profile: `cargo build --profile release-lto` + + ## profile设置 下面我们来看看 profile 中可以进行哪些优化设置。 @@ -213,6 +222,43 @@ opt-level = 0 codegen-units = 256 ``` -如果是自定义 profile,那它会自动从当前正在使用的 profile 继承相应的设置,且不会修改。 +如果是自定义 profile,那它会自动从当前正在使用的 profile 继承相应的设置,但不会修改。 + + +## 重写profile +我们还可以对特定的包使用的 profile 进行重写(override): +```toml +# `foo` package 将使用 -Copt-level=3 标志. +[profile.dev.package.foo] +opt-level = 3 +``` + +这里的 `package` 名称实际上是一个 [`Package ID`](https://course.rs/cargo/reference/package-id.html),因此我们还可以通过版本号来选择: `[profile.dev.package."foo:2.1.0"]`。 + +如果要为所有依赖包重写(不包括工作空间的成员): +```toml +[profile.dev.package."*"] +opt-level = 2 +``` + +为构建脚本、过程宏和它们的依赖重写: +```toml +[profile.dev.build-override] +opt-level = 3 +``` + +> 注意:如果一个依赖同时被正常代码和构建脚本所使用,当 `--target` 没有指定时,Cargo 只会构建该依赖一次。 +> +> 但是当使用了 `build-override` 后,该依赖会被构建两次,一次为正常代码,一次为构建脚本,因此会增加一些编译时间 + +重写的优先级按以下顺序执行(第一个匹配获胜): + +- `[profile.dev.package.name]`,指定名称进行重写 +- `[profile.dev.package."*"]`,对所有非工作空间成员的 package 进行重写 +- `[profile.dev.build-override]`,对构建脚本、过程宏及它们的依赖进行重写 +- `[profile.dev]` +- Cargo 内置的默认值 + +重写无法使用 `panic`、`lto` 或 `rpath` 设置。