Open3

Reposoup: シンボルに対応したヘッダファイル集合の導出

okuokuokuoku

ライブラリのABI抽出のために 監視対象のファイル集合 (パッケージ)を導出したい。これを行えると、リポジトリの更新があるたびにABI抽出を行わなくてもよくなるので処理を効率化できる。

以下のステップを踏む必要がある:

  1. ライブラリがエクスポートしているシンボル(エントリポイント)を求める -- これはライブラリファイルから静的に導出できる
  2. エントリポイントをエクスポートしているヘッダを探す -- これは https://zenn.dev/link/comments/765662cb6b7470 でヘッダ → シンボル変換を実装したのが使える
  3. 無関係なヘッダを消す(消し込み) -- C/C++標準ライブラリのような単なるビルド依存は監視する必要はない
okuokuokuoku

シンボル → ヘッダ対応 のフィルタリング

SDLを初めとした一般的なライブラリには "公開ヘッダ" と "プライベートヘッダ" の概念があり、 シンボルが宣言されたヘッダが即ち利用に必要なヘッダではない 可能性がある。つまり、ユーザーから見たときに "シンボルが宣言されたヘッダ" != "シンボルを使用するときに #include すべきヘッダ" と言える。

率直にいってこれには上手い方法が浮かばない。今回は手動で優先順位付けをして集合を構築するアルゴリズムとする。つまり、Android NDKであれば、

  1. Linuxカーネルヘッダ群
  2. 標準ライブラリ + POSIX群
  3. Android API群 / Khronos API群

のような優先順位を付け、 "消し込み" を行う。例えば、Khronos API群のヘッダはC標準ライブラリのヘッダに依存しているため、Khronos APIの依存ヘッダにはC標準ライブラリの一部が含まれることになる。これらを取り除き、純粋にKhronosのヘッダだけ残す処理(基準)が必要になる。

全てのライブラリにいちいち優先順位を付けるのは大変なので、ライブラリ間は充分に独立であることを期待して、

  • ライブラリを標準ライブラリとそうでないものにざっくり分類する
  • 全てのライブラリは標準ライブラリに依存していると仮定し消し込みを行う
  • それでも共有されてしまったヘッダは手動で依存関係を設定することで上下関係を明確にする

という処理を行うことになる。