OpenJDKをビルドしてみた

デバッグ版のJVMが欲しかったのでビルドしてみた。

環境はMac

基本ソースをMercurialでクローンしてREADME読めばできる。

READMEにもあるけど、詳しいビルド方法はここを参照すればいい。
http://hg.openjdk.java.net/jdk8/jdk8/raw-file/tip/README-builds.html

以下、作業手順。

デバッグ版が欲しい場合は Configure時に--enable-debug するとよい。

% hg clone http://hg.openjdk.java.net/jdk8/jdk8 jdk8_src
requesting all changes
adding changesets
adding manifests
adding file changes
added 942 changesets with 1309 changes to 136 files
updating to branch default
82 files updated, 0 files merged, 0 files removed, 0 files unresolved

% cd jdk8_src
% ./get_source.sh
# Repositories:  corba jaxp jaxws langtools jdk hotspot nashorn

                corba:   hg clone http://hg.openjdk.java.net/jdk8/jdk8/corba corba
                 jaxp:   hg clone http://hg.openjdk.java.net/jdk8/jdk8/jaxp jaxp
                 jaxp:   requesting all changes
                corba:   requesting all changes
                corba:   adding changesets
                 jaxp:   adding changesets
Waiting 5 secs before spawning next background command.
                 jaxp:   adding manifests
                corba:   adding manifests
                jaxws:   hg clone http://hg.openjdk.java.net/jdk8/jdk8/jaxws jaxws
            langtools:   hg clone http://hg.openjdk.java.net/jdk8/jdk8/langtools langtools
                jaxws:   requesting all changes
            langtools:   requesting all changes
                jaxws:   adding changesets
            langtools:   adding changesets

〜 中略 〜
                    .:   cd . && hg pull -u
              ./corba:   cd ./corba && hg pull -u
            ./hotspot:   cd ./hotspot && hg pull -u
               ./jaxp:   cd ./jaxp && hg pull -u
              ./jaxws:   cd ./jaxws && hg pull -u
                ./jdk:   cd ./jdk && hg pull -u
          ./langtools:   cd ./langtools && hg pull -u
            ./nashorn:   cd ./nashorn && hg pull -u
            ./hotspot:   pulling from http://hg.openjdk.java.net/jdk8/jdk8/hotspot
            ./nashorn:   pulling from http://hg.openjdk.java.net/jdk8/jdk8/nashorn
              ./jaxws:   pulling from http://hg.openjdk.java.net/jdk8/jdk8/jaxws
               ./jaxp:   pulling from http://hg.openjdk.java.net/jdk8/jdk8/jaxp
          ./langtools:   pulling from http://hg.openjdk.java.net/jdk8/jdk8/langtools
                    .:   pulling from http://hg.openjdk.java.net/jdk8/jdk8
              ./corba:   pulling from http://hg.openjdk.java.net/jdk8/jdk8/corba
                ./jdk:   pulling from http://hg.openjdk.java.net/jdk8/jdk8/jdk
            ./hotspot:   searching for changes
            ./hotspot:   no changes found
              ./jaxws:   searching for changes
              ./jaxws:   no changes found
               ./jaxp:   searching for changes
               ./jaxp:   no changes found
            ./nashorn:   searching for changes
            ./nashorn:   no changes found
          ./langtools:   searching for changes
          ./langtools:   no changes found
              ./corba:   searching for changes
              ./corba:   no changes found
                    .:   searching for changes
                    .:   no changes found
                ./jdk:   searching for changes
                ./jdk:   no changes found

% bash ./configure --enable-debug --with-target-bits=64
Running generated-configure.sh
configure: Configuration created at Sat Oct  4 01:07:52 JST 2014.
configure: configure script generated at timestamp 1389186094.
checking for basename... /usr/bin/basename
checking for bash... /bin/bash
checking for cat... /bin/cat
checking for chmod... /bin/chmod
checking for cmp... /usr/bin/cmp

〜 中略 〜

