ADR-0001: ツールチェーンは所有、依存供給は委譲する
状態: Accepted
文脈
C/C++ 向けビルドシステムの設計には3つの立場がある。
- 強制型 — ツールチェーンも依存もすべて自分のグラフに載せる(Nix, Spack, Zig)。
再現性は最高だが、世界の再構築コストが極大。ベンダ SDK は所有できない
- 調停型 — 供給を既存パッケージマネージャに委譲し、グラフと FFI に集中する
(Meson, CMake)。採用障壁は最低だが、ABI 保証は委譲先の粒度以上に細かくならない
- 新言語同伴型 — 特定言語のために設計する(Cargo)。C 依存が必要になった時点で
エスケープハッチ(
build.rs)に落ち、hermeticity を失う
決定
非対称に採る。ツールチェーンは立場1、依存供給は立場2。
根拠
- ツールチェーンをロックしなければ、ABI 検査が何に対する検査なのか定義できない。
ここは所有が必須
- 依存供給まで所有すると、Bazel と同じ導入障壁に直面する。
Bazel の重さは実行モデルではなく、全依存を BUILD ファイルに再記述させることに由来する
- 中間路線は一般に両方の欠点を継ぐ危険があるが、この分割は境界が明確である。
ツールチェーンは自分で決められるが、世界のソースは自分では書けない
帰結
- 既存パッケージは「ABI ラベル付きの不透明な外部アクション」として取り込む。
そのラベルを自分のアクションキーに畳み込むことでキャッシュの正しさを維持する
- ABI 不整合は伝播ではなく失敗として扱う。同一ライブラリが異なる ABI ラベルで
2回グラフに現れたらリンク前に停止する
- 移行の単位がターゲットになり、段階的採用が可能になる(ADR-0005)
- ABI ラベルの粒度設計が全体を左右する未決事項として残る(Q2)