dowel

ADR-0001: ツールチェーンは所有、依存供給は委譲する

状態: Accepted

文脈

C/C++ 向けビルドシステムの設計には3つの立場がある。

  1. 強制型 — ツールチェーンも依存もすべて自分のグラフに載せる(Nix, Spack, Zig)。 再現性は最高だが、世界の再構築コストが極大。ベンダ SDK は所有できない
  2. 調停型 — 供給を既存パッケージマネージャに委譲し、グラフと FFI に集中する (Meson, CMake)。採用障壁は最低だが、ABI 保証は委譲先の粒度以上に細かくならない
  3. 新言語同伴型 — 特定言語のために設計する(Cargo)。C 依存が必要になった時点で エスケープハッチ(build.rs)に落ち、hermeticity を失う

決定

非対称に採る。ツールチェーンは立場1、依存供給は立場2。

根拠

  • ツールチェーンをロックしなければ、ABI 検査が何に対する検査なのか定義できない。 ここは所有が必須
  • 依存供給まで所有すると、Bazel と同じ導入障壁に直面する。 Bazel の重さは実行モデルではなく、全依存を BUILD ファイルに再記述させることに由来する
  • 中間路線は一般に両方の欠点を継ぐ危険があるが、この分割は境界が明確である。 ツールチェーンは自分で決められるが、世界のソースは自分では書けない

帰結

  • 既存パッケージは「ABI ラベル付きの不透明な外部アクション」として取り込む。 そのラベルを自分のアクションキーに畳み込むことでキャッシュの正しさを維持する
  • ABI 不整合は伝播ではなく失敗として扱う。同一ライブラリが異なる ABI ラベルで 2回グラフに現れたらリンク前に停止する
  • 移行の単位がターゲットになり、段階的採用が可能になる(ADR-0005)
  • ABI ラベルの粒度設計が全体を左右する未決事項として残る(Q2)