記事

CLion で OpenJDK のコードを正しく読む

CLion で OpenJDK のコードを読もうとするときに発生するエラーの対処法について

CLion で​ OpenJDK の​コードを​読もうと​すると​真っ赤に​なってしまい,​およそ​読めた​ものでは​ありません。​ この​記事では,​OpenJDK の​コードを​準備し,​それの​エラーを​(概ね)​解消して,​正しく​読めるように​するまでの​手順を​まとめます。

な​お,​ここまで​ひたすら​「OpenJDK の​コード」と​云っていますが,​これは​ OpenJDK​(組織)に​よる​ JDK の​コードの​ことを​指しています。​ 今後も​同じ​表現を​使用しますが,​適宜読み替えてください。

NOTE

な​お,​筆者は​以下の​環境で​作業を​行いました。

  • OS: Windows 11 Pro 25H2
  • Editor: CLion 2026.1.3
  • MSYS2: 3.6.5-0eeda3e1.x86_64

<エレベーター>#

ステップ 1. 環境を​構築しよう#

ステップ 1.b. MSYS2 を​インストールしよう#

 OpenJDK の​コードを​読むためには,​適切に​セット・アップされた​ make が​必要です。​ make を​適切に​セット・アップする​ためには​ MSYS2 の​特に​ UCRT64 環境が​必要ですから,​適当に​インストールしましょう。

 MSYS2 の​ホーム・ページ​(https://www.msys2.org/)を​見てみると,​インストールの​方​法が​書かれています。​ Winget​(新しめの​ Windows には​標準で​入っている​パッケージ管理ツール)を​使うと​簡単に​インストールできます。

PS> winget install -e --id MSYS2.MSYS2

ステップ 1.c. UCRT64 を​セット・アップしよう#

 これの​実行が​終わると,​スタート・アップに​「MSYS2 UCRT64」と​いうのが​生えてきますから,​これを​実行してください。​ 或いは,​コマンドから​ C:\msys64\ucrt64.exe を​実行しても​構いません。

MSYS2 UCRT64

 開いた​シェルで,​以下の​コマンドを​実行します。​ この​コマンドは​環境構築に​必要な​依存関係を​まとめて​インストールしてくれます。

$ pacman -S --needed autoconf make mingw-w64-x86_64-toolchain tar unzip zip

IMPORTANT

この​コマンドは​ x86_64 環境で​実行する​ことを​想定しています。​ arm 環境で​実行する​場合は,mingw-w64-x86_64-toolchain の​部分を​ mingw-w64-aarch64-toolchain に​置き換えてください。

ステップ 2. (オプション) ビルド・テスト環境を​整えよう#

 この​記事を​読んでいる方は,​恐らく​ OpenJDK に​貢献したい方だと​思います。​ 貢献を​する​場合には,単体テストやビルドを​行う​必要が​あるでしょうから,​この​節の​内容も​実行しておく​ことを​おすすめします。​ そうでない方は,やはり​この​節の​内容を​実行しておくと,​後々タノシイですから,​やって​おきましょう。

ステップ 2.b. Java を​入れよう#

 まず,​ビルドを​する​ためには​ 割と​最新めの​ OpenJDK Java が​必要です。​ Java を​ビルドする​ために​ Java が​必要と​いうのは,​なんだか​不​思議な​話ですが,​そういう​ものだと​思って​一旦​飲み込んでください。

 ホスト側で​以下の​コマンドを​実行すると,​インストール可能な​全ての​ Java バージ​ョンが​表示されます:

PS> winget search Oracle.JDK
Name                           Id            Version   Source
--------------------------------------------------------------
Java(TM) SE Development Kit 17 Oracle.JDK.17 17.0.12.0 winget
Java(TM) SE Development Kit 18 Oracle.JDK.18 18.0.2.1  winget
Java(TM) SE Development Kit 19 Oracle.JDK.19 19.0.2.0  winget
Java(TM) SE Development Kit 20 Oracle.JDK.20 20.0.2.0  winget
Java(TM) SE Development Kit 21 Oracle.JDK.21 21.0.11.0 winget
Java(TM) SE Development Kit 22 Oracle.JDK.22 22.0.2.0  winget
Java(TM) SE Development Kit 23 Oracle.JDK.23 23.0.2.0  winget
Java(TM) SE Development Kit 24 Oracle.JDK.24 24.0.2.0  winget
Java(TM) SE Development Kit 25 Oracle.JDK.25 25.0.3.0  winget
Java(TM) SE Development Kit 26 Oracle.JDK.26 26.0.1.0  winget

 最新 Java の​ビルドには,リリース済みの​最新 Java が​必要ですから,​ここでは​最新の​ Java 26 を​インストールします。​ 適宜,​最新の​ Java バージョンを​インストールしてください。

PS> winget install Oracle.JDK.26

 インストールが​終わったら,​インストールされた​ Javaの​パスを​控えて​おき,​以下の​規則に​従って​変換します:

  • バック・スラッシュを​スラッシュに​置換する​(\\ -> /)
  • ボリューム・ラベル​(C:\ など​) は​ /添え字/ に​変換する​(/c/)

 ​私の​環境では​ C:\Java\sdk\openjdk\26.0\ に​在ったので​ /c/Java/sdk/openjdk/26.0/ と​して​覚えて​おきます。

 bin/ に​パスを​通しておくと,​後々​便利です​(java が​使えるようになります)。

ステップ 2.b. JTReg を​セット・アップしよう#

 OpenJDK 独自の​単体テスト・フレーム・ワーク たる​ JTReg を​インストールしましょう。​ これが​あると,​テストが​沢山実行される​様が​見られてタノシイです。

 バイナリの​提供は​なされていないため,​ソース・​コードから​自分で​ビルドしましょう。

$ git clone https://github.com/openjdk/jtreg
$ cd jtreg
$ sh make/build.sh
# ↑ にコケた場合は,明示的に指定しましょう。
$ sh make/build-all.sh --with-jdk=/c/path/to/your/jdk

 ビルドに​成功すると,​lib/jtreg.jar が​生成されます。​後で​使用するので,フル・パスを​控えておいてください。

 さらに,​bin/ ディレクトリに​パスを​通しておくと,​後々​便利です​(jtreg コマンドが​使えるようになります)。

ステップ 2.c. VisualStudio を​入れよう#

 Windows 環境で​ OpenJDK の​コードを​コンパイルする​ためには,​VisualStudio ​(付属した​ツール・チェーン)が​必要です。​ Windows でなくても,とにかく​以下の​ツールを​入れておきましょう。​バージ​ョンは​下限です:

Operating systemToolchain version
Linuxgcc 14.2.0
macOSApple Xcode 15.4 & clang 15.0.0
WindowsMicrosoft Visual Studio 2022 version 17.13.2

 Visual Studio は​公式ホーム・ページ​(https://learn.microsoft.com/ja-jp/visualstudio/ide/whats-new-visual-studio-2022)から​ダウン・ロードしてください。

ステップ 3. OpenJDK を​ゴニョろう#

ステップ 3.a. OpenJDK の​コードを​クローンしよう#

 OpenJDK の​コードは​ GitHub の​リポジトリ​(https://github.com/openjdk/jdk/) に​あります。​ これを​適当な​場所に​クローンしましょう。

$ git clone https://github.com/openjdk/jdk/
$ cd jdk

ステップ 3.b. OpenJDK を​セット・アップしよう#

 さて,​現環境に​合わせて​プロジェクトを​慣らしてあげます。​ 以下の​コマンドを​実行して,​セット・アップしましょう​(実行には​ 3~5分ほど​かかります)。

$ bash configure --with-jtreg=<jtreg のインストール・パス>/lib/jtreg.jar --boot-jdk=<インストールした JDK のパス>

ステップ 3.c. compile_commands.json を​生成しよう#

 さて,​ここからが​本題です。

 CLion で​巨大な​プロジェクトを​正しく​読み込むためには,CMakeLists.txt を​自分で​書くか,​自動生成した​ compile_commands.json を​使う​必要が​あります。​ ぶっちゃけどっちでも​よいのですが,​人間は​怠惰な​ものですから,​自動生成できる​後者を​使うと​嬉しいです。

 以下の​コマンドを​実行すると,compile_commands.json が​生成されます。​ 実行には​ 5~10分ほど​かかりますから,​辛抱強く​待ちましょう。

$ make compile-commands

 実行が​完了すると,​ build/<アーキテクチャの名前など>/compile_commands.json が​生成されていると​思います。

ステップ 3.d. compile_commands.json を​パッチしよう#

 CLion の​ Issues に​よると,​空白を​含むパスを​適切に​取り扱えない,pathmap の​取り扱いが​不適切,​などなど​様々な​バグが​あります。​ その​ため,​JetBrains の​ブログ記事​(本記事末尾に​記載)を​参考に​しつつ,​私が​書いた​パッチが​ありますから,​実行します。​ パッチの​詳しい​話は​ CLion で​ OpenJDK の​ compile_commands.json を​読み込めない​問題への​パッチ に​分けました。

 compile_commands.json が​生成された​ディレクトリに​ Patch.java を​ダウンロードし,​以下の​コマンドを​実行します。

$ java Patch.java compile_commands.json

 これを​実行すると,​既存の​ compile_commands.json が​上​書きされ,​CLion 的に​タダシイ物が​生成されます。​ (元あった​ものは​ compile_commands.json.old と​して​バック・アップされます)

IMPORTANT

も​しこの​パッチを​怠ると,​次の​ステップで​ CLion で​開いた​時に,​以下のような​エラーが​発生して​詰みます。

clion-error

ステップ 4. CLion で​プロジェクトを​開こう#

ステップ 4.a. CLion で​ compile_commands.json を​開こう#

 エクスプローラで​ build/<アーキテクチャの名前など>/ を​開き,compile_commands.json が​ある​ことを​確認します。​ これを​右クリックし,​「プログラムで​開く」から​ CLion を​選択しましょう​:

open-in-clion

 ここで,​「プロジェクトと​して​開く」或いは​「ファイルと​して​開く」のような​ダイアログが​出てくる​場合が​あります。​ もし出てきたら前者を​選択しましょう。

ステップ 4.b. プロジェクト・ルートを​変更しよう#

 CLion → ⋮ → Tools → Compilation Database → Change Project Root を​選択し,​表示された​ダイアログで,​ OpenJDK の​ルート・ディレクトリ​(build/<アーキテクチャの名前など>/ の​2つ上の​ディレクトリ)を​選択します。

C:\Users\<ユーザー名>\Documents\OpenJDK\jdk\build\windows-x86_64-server-release
↓
C:\Users\<ユーザー名>\Documents\OpenJDK\jdk

 そうすると,​いい​感じに​プロジェクトの​再インデックス化が​始まり,​しばらく​すると​完了します。​ さすれば,​完了です。

NOTE

な​お,​コンソールに​以下のような​エラーが​発生しているかもしれませんが,​これは​無視してしまって​良いです。

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'

ステップ 4.c. 適当な​ファイルを​開いてみよう#

 例えば,java コマンドの​エントリポイントは​ src/java.base/share/native/launcher/main.c です。​ 開いてみましょう。

java-launcher

 このように,​開いてみて​(特に​ #include 周りに)エラーが​発生しなければ,​成功です。

 Java VM が​作られる​ところも​見てみましょう。​ src/hotspot/share/prims/jni.cpp を​開き,JNI_CreateJavavM を​探してみます。​ 警告こそ​多い​ものの,​エラーは​発生していないため,​普通に​読める​コードに​なっていると​思います。

java-launcher

 JNI_CreateJavaVM_inner の​呼び出しを​ Ctrl + クリック すると,​同ファイル内に​ある​定義に​飛べる​ことが​わかります。

まとめ#

 いかがでしたでしょうか。

 CLion で​ OpenJDK の​コードを​読むためには,compile_commands.json の​生成と​パッチが​必要です。​ 今後は​この​記事を​ブック・マークするなどして,​毎回の​ cleancompile-commands 時に​パッチを​適用してください…​!

参考文献#