CMakeのCMAKE_EXPORT_COMPILE_COMMANDSオプション

CMakeのCMAKE_EXPORT_COMPILE_COMMANDSオプションがNinjaビルドにも対応した。
このオプションを有効にしてcmakeを実行すると、コンパイルのためのコマンドラインJSON形式でエクスポートされる( compile_commands.json )。
たとえばnmoshのcmakeビルド上で

cmake -DCMAKE_EXPORT_COMPILE_COMMANDS=ON .

のようにしてオプションを有効にすると、

{
  "directory": "C:/build/nmosh.ninja.mingw32",
  "command": "C:\\MinGW32\\bin\\gcc.exe  (略)
    -o CMakeFiles/gctesthuge_test.dir/extlibs/gc/tests/huge_test.c.obj
   -c c:\\repos\\mosh\\extlibs\\gc\\tests\\huge_test.c",
  "file": "c:\\repos\\mosh\\extlibs\\gc\\tests\\huge_test.c"
},

のようにコンパイル時のオプションが列挙されたJSONファイルが生成される。
これを生成できるのはUNIXスタイルのMakefileジェネレータもしくはNinjaのみで、VisualStudio等のMakefileベースでないジェネレータを使っている時は利用できない。
重要なポイントは、↑のJSONコンパイル処理をリプレイするために必要十分な情報を含んでいる点だろう。

目的

目的はMLの投稿にもあるが、CMakeでビルド課程で起動されるコンパイラの情報を抽出することで、例えばC++リファクタリングツールでこの情報を利用することを想定している。
他にもClangの静的解析や、一部ファイルの最適化等が考えられる。
この手の"ビルドシステムのインスペクション"は、個人的にはMakefile離れを加速させる非常に重要なトピックだと考えている。
たとえば、clangは--serialize-diagnosticsオプションを使うことで表示した診断情報をLLVM bitcodeの形でシリアライズ出来る。これは当然コンパイルのあとで診断情報をIDEや他のツールに取り込む目的で使用されるが、↑のようにして出力されたJSONを使えば、JSONに含まれるコマンドラインに適当なオプションを付加してビルド時の警告などを機械的に収集することができる。flymake的なツールを作る上でも役立つだろう。