ノート
Windows で OpenJDK を CLion で読めない問題へのパッチ
Windows で OpenJDK のコードを CLion で読めるようにする Patch.java について。
OpenJDK のコードを CLion で読もうとして make compile-commands を実行すると,build/<構成名>/compile_commands.json が生成されます。
ところが,これをそのまま CLion に読み込ませると,環境によってはプロジェクトが真っ赤になり,インクルードも定義ジャンプもおよそ愉快ではない状態になります。

この記事では,その compile_commands.json を CLion が読みやすい形へ変換するために Patch.java を書いたので,紹介します。
使い方#
make compile-commands が終わったあと,compile_commands.json が生成されたディレクトリへ Patch.java を置き,以下のように実行します。
$ java Patch.java compile_commands.json
既存の compile_commands.json は上書きされます。
元のファイルは compile_commands.json.old としてバック・アップされますから,多少やらかしても戻れます。
出力先を分けたい場合は,第 2 引数を指定します。
$ java Patch.java compile_commands.json compile_commands.clion.json
この場合,入力ファイルは上書きされず,指定した出力先にパッチ済みのファイルが作られます。
何が問題なのか#
compile_commands.json は,あるソース・ファイルをどのコンパイラ・オプションでコンパイルするかを IDE や言語サーバへ伝えるためのファイルです。
OpenJDK 側でもこれを生成できるため,普通に考えると CLion はこれを読めばよいはずです。
しかし,Windows 上の OpenJDK ビルドでは,CLion がうまく処理できないコマンド行が混ざります。
たとえば,空白を含む Visual Studio のパス,-pathmap:,プリコンパイル済みヘッダ周りのオプション,結合された /I... 形式のインクルード・パスなどです。
コンパイラからすれば意味のある指定でも,CLion の Compilation Database として食わせると,そこで詰まります。 結果として,実際には存在するヘッダが見えなかったり,コンパイラを正しく認識できなかったりします。
パッチがやっていること#
Patch.java は,OpenJDK が生成した compile_commands.json の各エントリを読み,CLion が扱いやすい形へ整えます。
大きくは以下の変換をしています。
command文字列をarguments配列へ変換する。fileのパスを canonical path へ直す。- CLion が扱いにくい
-pathmap:引数を取り除く。 - プリコンパイル済みヘッダ関連の引数を取り除く。
/Ipathや-Ipathを/I,pathの 2 引数へ分ける。- Windows の絶対パスに含まれる余分なバックスラッシュを正規化する。
- コンパイラのパスに空白が含まれる場合,可能なら短い 8.3 形式のパスへ変換する。
要するに,ビルド用の compile_commands.json から,CLion が読むための compile_commands.json へ寄せる処理です。
ビルドそのものを正しくするためのパッチではなく,IDE に読ませるためのゴニョりです。
実行結果#
実行すると,どれくらい変換したかが表示されます。
Converted entries: 1234
Removed -pathmap args: 1234
Removed PCH args: 2468
Split include args: 9876
Normalized path args: 5432
Shortened compiler paths: 1234
Wrote: C:\path\to\jdk\build\windows-x86_64-server-release\compile_commands.json
数字は環境やビルド構成によって変わります。
Converted entries が 0 になっている場合は,対象のファイルを間違えているか,想定と違う形式の compile_commands.json を渡している可能性があります。
注意点#
このパッチは,OpenJDK の make compile-commands が生成する JSON を対象にしています。
一般の compile_commands.json を万能に直すものではありません。
また,compile_commands.json を再生成した場合は,再度パッチを当てる必要があります。
make clean をしたあとなどに「あれ,また真っ赤だな」となったら,大抵これです。
なお,CLion 側の表示で以下のようなエラーが残ることがあります。
Cannot determine compiler type by executable file: 'C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.44.35207\bin\Hostx64\x64\ml64.exe'
これは ml64.exe 周りの表示なので,C/C++ のコードを読む上では一旦無視して構いません。
src/java.base/share/native/launcher/main.c や src/hotspot/share/prims/jni.cpp を開き,インクルード周りが赤くなっていなければ,概ね勝ちです。
参考文献#
- Anastasia Kazakova, "Tips & Tricks: Develop OpenJDK in CLion with Pleasure", JetBrains Blog, 2020/03/10, https://blog.jetbrains.com/clion/2020/03/openjdk-with-clion/