checking if build directory is on local disk... yes
configure: creating /Users/plugram/Desktop/jvm/jdk8_src/build/macosx-x86_64-normal-server-fastdebug/config.status
config.status: creating /Users/plugram/Desktop/jvm/jdk8_src/build/macosx-x86_64-normal-server-fastdebug/spec.gmk
config.status: creating /Users/plugram/Desktop/jvm/jdk8_src/build/macosx-x86_64-normal-server-fastdebug/hotspot-spec.gmk
config.status: creating /Users/plugram/Desktop/jvm/jdk8_src/build/macosx-x86_64-normal-server-fastdebug/bootcycle-spec.gmk
config.status: creating /Users/plugram/Desktop/jvm/jdk8_src/build/macosx-x86_64-normal-server-fastdebug/compare.sh
config.status: creating /Users/plugram/Desktop/jvm/jdk8_src/build/macosx-x86_64-normal-server-fastdebug/spec.sh
config.status: creating /Users/plugram/Desktop/jvm/jdk8_src/build/macosx-x86_64-normal-server-fastdebug/Makefile
config.status: creating /Users/plugram/Desktop/jvm/jdk8_src/build/macosx-x86_64-normal-server-fastdebug/config.h

====================================================
A new configuration has been successfully created in
/Users/plugram/Desktop/jvm/jdk8_src/build/macosx-x86_64-normal-server-fastdebug
using configure arguments '--enable-debug --with-target-bits=64'.

Configuration summary:
* Debug level:    fastdebug
* JDK variant:    normal
* JVM variants:   server
* OpenJDK target: OS: macosx, CPU architecture: x86, address length: 64

Tools summary:
* Boot JDK:       java version "1.8.0_20" Java(TM) SE Runtime Environment (build 1.8.0_20-b26) Java HotSpot(TM) 64-Bit Server VM (build 25.20-b23, mixed mode)  (at /Library/Java/JavaVirtualMachines/jdk1.8.0_20.jdk/Contents/Home)
* C Compiler:     i686-apple-darwin11-llvm-gcc-4.2 (GCC) 4.2.1 (Based on Apple Inc. build 5658) (LLVM build) version 2335.15.00) (at /usr/llvm-gcc-4.2/bin/llvm-gcc-4.2)
* C++ Compiler:   i686-apple-darwin11-llvm-g++-4.2 (GCC) 4.2.1 (Based on Apple Inc. build 5658) (LLVM build) version 2335.15.00) (at /usr/llvm-gcc-4.2/bin/llvm-g++-4.2)

Build performance summary:
* Cores to use:   2
* Memory limit:   4096 MB
* ccache status:  not installed (consider installing)

Build performance tip: ccache gives a tremendous speedup for C++ recompilations.
You do not have ccache installed. Try installing it.


% make all
Building OpenJDK for target 'all' in configuration 'macosx-x86_64-normal-server-fastdebug'

## Starting langtools
Compiling 2 files for BUILD_TOOLS
Compiling 31 properties into resource bundles
Compiling 777 files for BUILD_BOOTSTRAP_LANGTOOLS
Creating langtools/dist/bootstrap/lib/javac.jar
Updating langtools/dist/lib/src.zip
Compiling 780 files for BUILD_FULL_JAVAC
Creating langtools/dist/lib/classes.jar
## Finished langtools (build time 00:01:02)

## Starting hotspot
make[2]: warning: -jN forced in submake: disabling jobserver mode.
INFO: ENABLE_FULL_DEBUG_SYMBOLS=1
INFO: ENABLE_FULL_DEBUG_SYMBOLS=1
INFO: ENABLE_FULL_DEBUG_SYMBOLS=1
INFO: ENABLE_FULL_DEBUG_SYMBOLS=1
INFO: ENABLE_FULL_DEBUG_SYMBOLS=1
Creating Makefile ...
Creating directory list ../shared_dirs.lst
Creating flags.make ...
Creating flags_vm.make ...
Creating vm.make ...
Creating adlc.make ...
Creating jvmti.make ...
Creating trace.make ...
Creating sa.make ...
Creating dtrace.make ...
INFO: ENABLE_FULL_DEBUG_SYMBOLS=1
Creating Makefile ...
Creating flags.make ...
Creating flags_vm.make ...
Creating vm.make ...
Creating adlc.make ...
Creating jvmti.make ...
Creating trace.make ...

〜 中略 〜

## Finished docs (build time 00:03:48)

----- Build times -------
Start 2014-10-04 01:10:54
End   2014-10-04 01:39:25
00:00:50 corba
00:01:00 demos
00:03:48 docs
00:12:07 hotspot
00:01:27 images
00:00:30 jaxp
00:00:44 jaxws
00:06:44 jdk
00:01:02 langtools
00:00:18 nashorn
00:28:31 TOTAL
-------------------------
Finished building OpenJDK for target 'all'

