[ Topページへ戻る ] [ Java SE 6 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)の機能についてはこちら。
Windowsでは、以下のツールが必要となります。
Solarisでは、以下のツールが必要となります。
開発途上のスナップショットは、java.net サイトのmustangプロジェクトページから入手することができます。
なお、ソースファイルとバイナリファイルは各OSで共通となっています。
作業用のディレクトリを決めます。ここでは、D:\mustang\b104 として進めます。
まずソースアーカイブを展開します。Javaをインストールしていれば、拡張子JARがJavaに関連付けられているので、エクスプローラ上でjdk-6-rc-src-b104-jrl-01_nov_2006.jarをダブルクリックすればインストーラが起動します。ライセンス同意画面が表示されるので、ライセンス(JRL)に同意するため[ACCEPT]ボタンをクリックします。インストール先を指定する選択ダイアログで、作業用のディレクトリ(例、D:\mustang\b104)を指定します。
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箇所修正します。
# 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}') |
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の指定は以下のファイルに記述されています。
vpath %.cpp $(DEPLOY_SHARE_SRC)/native $(DEPLOY_PLATFORM_SRC)/native |
ここで指定している変数は以下のファイルに記述されています。
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呼び出しを削除するように修正します。
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を修正します。
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) |
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ビルドにおける最適化オプションの定義は、以下のファイルに記述されています。
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
Java Plug-inをビルドするのに必要となります。jdk-6-beta2-mozilla_headers-b77-windows-i586-24_mar_2006.jarをダブルクリックし、ライセンス(JRL)に同意するため[ACCEPT]ボタンをクリックします。インストール先を指定する選択ダイアログで、作業用のディレクトリ(例、D:\mustang\mozhead)を指定します。
share/ win32/ MPL-1.1.txt |
jdk-6-rc-bin-b96-jrl-18_aug_2006.jarをダブルクリックし、ライセンス(JRL)に同意するため[ACCEPT]ボタンをクリックします。インストール先を指定する選択ダイアログで、ソースコードを展開した作業用のディレクトリ(例、D:\mustang\b96)を指定します。
作業用のディレクトリを決めます。ここでは、~/mustang/b65 として進めます。
まずソースアーカイブを展開します。jdk-6_0-ea-src-b65-jrl-22_dec_2005.jarをjavaで実行し、ライセンス(JRL)に同意するため[ACCEPT]ボタンをクリックします。インストール先を指定する選択ダイアログで、作業用のディレクトリ(例、~/mustang/b65)を指定します。
~$ java -jar jdk-6_0-ea-src-b65-jrl-22_dec_2005.jar
Java Plug-inをビルドするのに必要となります。jdk-6_0-ea-mozilla_headers-b65-unix-i586-22_dec_2005.jarをjavaで実行し、ライセンス(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.jarをjavaで実行し、ライセンス(JRL)に同意するため[ACCEPT]ボタンをクリックします。インストール先を指定する選択ダイアログで、ソースコードを展開した作業用のディレクトリ(例、~/mustang/b56)を指定します。
~$ java -jar jdk-6_0-ea-bin-b65-jrl-22_dec_2005.jar
ビルドは、コマンドプロンプト上で実行します。コマンドラインから実行するにあたって環境変数をいろいろと設定することが必要です。
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の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>
各ツールのディレクトリ、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)
環境変数PATHには、GNU make、Sun Studio Compiler、/usr/binの順番でパスが設定されている必要があります。
~$ PATH=/usr/sfw/bin:/opt/SUNWspro/bin:$PATH ~$
各ツールのディレクトリ、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_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$
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$
ビルド開始前に、環境変数や各種環境設定の確認を行います。
設定が完了したら、ソースファイルをインストールしたディレクトリの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の選択肢が存在します。
ネイティブ部分はMustangのバイナリ・リリースを利用し、C++コンパイルせずにJava部分だけビルドする方法があります。
D:\mustang\b96\control\make> set ALT_JDK_IMPORT_PATH=...
D:\mustang\b96\control\make> make IMPORT_NATIVE_BINARIES=true
D:\mustang\b96\control\make> make SKIP_FASTDEBUG_BUILD=true scsl
D:\mustang\b96\j2se\make> make docs
D:\mustang\b96\control\make> make clobber
ビルド結果のディレクトリ(環境変数ALT_OUTPUTDIRで指定した場所)は以下のようになっています。
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 |
設定が完了したら、ソースファイルをインストールしたディレクトリの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コマンドが西欧言語のメッセージファイルの処理に失敗するのを防止するためです。(理由は分かりませんが)
コマンドプロンプトを起動して、ビルド結果のディレクトリの中の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
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:\>