dowel

ADR-0005: 移行は動的抽出のみ。静的翻訳は行わない

状態: Accepted

文脈

既存ビルドシステムからの移行機能を持つか。Node 系のツールには移行機能があり、 採用障壁を下げる目的では機能している。

決定

既存マニフェストの静的翻訳は行わない。実行結果の動的抽出のみを行い、 機能の重心を生成(import)ではなく等価性検査(verify)に置く。

根拠

  • Node 系で移行が成立するのは、正本が package.json という宣言的データだから。 CMake の正本はプログラムであり、実際の構成は実行して初めて確定する
  • CMakeLists.txt の構文的変換は if(WIN32)、find_package、ユーザ定義マクロで破綻し、 修正コストが書き直しを上回る
  • 一方、実行結果を構造化データとして取り出す口は既に存在する (CMake File API、meson introspect、bazel aquery)
  • 粗い移行結果は害になりうる。全フラグが平坦化され意図が失われたマニフェストが 生成され、そのままコミットされて保守対象になる経路が最悪である

帰結

  • dowel migrate import の出力は成果物ではなく下書き。未検証マークを付ける
  • dowel migrate verify は既存の compile_commands.json と自システムのアクション集合を 比較して差分を報告する。アクショングラフを既に持つため実装コストが低い
  • 移行は一度きりの変換ではなく、段階的移植中の継続的な等価性検査として提供される
  • ADR-0001 により未移植部分は外部依存として取り込めるため、 移行の単位はターゲットとなる
  • 抽出できるのはプログラムの一射影であり、条件分岐は失われる。これは原理的な限界として受容する
  • 本システムが正当に拒否するマニフェストが生成される場合の扱いが未決(Q6)

優先度

verify から着手し、import は CMake File API のみに絞る。 Bazel aquery は規模前提が異なるため優先度を下げる。静的翻訳は実装しない。