% make install
Building OpenJDK for target 'install' in configuration 'macosx-x86_64-normal-server-fastdebug'

## Starting langtools
## Finished langtools (build time 00:00:01)

## Starting hotspot
## Finished hotspot (build time 00:00:00)

## Starting corba
## Finished corba (build time 00:00:00)

## Starting jaxp
## Finished jaxp (build time 00:00:01)

## Starting jaxws
## Finished jaxws (build time 00:00:00)

## Starting jdk
## Finished jdk (build time 00:00:03)

## Starting demos
## Finished demos (build time 00:00:00)

## Starting nashorn
## Finished nashorn (build time 00:00:00)

## Starting images
Copying images/j2re-bundle/jre1.8.0.jre/Contents/Home/release
Copying images/j2sdk-bundle/jdk1.8.0.jdk/Contents/Home/.DS_Store
Copying images/j2sdk-bundle/jdk1.8.0.jdk/Contents/Home/jre
Copying images/j2sdk-bundle/jdk1.8.0.jdk/Contents/Home/jre/.DS_Store
Copying images/j2sdk-bundle/jdk1.8.0.jdk/Contents/Home/release
## Finished images (build time 00:00:04)

## Starting install
Installing jdk image into /usr/local/jvm/openjdk-1.8.0-internal-fastdebug
and creating 40 links from /usr/local/bin into the jdk.
## Finished install (build time 00:00:04)

----- Build times -------
Start 2014-10-04 01:54:51
End   2014-10-04 01:55:04
00:00:00 corba
00:00:00 demos
00:00:00 hotspot
00:00:04 images
00:00:04 install
00:00:01 jaxp
00:00:00 jaxws
00:00:03 jdk
00:00:01 langtools
00:00:00 nashorn
00:00:13 TOTAL
-------------------------


インストールしたら /usr/local/bin に入った。

さっそく実験。

以下のようなソースを書いて実行。

class Hello {
  public static void main(String[] args) {
    new Hello().hello();
  }

  public int hello() {
    int result = 1 + 2;
    return result;
  }
}
% /usr/local/bin/javac Hello.java
% /usr/local/bin/java -client -Xcomp -XX:+PrintIRWithLIR -XX:CompileOnly="Hello.hello" Hello
__bci__use__tid____instr____________________________________
. 0    0     4     B1 [0, 0] -> B2 sux: B2

     label [label:0xec065838]
. 0    0     7     std entry B2
     std_entry
     move [rsi|L] [R177|L]
     move [metadata:0xa1684420|M] [R178|M]
     move [Base:[R178|M] Disp: 108|I] [R179|I]
     add [R179|I] [int:8|I] [R179|I]
     move [R179|I] [Base:[R178|M] Disp: 108|I]
     move [metadata:0xa16842f0|M] [R180|M]
     logic_and [R179|I] [int:0|I] [R179|I]
     cmp [R179|I] [int:0|I]
     branch [EQ] [CounterOverflowStub: 0xec067718]
     label [label:0xec067740]
     branch [AL] [B2]

__bci__use__tid____instr____________________________________
. 0    0     5     B2 (S) [0, 0] -> B0 dom B1 sux: B0 pred: B1

     label [label:0xec065b48]
. 0    0     6     goto B0
     branch [AL] [B0]

__bci__use__tid____instr____________________________________
. 0    0     0     B0 (SV) [0, 3] dom B2 pred: B2

     label [label:0xec064e38]
. 3    0    i3     ireturn i2
     move [int:3|I] [rax|I]
     return [rax|I]

__bci__use__tid____instr____________________________________
. 0    0     4     B1 [0, 0] -> B0 sux: B0

     label [label:0xec8a8a38]
. 0    0     5     std entry B0
     std_entry
     move [rsi|L] [R177|L]
     branch [AL] [B0]

__bci__use__tid____instr____________________________________
. 0    0     0     B0 (SV) [0, 3] dom B1 pred: B1

     label [label:0xec8a8038]
. 3    0    i3     ireturn i2
     move [int:3|I] [rax|I]
     return [rax|I]

とりあえず今日はここまで。