[ Topページへ戻る ] [ Java SE 6 Mustang新機能 ]

Java SE SDKをビルドする(Mustang編)

2005.9.9よりアクセス

はじめに

本ドキュメントは、Java Standard Edition, ver.6 (開発コード名:Mustang)をソースコードで入手し、これをビルドする手順について記したものです。

現時点での記述対象は、WindowsおよびSolaris x86です。

2006年8月現在、Java SE 6は開発途上で、毎週スナップショットがjava.netにおいてソースおよびバイナリの両形式で公開されています。ソースは、Java Research License(JRL)のライセンス形態の下で公開されています。

Java SE 6 (Mustang)の機能についてはこちら

Java SE 6のソースをビルドするのに必要なツール

Windows

ビルドに必要なツール

Windowsでは、以下のツールが必要となります。

Solaris 10 x86

ビルドに必要なツール

Solarisでは、以下のツールが必要となります。

Java SE 6のソース入手

開発途上のスナップショットは、java.net サイトのmustangプロジェクトページから入手することができます。

入手

ソースファイル

なお、ソースファイルとバイナリファイルは各OSで共通となっています。

Java SE 6のソースの展開

Windows版

ソースコード展開ディレクトリ

作業用のディレクトリを決めます。ここでは、D:\mustang\b104 として進めます。

ソースファイルの展開

まずソースアーカイブを展開します。Javaをインストールしていれば、拡張子JARがJavaに関連付けられているので、エクスプローラ上でjdk-6-rc-src-b104-jrl-01_nov_2006.jarをダブルクリックすればインストーラが起動します。ライセンス同意画面が表示されるので、ライセンス(JRL)に同意するため[ACCEPT]ボタンをクリックします。インストール先を指定する選択ダイアログで、作業用のディレクトリ(例、D:\mustang\b104)を指定します。

b96の中のディレクトリ構成
control/
deploy/
hotspot/
install/
j2se/
motif/
BinaryLicense.txt
build.html
build-linux.html
build-solaris.html
build-windows.html
javalogo52x88.gif
JavaResearchLicense.txt
README.html
README-builds.html
sunlogo64x30.gif

Makefileの修正(1):コンパイラバージョンの認識

Makefile自体を修正しなくても、make時にコマンドラインオプションで変数COMPILER_VERSION=VS2003とコンパイラのバージョンを指定することで回避可能です。

Visual Studio.NET 2003日本語版のC++コンパイラを使う場合、コンパイラのバージョンを調べるMakefile中の記述では不整合があるためVisual C++ 6と誤認識されてしまいます。

Visual Studio.NET 2003日本語版clコマンドを実行すると以下のように表示されます。

Microsoft(R) 32-bit C/C++ Optimizing Compiler Version 13.10.3077 for 80x86

一方、英語版ではclコマンドを実行すると以下のように表示されます。Microsoft と(R)の間に空白があります。

Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 13.10.3077 for 80x86

Makefileでは、awkコマンドを使って8番目の単語をバージョン番号として切り出していますが、空白の有無で順番が異なってしまうのが問題となります。

ちなみに日本語版でもlinkコマンドは以下のようにMicrosoftと(R)の間に空白があります。

Microsoft (R) Incremental Linker Version 7.10.3077

そこで、以下のファイルを2箇所修正します。

j2se/make/common/shared/Compiler-msvc.gmk 34行目付近
  # SDK-64 and MSVC6 put REBASE.EXE in a different places - go figure...
  ifeq ($(ARCH_DATA_MODEL), 32)
    CC_VER  := $(shell $(CC) 2>&1 | $(HEAD) -n 1 | $(NAWK) '{print $$8}')
    LINK_VER := $(shell $(LINK) | $(HEAD) -n 1 | $(NAWK) '{print $$6}')
    CC_TYPE := $(shell $(CC) 2>&1 | $(HEAD) -n 1 | $(NAWK) '{print $$5}')
  1. CC_VERのprint $$8 となっているところを、print $$7に変更します。
  2. CC_TYPEのprint $$5となっているところを、print $$4に変更します。

Makefileの修正(2):Cygwin makeのvpath絶対パス認識

b85以降では本問題が修正されています。

Javaをビルドすると以下のエラーが発生します。

