- Rust 1.97.0 stable リリースでは、コンパイル成果物のシンボル生成方式とビルド警告の処理フローが変更され、
rustup update stable でアップデート可能
- symbol mangling v0 が stable のデフォルトとなり、Rust 専用のシンボル名体系へ移行。従来の Itanium ABI ベースの方式は廃止方向へ進む
- Cargo は
RUSTFLAGS=-Dwarnings の代わりに CARGO_BUILD_WARNINGS で警告を allow、warn、deny として制御でき、CI とローカルビルドのポリシーを分けやすくなる
- rustc はリンクが成功した場合でもリンカー出力を
linker_messages 警告として表示する。この lint は現在 warnings lint group の影響を受けない
- 標準ライブラリには、
RepeatN の Default、UEFI の std::fs::File に対する Send、整数・NonZero のビットメソッド、const context における char::is_control の安定化が含まれる
Rust 1.97.0 アップデート
- Rust 1.97.0 は stable リリースであり、既に
rustup で Rust をインストールしているユーザーは、次のコマンドでアップデートできる
rustup update stable
stable で変わったコンパイル・ビルド動作
-
symbol mangling v0 のデフォルト有効化
- Rust がオブジェクトファイルやバイナリへコンパイルされるとき、関数や static など各項目はグローバルに一意な symbol を持つ必要がある
- 異なる Rust プログラムを一緒にリンクする際の衝突を避けるため、Rust は元の項目名にモジュールパス、定義元 crate、ジェネリクスなどの文脈を含めて名前をマングリングする
- 従来のマングリングは、C++ でも使われることがある Itanium ABI に基づいていた
- 新方式はジェネリックパラメータのインスタンス化値を保持し、一部だけ Itanium ABI を使っていた不整合のためにカスタムのデマングリングが依然として必要だった問題を減らす
- Rust 1.59 から
-Csymbol-mangling-version=v0 で Rust 専用のマングリング方式を選択でき、2025年11月から nightly のデフォルトとして適用されていた
- Rust 1.97 ではこの方式が stable Rust のデフォルトとなり、legacy マングリングは nightly でのみ有効化できる
- 現在の計画は legacy マングリングを完全に削除すること
- 詳細は以前の記事 switching to v0 mangling on nightly で確認できる
-
Cargo の警告制御
- CI で警告をビルド失敗として扱うことは一般的な慣行であり、従来は通常
RUSTFLAGS=-Dwarnings が使われていた
- Rust 1.97 から Cargo が警告とビルド成功の関係を直接制御する
allow: 警告を隠す
warn: 失敗にはせず表示するデフォルト値
deny: 警告を拒否し、ビルド失敗として扱う
- この機能は Cargo の設定で動作が決まるため、基本ビルドキャッシュを無効化しない
- リファクタリング後にエラーを修正している間、警告ノイズを一時的に減らしたい場合は、次のように実行できる
CARGO_BUILD_WARNINGS=allow cargo check
- CI では
CARGO_BUILD_WARNINGS=deny を設定して警告を拒否できる
--keep-going と一緒に使うと、最初に失敗した package で停止せず、すべてのエラーと警告を収集できる
- 詳細な設定は Cargo の
build.warnings documentation にある
-
リンカー出力のデフォルト表示
- rustc はユーザーの代わりに linker を呼び出し、従来は link が成功すると linker 出力をデフォルトで隠していた
- Rust 1.97 から linker message がデフォルトで表示され、次のような warning lint として出力される
warning: linker stderr: ignoring deprecated linker optimization setting '1'
|
= note: `#[warn(linker_messages)]` on by default
- rustc は false positive や意図された動作と診断された一般的な linker message をフィルタリングする
- nightly でこの出力を隠さないようにした後、複数の不具合が修正された
- 現在
linker_messages は特殊な lint であり、warnings lint group の影響を受けない
- rustc が linker 出力を精密に制御できない場合は一般的で、出力が一部の platform でのみ現れることもある
- linker の false positive 出力と思われる場合は issue を提出できる
- 警告を隠すには lint level を
allow に設定でき、Cargo.toml に次の lints section を追加できる
[lints.rust]
linker_messages = "allow"
安定化された API
- Rust 1.97 で次の API が stable として安定化された
- 以前から stable だった
char::is_control は、現在 const context でも stable となっている
関連変更ログ
- 全体の変更点は Rust、Cargo、Clippy それぞれの変更ログで確認できる
1件のコメント
Lobste.rsの意見
Rust 1.97でCargoが警告とビルド成功可否の関係を制御できるようになったのは、とても良い新機能だと思う
リファクタリング後にエラーを直している間、警告が邪魔なら
CARGO_BUILD_WARNINGS=allow cargo checkで一時的に隠せるし、CIではCARGO_BUILD_WARNINGS=denyで警告を失敗扱いにできる。--keep-goingと一緒に使えば、最初に失敗したパッケージで止まらず、すべてのエラーと警告を集められるアップグレードは少し見送ったほうがよいかもしれない。誤コンパイルバグがあるようだ
https://github.com/rust-lang/rust/issues/159035
https://github.com/llvm/llvm-project/pull/208683
すごい。パターン型の実装進捗を要約してくれる人がいるのか気になる
残念ながらnever typeは今回も安定化されなかった。次のリリースに期待したい