nekop's blog

OpenShift / JBoss / WildFly / Infinispanの中の人 http://twitter.com/nekop

Fedora 14でOpenJDKをビルドする

さて、第1回JVMソースコードリーディングの会(OpenJDK6)もあることですし、OpenJDKのソースに手を入れたりコンパイルオプションとか変えてビルドしたいなぁ、とか思いますよね。というわけで一つOpenJDKビルド用サンドボックスとなるFedora 14環境を用意してOpenJDK 6をビルドしてみましょう。

Fedora 14が無い人はFedoraのサイトからLive isoイメージダウンロードして(torrentが利用できる人はtorrent使った方がダウンロード早いです)、仮想環境とか一個作って入れれば良いです。仮想環境では1.2GBほどのメモリと20GBほどのディスクを用意してください。インストールしたらsu -してvisudoで自分のユーザからsudoを発行できるようにしましょう。サンドボックス環境なのでNOPASSWD指定で良いと思います。

Fedora 14がインストールできたら、あとは一気に行きます。誰でもできるように手順をシェルスクリプト化したので、以下をシェルスクリプト(openjdk6-build.shとか)として保存して実行してください。マシンスペックやネットワークによりますが、数時間かかったりすると思うので寝る前にでも発行しておくとよいです。

#!/bin/sh

# OpenJDK build script for Fedora 14

# とりあえずメンテナンスアップデート
sudo yum update -y
# 基本ビルドツール類をインストール
sudo yum groupinstall "Development Tools" -y
# JavacはJavaで書かれているわけで、OpenJDKのビルドには
# ブートストラップJDKという別のJDKが必要なのでふつーのOpenJDK入れる
sudo yum install java-1.6.0-openjdk java-1.6.0-openjdk-devel -y
# OpenJDKのビルド依存
sudo yum-builddep java-1.6.0-openjdk -y
# 生OpenJDK 6ソース(非IcedTea)のビルドに必要な追加のヘッダ
sudo yum install lesstif-devel -y
# ビルド中に利用されるantとant拡張
sudo yum install ant ant-apache-regexp -y
# 生OpenJDK 6ソース取得
sudo yum install wget -y
wget http://download.java.net/openjdk/jdk6/promoted/b22/openjdk-6-src-b22-28_feb_2011.tar.gz
# 生OpenJDK 6ソース展開
mkdir -p openjdk-6-src-b22-28_feb_2011
tar xzf openjdk-6-src-b22-28_feb_2011.tar.gz -C openjdk-6-src-b22-28_feb_2011 
cd openjdk-6-src-b22-28_feb_2011 
# 生OpenJDK 6ソースとそのビルドはSELinux有効だとダメなので切っておく
sudo setenforce 0

# ビルド
rm -f openjdk-build.log
export LANG=C
export ALT_BOOTDIR=/usr/lib/jvm/java-openjdk
make SKIP_DEBUG_BUILD=false ALLOW_DOWNLOADS=true 2>&1 | tee -a openjdk-build.log

完了したらopenjdk-6-src-b22-28_feb_2011/build/linux-i586linux-i586-debugというビルドができているはずです。実行してみましょう。

$ ./build/linux-i586-debug/bin/java -XX:+TracePageSizes -version
VM option '+TracePageSizes'
code heap:  min=163840 max=33554432 pg_sz=4096 base=0xb5500000 size=33554432
card table:  min=655361 max=655361 pg_sz=4096 base=0xa145f000 size=659456
openjdk version "1.6.0-internal-debug"
OpenJDK Runtime Environment (build 1.6.0-internal-debug-nekop_18_may_2011_14_05-b00)
OpenJDK Client VM (build 19.0-b09-jvmg, mixed mode)

make行で指定してるSKIP_DEBUG_BUILD=falseにより、debugビルドを同時に作っています。このオプション指定でできるバイナリでは、上で指定したTracePageSizesのような開発オプション(隠しオプションってワクワクするよね!)が利用可能になります。開発オプション一覧はfind . -name \*globals.hppとかで出てくるファイルを調べてみてください。

生OpenJDKのソースでは最後のmake行でたまにコンパイル中にJVMがクラッシュしたりしますが、そのときはmake行だけリトライしてください。自分の経験上、生OpenJDKではなくIcedTea(OpenJDKのビルドスイート)を使った場合はクラッシュしてないような気がするんですが、この記事の内容を確認するのに生OpenJDKのDEBUGビルドしたらNullPointerException一回とクラッシュ2回くらいました。IcedTeaのほうはビルドプロセスのカスタマイズが複雑になりそうなので今回は紹介はやめておきます。

Fedora 14向けで作っていますが、たぶん一週間後にリリースされるFedora 15でも同じ手順でいけるんじゃないかと思います。

それでは楽しいOpenJDKライフを。