make[4]: *** No rule to make target `E:/java/mustang/b77out/tmp/deploy/deployObj/
BasicPerfStore.o', needed by `E:/java/mustang/b77out/tmp/deploy/common/bin/deploy.dll'.  Stop.

Cygwinのmakeコマンド(GNU make 3.80)は、vpathにWindowsの絶対パス指定をした場合、正常に認識されないという問題があるようです。vpathの指定は以下のファイルに記述されています。

deploy/make/common/DeployRules-windows.gmk 15行目付近
vpath %.cpp $(DEPLOY_SHARE_SRC)/native $(DEPLOY_PLATFORM_SRC)/native

ここで指定している変数は以下のファイルに記述されています。

deploy/make/common/DeployRules.gmk 29行目付近
ifeq ($(PLATFORM), windows)
    DEPLOY_FILES        += $(DEPLOY_WINDOWS_FILES)
    DEPLOY_PLATFORM_SRC := $(call FullPath,"$(DEPLOY_TOPDIR)/src/common/windows")
    DEPLOY_SHARE_SRC    := $(call FullPath,"$(DEPLOY_TOPDIR)/src/common/share")

絶対パスではCygwinのmakeがNGなので、FullPathに変換しているマクロFullPath呼び出しを削除するように修正します。

  1. DEPLOY_PLATFORM_SRC := $(DEPLOY_TOPDIR)/src/common/windows
  2. DEPLOY_SHARE_SRC := $(DEPLOY_TOPDIR)/src/common/share

Makefileの修正(3):Cygwin makeのexport文環境変数設定反映無効

b88以降では本問題が修正されています。

Javaをビルドすると以下のエラーが発生します。

D:/mustang/b86out/bin/java -client -Xmx256m -Xms128m jscheme.REPL 
 ../../../../src/share/classes/com/sun/tools/corba/se/logutil/scripts/mc.scm
 -main main make-class  ../../../../src/share/classes/com/sun/corba/se/spi/logging/data/Activation.mc
 D:/mustang/b86out/gensrc/com/sun/corba/se/impl/logging
java.lang.NoClassDefFoundError: jscheme/REPL

j2se/make/sun/rmi/corbalogsourcesディレクトリのMakefile中で、変数CLASSPATHにjscheme.jarを設定してexportしていますが、本ターゲットの実行時にはなぜか環境変数CLASSPATHが空となっているためにエラーとなっています。

直接j2se/make/sun/rmi/corbalogsourcesディレクトリでmakeを実行すると、このエラーは発生しません。j2se/controlディレクトリからakeした場合に発生しています。

環境変数に頼らずjavaのコマンドラインでクラスパスを指定すれば問題が回避できるので、以下のようにMakefileを修正します。

j2se/make/sun/rmi/corbalogsources/Makefile 73行目付近
JSCHEME_GENERATE_CLASS = $(JAVA) -cp "$(JSCHEME_CLASSPATH)" jscheme.REPL $(MC_GENERATE_CLASS) 
JSCHEME_GENERATE_LOG_RB = $(JAVA) -cp "$(JSCHEME_CLASSPATH)" jscheme.REPL $(MC_GENERATE_LOG_RB) 


j2se/make/com/sun/corba/se/sources/Makefile 73行目付近
JSCHEME_GENERATE_CLASS = $(JAVA) -cp "$(JSCHEMEJARS)" jscheme.REPL $(MC_GENERATE_CLASS) 
JSCHEME_GENERATE_LOG_RB = $(JAVA) -cp "$(JSCHEMEJARS)" jscheme.REPL $(MC_GENERATE_LOG_RB) 

Makefileの修正(4):最適化レベルの変更(お好みで)

自分でソースからビルドするメリットの一つに、コンパイルオプションを変更して自分専用のバイナリを作ることが挙げられます。とくに、最適化レベルを上げることで普通より速いと思い込んで(*)満足感を得ることは大きな楽しみです。

* 実際には大して速くなっていなかったり、逆に遅くなってしまうこともある。

Windows用のMustangビルドにおける最適化オプションの定義は、以下のファイルに記述されています。

