Open2

Reposoup: プロジェクトリサーチツールの整理

okuokuokuoku

ゴールデンウイークいっぱいを掛けてリサーチツールの整理をすることにした。Reposoupのリサーチツールは:

  • 各ソースコードのプロジェクト(= Git submodule)へのアサイン
  • コマンドラインの収集とCコンパイラに渡されるオプションの解析
  • 成果物とソースコードの対応

を調査する。で、調査手法がいままではビルドトレースしか無かったが、Visual StudioのbinlogやCMake file APIを追加しようとしている。

調査したデータはclangdの抽象化や静的解析の追加に使用する。

okuokuokuoku

CMakeプロジェクトの解析準備

今回はlibpeerを試してみる https://github.com/sepfy/libpeer

クエリの実施

クエリファイルはとりあえずWarpの https://github.com/okuoku/warpsdk/blob/f621682ef900b78291cf906c6e2340992dc31eb7/query.json を流用する。

$ mv query.json .cmake/api/v1/query/client-reposoup/

クエリがsubprojectに浸透しない問題

うーむ... 2passでやるしかない。。?3.xの最終版である 3.31 では CMAKE_CONFIG_DIR https://cmake.org/cmake/help/latest/envvar/CMAKE_CONFIG_DIR.html があるので強制的にクエリをinjectするのは簡単にできる。

とりあえず手動で配置:

$ mkdir -p cjson-prefix/src/cjson-build/.cmake/api/v1/query/client-reposoup/
$ cp .cmake/api/v1/query/client-reposoup/query.json cjson-prefix/src/cjson-build/.cmake/api/v1/query/client-reposoup/

これで ninja -t clean して再度ビルドするとconfigureが再度走り、クエリが実施された。つまり、

  1. 一旦普通にビルドする
  2. CMakeCache.txt の場所を記録する
  3. ビルドツリーを一旦消す
  4. 記録した CMakeCache.txt のある各ディレクトリにクエリを配置する
  5. 再度ビルドする
  6. 生成されたクエリを回収

というプロセスが必要になる。 CMAKE_CONFIG_DIR は地味に偉大なんだな。。とりあえず簡単なツールを書いた:

https://github.com/okuoku/rs-checker-proto/commit/b3bcd226a3c6b842d055dde2e993b3c4d6968f1a

あと、 ninja -t compdb してビルドファイルをjsonに変換する必要もある。 今回は一旦ヒューリスティック無しで挑戦する。