msbuildのbinlogをJSONか何かに変換したい

最近のMSBuildには実行トレースをバイナリ形式でログに保存できる /binaryLogger
オプションがある。これを読みとって何とか compile_commands.json
のようなビルドログを生成したい。
直接的に出力するLoggerとしては https://github.com/0xabu/MsBuildCompileCommandsJson がある。これをオフラインでやりたい。
... Xcodeの方が割と厳しくて、 set-xcode-analyzer
でダミーに差し替えるか、xcprettyがまだ動くことに賭けるか。。まぁ手元の環境ではCMake以外の方法でXcodeのプロジェクトを作ることが無いので、手動でXcodeプロジェクトを書き換えるのが簡単だとは思うけど。

.binlog
の生成
chcp 850
cmake --build . --target clean --config RelWithDebInfo
msbuild /bl:pass0.binlog /p:Configuration=RelWithDebInfo /p:Platform=Win32 fakegl.sln
幸い、日本語のコードページは英語とは違うので、 chcp
コマンドで適当なコードページに変更すると出力メッセージが英語に統一される。
/bl
オプションは /binaryLogger
の省略系。追加のパラメタは https://msbuildlog.com/#commandline に説明がある。

環境変数、カレントディレクトリ、プロパティの収集は不要か?
MSBuildが出力するログ TaskCommandLineEventArgs
はコマンドラインしか含んでいない。
MSBuildにおいて環境変数はプロパティなのでプロパティを追うことになる。 PropertyInitialValueSetEventArgs
とか PropertyReassignmentEventArgs
が相当する。 ...必要かなコレ。。常識的な msbuild プロジェクトは LIB
のようなビルドに影響する環境変数を変更することはないので、単純にログ取得する msbuild の起動時の環境変数を収集すれば十分な気がする。
同様に、常識的な msbuild プロジェクトはカレントディレクトリを変更しない。

仕切り直し