j2se/make/common/Defs-windows.gmk 118行目付近
  ifeq ($(COMPILER_VERSION), VS2003)
    # Also known as VC7 compiler
    GX_OPTION = -GX
    ifeq ($(ARCH_DATA_MODEL), 32)
      # Lowered opt level to try and reduce footprint, dll size especially.
      #     Was: CC_HIGHEST_OPT = -O2 -G6
      #     Was: CC_HIGHER_OPT  = -O2
      CC_HIGHEST_OPT = -O2
      CC_HIGHER_OPT  = -O1
      CC_LOWER_OPT   = -O1
    else

Athlon 64 x2の場合、以下の最適化オプションがよさそうです。CC_HIGHESTだけの指定だと一部分にしか適用されないので、CC_HIGHERにも同じ最適化オプションを指定しています。

CC_HIGHEST_OPT = -Ox -Gs -GF -Gy -GL -arch:SSE2
CC_HIGHER_OPT = -Ox -Gs -GF -Gy -GL -arch:SSE2 
Mozilla Headers and Libraries

Java Plug-inをビルドするのに必要となります。jdk-6-beta2-mozilla_headers-b77-windows-i586-24_mar_2006.jarをダブルクリックし、ライセンス(JRL)に同意するため[ACCEPT]ボタンをクリックします。インストール先を指定する選択ダイアログで、作業用のディレクトリ(例、D:\mustang\mozhead)を指定します。

mozhead
share/
win32/
MPL-1.1.txt
バイナリファイルの展開

jdk-6-rc-bin-b96-jrl-18_aug_2006.jarをダブルクリックし、ライセンス(JRL)に同意するため[ACCEPT]ボタンをクリックします。インストール先を指定する選択ダイアログで、ソースコードを展開した作業用のディレクトリ(例、D:\mustang\b96)を指定します。

Solaris x86版

ソースコード展開ディレクトリ

作業用のディレクトリを決めます。ここでは、~/mustang/b65 として進めます。

ソースファイルの展開

まずソースアーカイブを展開します。jdk-6_0-ea-src-b65-jrl-22_dec_2005.jarjavaで実行し、ライセンス(JRL)に同意するため[ACCEPT]ボタンをクリックします。インストール先を指定する選択ダイアログで、作業用のディレクトリ(例、~/mustang/b65)を指定します。

~$ java -jar jdk-6_0-ea-src-b65-jrl-22_dec_2005.jar
Mozilla Headers and Libraries

Java Plug-inをビルドするのに必要となります。jdk-6_0-ea-mozilla_headers-b65-unix-i586-22_dec_2005.jarjavaで実行し、ライセンス(JRL)に同意するため[ACCEPT]ボタンをクリックします。インストール先を指定する選択ダイアログで、作業用のディレクトリ(例、~/mustang/mozhead)を指定します。

~$ java -jar jdk-6_0-ea-mozilla_headers-b65-unix-i586-22_dec_2005.jar
バイナリファイルの展開

jdk-6_0-ea-bin-b65-jrl-22_dec_2005.jarjavaで実行し、ライセンス(JRL)に同意するため[ACCEPT]ボタンをクリックします。インストール先を指定する選択ダイアログで、ソースコードを展開した作業用のディレクトリ(例、~/mustang/b56)を指定します。

~$ java -jar jdk-6_0-ea-bin-b65-jrl-22_dec_2005.jar

ビルドの設定

Windows版

ビルドは、コマンドプロンプト上で実行します。コマンドラインから実行するにあたって環境変数をいろいろと設定することが必要です。

環境変数の設定

Visual Studio.NET 2003の環境設定

Visual Studio.NET 2003には、コマンドラインで必要な環境変数を行うVCVARS32.BATファイルが用意されています。コマンドプロンプト上で、D:\Program Files\Microsoft Visual Studio .NET 2003\Vc\bin\vcvars32.bat を実行します。

デスクトップ上にコマンドプロンプトのショートカットを以下のようにオプションを追加して作成しておくと便利でしょう。

%SystemRoot%\system32\cmd.exe /k "D:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\bin\vcvars32.bat"
環境変数PATHにCygwinを追加

環境変数PATHの末尾に、Cygwinのbinディレクトリを追加します。PATHの先頭にCygwinのディレクトリを持ってくると、Visual Studio .NET 2003のLINKコマンドを呼ぶべきところをCygwinのlinkコマンドを呼んでエラーとなる。

D:\> PATH=%PATH%;D:\cygwin\bin
D:\> 

