cargo buildのコンパイルオプションについて

# はじめに

本記事の内容は[The Cargo Book](https://doc.rust-lang.org/cargo/index.html)の[3.5. Profiles](https://doc.rust-lang.org/cargo/reference/profiles.html)と[4.2.2. cargo build](https://doc.rust-lang.org/cargo/commands/cargo-build.html)を引用してcargo buildのプロファイルについて紹介します。
詳細は引用元をご覧いただくようお願い致します。


# Cargoに組み込まれているプロファイル

Cargoには`dev`, `release`, `test`, `bench`の4つのプロファイルが組み込まれており、ビルドするターゲットと指定したコンパイルオプションに応じて自動でプロファイルが選択されます。
選択されるプロファイルは以下の表の通りです。（[引用元](https://doc.rust-lang.org/cargo/commands/cargo-build.html)）

| Target | Default Profile | `--release` Profile |
|:-:|:-:|:-:|
| lib, bin, example | `dev` | `release` |
| test, bench, or any target in "test" or "bench" mode | `test` | `bench` |



また、それぞれのプロファイルはデフォルトで以下のような設定となっています。（[引用元](https://doc.rust-lang.org/cargo/reference/profiles.html#default-profiles)）
個別のプロファイル設定については次節で紹介します。

|  | dev | release | test | bench |
|:-:|:-:|:-:|:-:|:-:|
| opt-level | 0 | 3 | 0 | 3 |
| debug | true | false | 2 | false |
| debug-assertions | true | false | true | false |
| overflow-checks | true | false | true | false |
| lto | false | false | false | false |
| panic | 'unwind' | 'unwind' | 'unwind' | 'unwind' |
| incremental | true | false | true | false |
| codegen-units | 256 | 16 | 256 | 16 |
| rpath | false | false | false | false |


プロファイルの設定は`Cargo.toml`の[profile]テーブルで変更することが出来ます。（[引用元](https://doc.rust-lang.org/cargo/reference/profiles.html#profiles)）

```toml:Cargo.toml
[profile.dev]
opt-level = 1               # Use slightly better optimizations.
overflow-checks = false     # Disable integer overflow checks.
```


# プロファイル設定について

## [opt-level](https://doc.rust-lang.org/cargo/reference/profiles.html#opt-level)

最適化レベルを指定します。Rustには以下の6種類の最適化レベルが存在します。

- `0` : 最適化なし + cfg(debug_assertions) をオンにする
- `1` : 基本的な最適化
- `2` : いくつかの最適化
- `3` : 全ての最適化
- `"s"` : バイナリサイズの最適化
- `"z"` : バイナリサイズの最適化（ループのベクタライズをオフにする）

## [debug](https://doc.rust-lang.org/cargo/reference/profiles.html#debug)

コンパイルされたバイナリに含まれるデバッグ情報の量を指定します。

- `0` or `false` : 一切のデバッグ情報を含まない
- `1` : ラインテーブルのみ
- `2` or `true` : 全てのデバッグ情報

## [debug-assertions](https://doc.rust-lang.org/cargo/reference/profiles.html#debug-assertions)

`cfg(debug_assertions)`による条件付きコンパイルのオン/オフを切り替えます。

- `true` : 有効
- `false` : 無効

## [overflow-checks](https://doc.rust-lang.org/cargo/reference/profiles.html#overflow-checks)

実行時の整数オーバーフローの動作を指定します。有効の場合、オーバーフローが発生するとpanicします。

- `true` : 有効
- `false` : 無効

## [lto](https://doc.rust-lang.org/cargo/reference/profiles.html#lto)

リンク時の最適化を有効にするオプションです。
※「薄い」「厚い」はあまり正しい表現ではないと思います。よい表現があれば教えていただけると幸いです。

- `false` : ローカルクレートのみ「薄い」リンク時最適化を実行します
- `true` or `"fat"` : 「厚い」リンク時最適化を実行します
- `thin` : 「薄い」リンク時最適化を実行します
- `off` : リンク時の最適化を行いません

## [panic](https://doc.rust-lang.org/cargo/reference/profiles.html#panic)

パニック時の動作を指定します。

- `"unwind"` : パニック時にスタックを巻き戻します
- `"abort"` : パニック時にプロセスを終了します

## [incremental](https://doc.rust-lang.org/cargo/reference/profiles.html#incremental)

インクリメンタルコンパイルを有効にするかを指定します。

- `true` : 有効
- `false` : 無効

## [codegen-units](https://doc.rust-lang.org/cargo/reference/profiles.html#codegen-units)

コード生成時に何個の「コード生成ユニット」に分割するかを指定します。コード生成ユニットが多いほどコンパイル時間が短縮される可能性がありますが、最適化を阻害する可能性があります。

## [rpath](https://doc.rust-lang.org/cargo/reference/profiles.html#rpath)

[rpath](https://en.wikipedia.org/wiki/Rpath)を有効にするかを指定します。