自分が使うコマンドをうっかり忘れるときがあるのでその備忘録のために、開発の流れとそこで使ってる内容をメモ。
公式のガイドはこちらを参考にしてください。The OpenJDK Developers' Guide – Index
OpenJDK の開発は以下のような流れで行います。
バグを上げる
おかしい動きだなぁとか新しい機能を追加するときは Java Bug System に Issue をあげます。 System Dashboard - Java Bug System
開発の準備
開発を始めるには OpenJDK のソースコードやテストツール、レビューツールを使います。これらは OpenJDK のリポジトリからダウンロードできます。
ダウンロード先は/src
ディレクトリとしますが、任意のディレクトリで大丈夫です。
OpenJDKのソースをダウンロード
cd /src hg clone http://hg.openjdk.java.net/jdk/jdk
参考:The OpenJDK Developers' Guide – Repositories
jtregをダウンロード
次に、テストツールである jtreg をダウンロードします。
cd /src hg clone http://hg.openjdk.java.net/code-tools/jtreg
webrevをダウンロード
最後に、レビューツールである webrev をダウンロードします。
$ cd /src/jdk $ wget http://hg.openjdk.java.net/code-tools/webrev/raw-file/tip/webrev.ksh
パッチを書く
お好きな方法でパッチを書いてください。私は Java の API やテストコードは IntelliJ IDEA で書いて、Hotspot JVM は Eclipse で書いてます。世の中には Vim や Emacs で開発してる人もいます。
IDE を使う方法はこちらで紹介されてます。
ビルド
jtreg のビルド
まずはテストツールからビルドします。これはとりあえず一回だけで良いです。
cd /src/jtreg bash make/build-all.sh /usr/lib/jvm/java-1.8.0
OpenJDKのビルド
次に OpenJDK をビルドします。以下はデバッグするためのオプションを付けてます。 ビルドをするまでの設定はとてつもなく長いのでこちらを参照して下さい。
cd /src/jdk bash configure --enable-debug --with-native-debug-symbols=internal --with-boot-jdk=/usr/lib/jvm/java-11 --with-jtreg=/src/jtreg/build/images/jtreg make images
configure が再度必要になったらmake reconfigure
で前の引数などを引き継いで実行してくれます。
テスト
コードを書いて、ビルドして、テストしてということを繰り返すことになりますが、OpenJDK には大量のテストが含まれているため最初から全てのテストを実行すると途方も無い時間が掛かります。なので、開発中は自分が書いている部分のテストだけを実行して、デバッグしてます。
自分が書いたテストを実行
特定のテストの実行はmake test TEST="自分が書いたテストのファイル"
で実行します。以下のように実行します。
cd /src/jdk make test TEST="test/jdk/jdk/jfr/jcmd/TestJcmdConfigure.java"
出力
Building target 'test' in configuration 'linux-x86_64-server-fastdebug' Skip building of Graal unit tests because 3rd party libraries directory is not specified Skip building of Graal unit tests because 3rd party libraries directory is not specified Test selection 'test/jdk/jdk/jfr/jcmd/TestJcmdConfigure.java', will run: * jtreg:test/jdk/jdk/jfr/jcmd/TestJcmdConfigure.java Running test 'jtreg:test/jdk/jdk/jfr/jcmd/TestJcmdConfigure.java' Passed: jdk/jfr/jcmd/TestJcmdConfigure.java Test results: passed: 1 Report written to /src/jdk/build/linux-x86_64-server-fastdebug/test-results/jtreg_test_jdk_jdk_jfr_jcmd_TestJcmdConfigure_java/html/report.html Results written to /src/jdk/build/linux-x86_64-server-fastdebug/test-support/jtreg_test_jdk_jdk_jfr_jcmd_TestJcmdConfigure_java Finished running test 'jtreg:test/jdk/jdk/jfr/jcmd/TestJcmdConfigure.java' Test report is stored in build/linux-x86_64-server-fastdebug/test-results/jtreg_test_jdk_jdk_jfr_jcmd_TestJcmdConfigure_java ============================== Test summary ============================== TEST TOTAL PASS FAIL ERROR jtreg:test/jdk/jdk/jfr/jcmd/TestJcmdConfigure.java 1 1 0 0 ============================== TEST SUCCESS Finished building target 'test' in configuration 'linux-x86_64-server-fastdebug'
レグレッションテスト
自分で書いたテストが通るようになったら、レグレッションテストのためにtier1と言われるテストを全部実行します。
cd /src/jdk make test-tier1
レビューの作成
webrev
を使ってwebレビューを作成します。-c
オプションで指定するのはIssueの番号です。JDK-
の部分は不要で番号だけで大丈夫です。
cd /src/jdk ksh ./webrev.ksh -m -N -c XXXXXX
出力
SCM detected: mercurial No outgoing, perhaps you haven't committed. Workspace: /src/jdk Output to: /src/jdk/webrev Output Files: (略) index.html: grep: /home/chito/.hgrc: No such file or directory Done. Output to: /src/jdk/webrev
webレビューのアップロード
> scp -i <秘密鍵> -r JDK-8216565/webrev xxx@cr.openjdk.java.net:~xxx/JDK-8216565/
レビュー依頼
Request for review
の略語であるRFR:
とissueの番号とタイトルを付けてメールします。
コミット・プッシュ
ユーザ情報を追加
コミットするには hg にユーザの登録が必要です。/src/jdk/.hg/hgrc
に自分のユーザを設定します。(Author以上?)[ui]
でusername
を設定しましょう。
[paths] default = http://hg.openjdk.java.net/jdk/jdk [ui] username = xxx
参考:The OpenJDK Developers' Guide – Repositories
コミット
コミットメッセージを作成します。必須なのは、issue番号とタイトル、レビューしてくれた人のusernameです。
参考:The OpenJDK Developers' Guide – Producing a Changeset
message.txt
8216565: Specifying the same path creates a new directory in JFR.configure Reviewed-by: ysuenaga, egahlin
コミットしましょう。
hg commit -l message.txt
コミッタになればここで push します。
チェンジセット作成とアップロード
Author 以下の場合は push を誰かに頼みます。 頼むためのチェンジセットを作成します。
hg export -g > changeset
チェンジセットをアップロードします。
> scp -i <秘密鍵> -r changeset xxx@cr.openjdk.java.net:~xxx/JDK-XXXXX/
連絡
チェンジセットの URL を添えて「push してと」メールを送ります。
コミッターになったら
コミッターになると、Oracle が開発者向けに公開している自動テスト環境が使えるようになります。これはSubmitリポジトリと呼ばれます。このSubmitリポジトリにpushすると、様々な環境で並行してテストをしてくれます。レビューを投げる前にこの自動テスト環境でテストを通します。
参考:Submit Repo - Build - OpenJDK Wiki
- Submitリポジトリからソースを取得
- Submitリポジトリの設定を変更
- SSH クライアントに鍵を登録
- ソースコードをプッシュ
Submitリポジトリからソースを取得
中身は同じですがパッチを書いたリポジトリとは別のリポジトリ (http://hg.openjdk.java.net/jdk/submit
)を使用します。まずはそこからソースコードをクローンします。
$ hg clone --branch default http://hg.openjdk.java.net/jdk/submit
Submitリポジトリの設定を変更
OpenJDK のリポジトリでは push は SSH を使います。そのため、パスの変更やユーザの設定をします。これらの設定は OpenJDK が用意している defpath
という hg のプラグインを使うことで実現します。
wget http://hg.openjdk.java.net/code-tools/defpath/raw-file/tip/defpath.py cat > ~/.hgrc <<EOF [extensions] defpath=/mnt/c/Users/c_hir/develop/jdk-code-tools/defpath.py EOF hg defpath -du <OpenJDK user id>
これで SSH を使ってソースを push する設定は完成です。
SSH クライアントに鍵を登録
OpenJDK のリポジトリなどの環境は鍵認証をします。そのため、HG クライアント経由で使用される SSH クライアントがこの鍵を使えるようにしましょう。
私の環境は Windows なので HGクライアントに TortoiseHG を使っており、SSH クライアントはどうやら putty を使っているようです。鍵を管理する仕組みとして、Pagent が TortoiseHG のインストールディレクトリにありましたのでそれを使います。
参考:The OpenJDK Developers' Guide – Producing a Changeset
ソースコードをプッシュ
$ hg branch "JDK-7000001" $ echo "Make the README longer." >> README $ hg commit $ hg push --new-branch
これであとは 2 時間ぐらい待つとテスト結果が届きます。
テストも通って、レビューも通ったらコミットしてプッシュします。
hg push
最後に、テストで使ったSubmitリポジトリを閉じます。
$ hg update -C "JDK-7000001" $ hg commit --close-branch -m "Closing branch" $ hg update default $ hg push