環境変数PATHに""で囲まれるパスや空のパス(;;)が含まれているとエラーが発生する

makeで下記のようなエラーが発生します。DirectX SDKをインストールした際にシステム環境変数PATHに登録されたPATHに""が付けられていたので、この""を外しておきます。

D:\mustang\b99\control\make> make dev
make: uname: Command not found
make: expr: Command not found
make: logname: Command not found
common/Defs.gmk:145: ../../control/make/common/Defs-.gmk: No such file or direct
ory
/bin/sh: +%d_%b_%Y: command not found
/bin/sh: [A-Z]: command not found
make: -p: Command not found
make: -p: Command not found
make: -p: Command not found
/bin/sh: -F": command not found
/bin/sh: -c: line 0: syntax error near unexpected token `|'
/bin/sh: -c: line 0: `|  -c '^1.[5-6].[0-9]''
make: *** No rule to make target `../../control/make/common/Defs-.gmk'.  Stop.

D:\mustang\b99\control\make> 
Java SE 6 SDKビルド用の環境変数設定

各ツールのディレクトリ、DLLファイルのパスなどを環境変数として設定します。

b91では、空白を含むロング形式を受け付けない。

環境変数名 設定例 備考
ALT_OUTPUTDIR
D:/mustang/b96out
ALT_UNIXCOMMAND_PATH
/bin
/bin以外のとき設定必要
ALT_BOOTDIR
D:/java/jdk1.5.0
ALT_DEVTOOLS_PATH
D:/PROGRA~1/MICROS~1/Bin
msitran.exeがC:\UTILS以外にインストールされているとき設定必要
ALT_DXSDK_INCLUDE_PATH
D:/PROGRA~1/MICROS~1.0SD/Include
ALT_DXSDK_LIB_PATH
D:/PROGRA~1/MICROS~1.0SD/Lib/x86
ALT_UNICOWS_DLL_PATH
D:/mustang/unicows
ALT_UNICOWS_LIB_PATH
ALT_MSVCRT_DLL_PATH
C:/WINDOWS/system32
ALT_MSVCR71_DLL_PATH
D:/PROGRA~1/MICROS~1.NET/VISUAL~1.NET
ALT_MSVCP71_DLL_PATH
%ALT_MSVCR71_DLL_PATH%
ALT_MOZILLA_HEADERS_PATH
D:/mustang/mozhead

以下はオプションで設定する環境変数です。ビルド後、java -versionを実行したときに表示されるメッセージの中に以下の設定が取り込まれます。

環境変数名 設定例 備考
MILESTONE
rc-torutk
BUILD_NUMBERf
b96-1

例えば、上記設定でビルドしたJavaの場合、以下のバージョン表記となります。

$ java -version
java version "1.6.0-rc-torutk"
Java(TM) SE Runtime Environment (build 1.6.0-rc-torutk-b96-1)
Java HotSpot(TM) Client VM (build 1.6.0-rc-torutk-b96-1, mixed mode) 

Solaris x86版

環境変数の設定

環境変数PATH

環境変数PATHには、GNU make、Sun Studio Compiler、/usr/binの順番でパスが設定されている必要があります。

~$ PATH=/usr/sfw/bin:/opt/SUNWspro/bin:$PATH
~$ 
Java SE 6 SDKビルド用の環境変数設定

各ツールのディレクトリ、DLLファイルのパスなどを環境変数として設定します。

環境変数名 設定例 備考
ALT_BOOTDIR
/usr/jdk/instances/jdk1.5.0
ALT_OUTPUTDIR
~/mustang/b98out
ALT_COMPILER_PATH
/opt/SUNWspro/bin
ALT_DEVTOOLS_PATH
/usr/bin
ALT_MOTIFD_DIR
~/mustang/motif_area
ALT_ODBCDIR
~/mustang/odbc
ALT_GCC_COMPILER_PATH
/opt/sfw/gcc-2/bin
GCCは3.4ではなく2.95が必要
ALT_MOZILLA_HEADERS_PATH
~/mustang/mozhead/share/plugin

以下はオプションで設定する環境変数です。

環境変数名 設定例 備考
MILESTONE
beta-torutk
BUILD_NUMBER
b56-1

Motifの設定

ビルド上、Motifのヘッダーとライブラリは以下のディレクトリ構成となっていることが要求されます。

+- motif_area/  (set ALT_MOTIF_DIR to this level)                 
            +- motif21/
               +- include/
               |  +- Xm/  (from /usr/include/Xm)
               |     +- <many files>
               |    
               +- lib/    (from /usr/dt/lib/) 
                  +- libXm.so (symbolic link to libXm.so.4)
                  +- libXm.so.4
                  +- sparcv9/    (64-bit Motif library)
                     +- libXm.so (symbolic link to libXm.so.4)
                     +- libXm.so.4

そこで、シンボリックリンクで上記ディレクトリ構成を作業ディレクトリに構築します。

~$ cd mustang
mustang$ mkdir motif_area
mustang$ cd motif_area
motif_area$ mkdir motif21
motif_area$ cd motif21
motif21$ mkdir include
motif21$ cd include
include$ ln -s /usr/include/Xm Xm
include$ ..
motif21$ ln -s /usr/dt/lib lib
motif21$

ODBCダミーライブラリの作成

Mustangのソースコードに、ODBCダミーライブラリのソースが含まれています。これをビルドし、ODBCのディレクトリにコピーします。

まずODBCのディレクトリを作成します。

mustang$ mkdir odbc
mustang$ cd odbc
odbc$ mkdir ISLIodbc
odbc$ cd ISLIodbc
ISLIodbc$ mkdir 2.11
ISLIodbc$ cd 2.11
2.11$ mkdir lib
2.11$ cd lib
lib$

ODBCダミーライブラリをビルドします。

lib$ cp ~/mustang/b56/j2se/make/sun/jdbc/*.c .
lib$ cc -G -h libodbc.so -o libodbc.so dummyodbc.c
lib$ cc -G -h libodbcinst.so -o libodbcinst.so dummyodbc.c 
lib$ 

ビルド実行

Windows版

設定内容の確認

ビルド開始前に、環境変数や各種環境設定の確認を行います。

設定が完了したら、ソースファイルをインストールしたディレクトリのcontrol/makeディレクトリへ移動し、以下のコマンドを実行します。

D:\> cd mustang\b104\control\make
D:\mustang\b104\control\make> make dev-sanity COMPILER_VERSION=VS2003
cd  ../../control/make
make sanity DEV_ONLY=true
make[1]: Entering directory `/cygdrive/d/mustang/b104/control/make'
/bin/sh: line 0: [: for: integer expression expected
/bin/sh: line 0: [: for: integer expression expected
make[2]: Entering directory `/cygdrive/d/mustang/b104/deploy/make'
make[2]: Leaving directory `/cygdrive/d/mustang/b104/deploy/make'
/bin/sh: line 0: [: for: integer expression expected
/bin/sh: line 0: [: for: integer expression expected
make[2]: Entering directory `/cygdrive/d/mustang/b104/j2se/make'
make[2]: Leaving directory `/cygdrive/d/mustang/b104/j2se/make'

Build Machine Information:
   build machine = SAGAMI

Build Directory Structure:
   CWD = /cygdrive/d/mustang/b104/control/make
   TOPDIR = ../..
   CONTROL_TOPDIR = ../../control
   HOTSPOT_TOPDIR = ../../hotspot
   J2SE_TOPDIR = ../../j2se
   MOTIF_TOPDIR = ../../motif
   DEPLOY_TOPDIR = ../../deploy 

ビルド実行

設定が完了したら、ソースファイルをインストールしたディレクトリのcontrol/makeディレクトリへ移動し、以下のコマンドを実行します。

D:\> cd mustang\b96\control\make
D:\mustang\b96\control\make> make dev
 

ビルドには数時間かかります。
Athlon XP 2500+ CPUのマシンで、3時間弱を要しました。
Athlon 64x2 4200+ CPUのマシンで、1時間40分を要しました。

makeの出力結果をファイルに保存するには、

D:\mustang\b96\control\make> make dev 2>&1 | tee make.log
 

のようにすると便利です。

makeのオプション

フルビルド以外にも、いくつかmakeの選択肢が存在します。

ネイティブコード(C++)はビルドしない

ネイティブ部分はMustangのバイナリ・リリースを利用し、C++コンパイルせずにJava部分だけビルドする方法があります。

D:\mustang\b96\control\make> set ALT_JDK_IMPORT_PATH=...
D:\mustang\b96\control\make> make IMPORT_NATIVE_BINARIES=true
デバッグイメージ(fastdebug)はビルドしない
D:\mustang\b96\control\make> make SKIP_FASTDEBUG_BUILD=true scsl
APIのJavaDocを作成する
D:\mustang\b96\j2se\make> make docs
クリーン
D:\mustang\b96\control\make> make clobber

ビルド結果

ビルド結果のディレクトリ(環境変数ALT_OUTPUTDIRで指定した場所)は以下のようになっています。

b96outの中のディレクトリ構成
bin/
bundles/
classes/
demo/
docs/
gensrc/
hostspot/
include/
j2re-image/
j2sdk-debug-image/
j2sdk-image/
java.net/
lib/
sample/
source-bundles/
symbols/
tmp/
sanitiCheckErrors.txt
sanityCheckMessages.txt
sanityCheckWarnings.txt
j2sdk-image
Java SE SDKの部分です。通常インストールして使用するJava SE SDKはこのディレクトリ以下となります。
j2re-image
Java SE REの部分です。通常インストールして使用するJava SE REはこのディレクトリ以下となります。
j2sdk-debug-image
Java SE SDKの部分でj2sdk-imageと同じ構成ですが、デバッグオプション付きでビルドされている点が違います。デバッグオプションが付いているので、生成された実行ファイル、DLLファイル、Javaクラスファイルのサイズが大きくなっています。
docs
j2se/makeでmake docsを実行するとここにAPIドキュメントが生成されます。

Solaris x86版

設定が完了したら、ソースファイルをインストールしたディレクトリのcontrol/makeディレクトリへ移動し、以下のコマンドを実行します。

~$cd mustang/b56/control/make
make$ LANG=C gmake scsl
 

GNU makeは、/usr/sfw/binの下にgmakeの名前で入っています。makeとすると、GNU makeではなく、UNIX SystemVのmakeが実行されてしまいます。

LANG=Cとしているのは、msgfmtコマンドが西欧言語のメッセージファイルの処理に失敗するのを防止するためです。(理由は分かりませんが)

ビルド結果の確認

Java2Demoの実行

Windows版

コマンドプロンプトを起動して、ビルド結果のディレクトリの中のbinディレクトリに環境変数PATHを通します。

D:\> PATH=D:\mustang\b96out\bin;%PATH%
D:\> java -version
java version "1.6.0-rc-torutk"
Java(TM) SE Runtime Environment (build 1.6.0-rc-torutk-b96-1)
Java HotSpot(TM) Client VM (build 1.6.0-rc-torutk-b96-1, mixed mode)

D:\> cd mustang\b96out\demo\jfc\Java2D
D:\mustang\b96out\demo\jfc\Java2D>java -jar Java2Demo.jar

詳細情報

環境変数 _JAVA_LAUNCHER_DEBUG

Windows版での指定例
D:\> set _JAVA_LAUNCHER_DEBUG=1
D:\> java -version
----_JAVA_LAUNCHER_DEBUG----
JRE path is E:\java\mustang\b77out
jvm.cfg[0] = ->-client<-
jvm.cfg[1] = ->-server<-
jvm.cfg[2] = ->-hotspot<-
    name: -hotspot  vmType: VM_ALIASED_TO  alias: -client
jvm.cfg[3] = ->-classic<-
jvm.cfg[4] = ->-native<-
jvm.cfg[5] = ->-green<-
295 micro seconds to parse jvm.cfg
Default VM: client
JVM path is E:\java\mustang\b77out\bin\client\jvm.dll
JRE path is E:\java\mustang\b77out
CRT path is E:\java\mustang\b77out\bin\msvcr71.dll
3997 micro seconds to LoadJavaVM
JavaVM args:
    version 0x00010002, ignoreUnrecognized is JNI_FALSE, nOptions is 2
    option[ 0] = '-Djava.class.path=.'
    option[ 1] = '-Dsun.java.launcher=SUN_STANDARD'
java version "1.6.0-beta-torutk"
Java(TM) SE Runtime Environment (build 1.6.0-beta-torutk-b77-1)
Java HotSpot(TM) Client VM (build 1.6.0-beta-torutk-b77-1, mixed mode)

D:\>