Eclipse OpenJ9をLinux上でビルドする

Eclipse OpenJ9 Java 11をLinux上でビルドできるようにする手順です。ここではAArch64用のUbuntu server 24.04.1 LTSを使用しています。

# Boot JDKの準備

Boot JDKとして使用するJDKを[IBM Semeru Runtimes Downloads](https://developer.ibm.com/languages/java/semeru-runtimes/downloads/)からダウンロードして適当な場所に展開します。OpenJ9 Java 11をビルドするにはJava 11のJDKが必要です。

```
$ mkdir openj9
$ cd openj9
$ wget https://github.com/ibmruntimes/semeru11-binaries/releases/download/jdk-11.0.25%2B9_openj9-0.48.0/ibm-semeru-open-jdk_aarch64_linux_11.0.25_9_openj9-0.48.0.tar.gz
$ tar xvf ibm-semeru-open-jdk_aarch64_linux_11.0.25_9_openj9-0.48.0.tar.gz
$ jdk-11.0.25+9/bin/java -version
openjdk version "11.0.25" 2024-10-15
IBM Semeru Runtime Open Edition 11.0.25.0 (build 11.0.25+9)
Eclipse OpenJ9 VM 11.0.25.0 (build openj9-0.48.0, JRE 11 Linux aarch64-64-Bit Compressed References 20241107_1091 (JIT enabled, AOT enabled)
OpenJ9   - 1d5831436e
OMR      - d10a4d553
JCL      - edded3f65c based on jdk-11.0.25+9)
```

# ソースツリーの準備

[openj9-openjdk-jdk11](https://github.com/ibmruntimes/openj9-openjdk-jdk11)のGitHubレポジトリーをクローンします。

```
$ git clone https://github.com/ibmruntimes/openj9-openjdk-jdk11.git
```

さらに、`get_source.sh`を実行してOMRとOpenJ9という2つのレポジトリーをクローンします。

```
$ cd openj9-openjdk-jdk11
$ bash get_source.sh
```

`openj9-openjdk-jdk11`ディレクトリー内に`omr`ディレクトリーと`openj9`ディレクトリーが作られます。
`omr`はガーベジコレクション (GC) やJIT (just-in-time) コンパイラ、移植レイヤーなど言語実装の基盤部分を含んでいます。Java仮想マシンのコードは`openj9`内にあります。
Javaクラスライブラリーのソースコードは`openj9-openjdk-jdk11`の`src`ディレクトリーにありますが、OpenJ9固有の一部コードが`openj9/jcl/src`にあります。

# 必要なパッケージのインストール

ビルドに使用するツールやライブラリーをインストールします。AArch64 Ubuntu以外のLinuxの場合、他にもパッケージを追加する必要があるかもしれません。

```
$ sudo apt install -y gcc g++ autoconf ca-certificates ccache cmake cpio pkg-config unzip zip libasound2-dev libcups2-dev libdwarf-dev libelf-dev libfontconfig1-dev libssl-dev libx11-dev libxext-dev libxrender-dev libxrandr-dev libxtst-dev libxt-dev
```

# configureの実行

`configure`を実行します。`--with-boot-jdk=`でBoot JDKの場所を指定します。ここでエラーが出た場合は必要なパッケージが足りていない可能性があります。

```
$ bash configure --with-boot-jdk=/home/ubuntu/openj9/jdk-11.0.25+9 --with-openssl=system --disable-warnings-as-errors
```

# ビルドの実行

`make all`でビルドを実行します。`make`だけだと最後までビルドされないので`all`を指定するのをお忘れなく。ストレージの速度に左右されますが、Raspberry Pi 4で実行すると1時間くらいはかかります。

```
$ make all
(中略)
Creating jdk image
Stopping sjavac server
Finished building target 'all' in configuration 'linux-aarch64-normal-server-release'
```

ビルドが成功したら実行してみましょう。生成されたJava 11ランタイムは`build/linux-aarch64-normal-server-release/images/jdk`以下にあります。

```
$ build/linux-aarch64-normal-server-release/images/jdk/bin/java -version
openjdk version "11.0.26-internal" 2025-01-21
OpenJDK Runtime Environment (build 11.0.26-internal+0-adhoc.ubuntu.openj9-openjdk-jdk11)
Eclipse OpenJ9 VM (build master-1c0f64e5dc, JRE 11 Linux aarch64-64-Bit Compressed References 20250126_000000 (JIT enabled, AOT enabled)
OpenJ9   - 1c0f64e5dc
OMR      - 27feb3b2f
JCL      - d874dd51c9 based on jdk-11.0.26+4)
```

パスに`images`を含まない`build/linux-aarch64-normal-server-release/jdk`というディレクトリーも存在しますが、`images/jdk`のほうが最終形です。

# 他のバージョン

Java 11以外にも8/17/21などのバージョンを同様の手順でビルドできます。ビルド対象の`openj9-openjdk-jdk*`レポジトリーをクローンし、適切なバージョンのBoot JDKを`configure`時に指定してください。なお、`build`ディレクトリーの下のディレクトリー名はJavaのバージョンによって違うので注意が必要です。

- Java 8/11: `build/linux-aarch64-normal-server-release`
- Java 17/21: `build/linux-aarch64-server-release`

# 参考

ビルド方法の詳細はEclipse OpenJ9プロジェクトのドキュメントを参照してください。

https://github.com/eclipse-openj9/openj9/blob/master/doc/build-instructions/Build_Instructions_V11.md