1 ポイント 投稿者 GN⁺ 4 시간 전 | 1件のコメント | WhatsAppで共有
  • Rust 1.97.0 stable リリースでは、コンパイル成果物のシンボル生成方式とビルド警告の処理フローが変更され、rustup update stable でアップデート可能
  • symbol mangling v0 が stable のデフォルトとなり、Rust 専用のシンボル名体系へ移行。従来の Itanium ABI ベースの方式は廃止方向へ進む
  • Cargo は RUSTFLAGS=-Dwarnings の代わりに CARGO_BUILD_WARNINGS で警告を allowwarndeny として制御でき、CI とローカルビルドのポリシーを分けやすくなる
  • rustc はリンクが成功した場合でもリンカー出力を linker_messages 警告として表示する。この lint は現在 warnings lint group の影響を受けない
  • 標準ライブラリには、RepeatNDefault、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
  • rustup がない場合は、Rust ウェブサイトの rustup インストールページから入手できる
  • 詳細な変更点は detailed release notes for 1.97.0 にまとめられている
  • 今後のリリーステストに参加するには、rustup default beta または rustup default nightly で beta/nightly チャンネルを使用でき、見つけたバグは Rust issue tracker に報告できる

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

関連変更ログ

1件のコメント

 
GN⁺ 4 시간 전
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

    • 興味深いことに、この誤コンパイルは過去10リリースの間ずっと存在していたが、以前は少しだけ範囲外を読んでいたのが、今ではずっと大きく範囲外を読むようになってセグフォルトを起こしているようだ
    • LLVMのバグだった。幸い、修正はかなり単純そうに見える
      https://github.com/llvm/llvm-project/pull/208683
  • すごい。パターン型の実装進捗を要約してくれる人がいるのか気になる

  • 残念ながらnever typeは今回も安定化されなかった。次のリリースに期待したい

    • 「never typeは安定化日から名前を取った」という冗談も、もうそろそろ旬を過ぎつつある
    • コンパイラチームのメンバーの一人がRustWeekでnever typeについて発表していた。安定化の見通しをよりよくつかむ助けになるかもしれないので、見ることを勧める: https://www.youtube.com/watch?v=3jM4cnEVrLc