torutkのブログ

ソフトウェア・エンジニアのブログ

Java SE 6(Mustang)のビルド格闘続行中

なかなかビルドが終わりません。エラーを解決しても次から次へとエラーが出てきます。これは大変だ。というかビルドというのはソフトウェア開発の中でも大変な作業の一つです。

ビルドエラー対処

では昨日のエラーの解析から始まります。

make: *** No rule to make target `E:/java/mustang_out/classes/com/sun/java/swing/plaf/windows/icons/Computer.gif', needed by `other_files'. Stop.

さて、j2se/make/javax/swing/plaf/Makefileを見ると、以下の部分でエラーが発生しているようです。

$(CLASSBINDIR)/%.gif: $(SHARE_SRC)/classes/%.gif
	$(install-file)

ここで%.gifに該当するファイル一覧は、Makefileと同じディレクトリにあるFILES.gmkに記述されています。

MISC_SWING_FILES = \
	$(CLASSBINDIR)/com/sun/java/swing/plaf/windows/icons/Computer.gif \
	$(CLASSBINDIR)/com/sun/java/swing/plaf/windows/icons/DetailsView.gif \
	$(CLASSBINDIR)/com/sun/java/swing/plaf/windows/icons/Directory.gif \

java.netのMustangのフォーラム(掲示板)を見ると、同様のエラー報告があり、対処としてはMustangのバイナリリリースから必要なファイルをコピーして回避したとあります。
うーん、JDKのバイナリのどこにあるのでしょうか?
rt.jarをjarで一覧してみると、com/sun/java/swing/plaf/windows/icons/Computer.gifというのがあります。ということは、rt.jarの中からFILES.gmkに記述されているファイル群を抜き出して、例えばComputer.gifの場合は$(CLASSBINDIR)/com/sun/java/swing/plaf/windows/icons の中に置いてみます。
$(CLASSBINDIR)は、環境変数ALT_OUTPUTDIRで指定したディレクトリの中のclassesディレクトリになります。

> jar xf %JAVA_HOME%\jre\lib\rt.jar com/sun/java/swing/plaf/windows/icons \
    com/sun/java/swing/plaf/motif/icons \
    com/sun/java/swing/plaf/gtk/icons \
    com/sun/java/swing/plaf/gtk/resources \
    javax/swing/plaf/basic/icons \ 
    javax/swing/plaf/metal/icons \
    javax/swing/plaf/metal/sounds
> xcopy com\sun\java\swing\plaf\windows\icons %ALT_OUTPUTDIR%\classes\com\sun\java\swing\plaf\windows
以下同様
make[4]: *** No rule to make target `E:/java/mustang_out/lib/audio/soundbank.gm', needed by `copy-files'. Stop.

%JAVA_HOME%\jre\lib\audio\soundbank.gmを、%ALT_OUTPUTDIR%\lib\audioにコピー

../../../../src\windows\native\com\sun\media\sound\engine\PLATFORM_API_WinOS_DirectSound.cpp(37) : fatal error C1083: Cannot open include file: 'dsound.h': No such file or directory

dsound.hはDirectX 9.0 SDKのincludeの中にあるのですが、なぜかエラーになっています。
コンパイル時に指定されるインクルードパスを見ると以下のようになっています。

D:/PROGRA~1/MICROS~1/bin/cl -O1 -MD -Zi -NOLOGO -FdE:/java/mustang_out/tmp/sun/j
avax.sound/jsoundds/obj/ -FeE:/java/mustang_out/tmp/sun/javax.sound/jsoundds/obj
/ -FmE:/java/mustang_out/tmp/sun/javax.sound/jsoundds/obj/  -W3   -DWIN32 -DIAL
-D_LITTLE_ENDIAN -DWIN32 -D_X86_ -Dx86  -DWIN32_LEAN_AND_MEAN -I. -IE:/java/must
ang_out/tmp/sun/javax.sound/jsoundds/CClassHeaders -I../../../../src/windows/jav
avm/export -I../../../../src/share/javavm/export -I../../../../src/share/javavm/
include -I../../../../src/windows/javavm/include -I../../../../src/share/native/
common -I../../../../src/windows/native/common -I../../../../src/share/native/ja
vax/sound -I../../../../src/windows/native/javax/sound   -DJAVA_SOUND -DJAVA_THR
EAD  -I../../../../src/share/native/com/sun/media/sound -I../../../../src/share/
native/com/sun/media/sound/engine -DX_PLATFORM=X_WINDOWS -DUSE_DAUDIO=TRUE   -c
-FoE:/java/mustang_out/tmp/sun/javax.sound/jsoundds/obj/PLATFORM_API_WinOS_Direc
tSound.obj  ../../../../src/windows/native/com/sun/media/sound/engine/PLATFORM_A
PI_WinOS_DirectSound.cpp

ここを見ると、DirectX SDKのIncludeが指定されていません。そこで、j2se/make/javax/sound/jsoundds/Makefileに以下の1行を追加します。

 CPPFLAGS += -I$(DXSDK_INCLUDE_PATH)
LINK : fatal error LNK1181: cannot open input file 'dsound.lib'

dsound.libは、Microsoft DirectX 9.0 SDKのLib\x86ディレクトリの中にあります。しかし、ビルド時に指定されるLIBPATHは、/LIBPATH:D:/PROGRA~1/MICROS~1.0SD/Lib です。
これは、MustangのMakefileDirectX 9.0 SDK環境変数を設定するルールを以下のように定めているためです。

  • 環境変数ALT_DXSDK_PATHが指定されている場合
    • DXSDK_INCLUDE_PATHは、DXSDK_PATH\Include
    • DXSDK_LIB_PATHは、DXSDK_PATH\Lib

そこで、環境変数ALT_DXSDK_PATHは指定せずに、直接インクルードパスとライブラリパスを指定します。

となります。

>set ALT_DXSDK_PATH=
>set ALT_DXSDK_INCLUDE_PATH=C:\PROGRA~1\MICROS~1.0SD\Include
>set ALT_DXSDK_LIB_PATH=C:\PROGRA~1\MICROS~1.0SD\Lib\x86

なお、Windows用ビルド手順書(build-windows-i586.html)には、ALT_DXSDK_LIBS_PATHと記述されていますが、Makefileを解析すると'LIBS'ではなく'LIB'が正しいようです。

cl : Command line warning D4002 : ignoring unknown option '-NOLOGO'

エラーではないのでビルドは進みますが、気になります。Visual C++ Toolkit 2003のclコマンドは、/nologo と小文字で指定する必要があるようです。

  • NOLOGO を指定しているメイクファイルを検索してみます。
mustang$ find . \( -name "Makefile" -o -name "*.gmk" \) -print | xargs grep NOLOGO
./deploy/make/plugin/toolkit/mozilla/Makefile:LFLAGS += /NOLOGO -def:$(SRCDIR)/$
(LIBRARY).def /SUBSYSTEM:WINDOWS /NODEFAULTLIB:nafxcw.lib -opt:noref /LIBPATH:$(
DEPLOY_MSSDK)/lib
./hotspot/make/Makefile:  NMAKE= MAKEFLAGS= MFLAGS= nmake /NOLOGO
./j2se/make/common/Defs-windows.gmk:  #   -NOLOGO  Don't print out startup messa
ge
./j2se/make/common/Defs-windows.gmk:  CFLAGS_COMMON  += -Zi -NOLOGO
./j2se/make/common/Defs-windows.gmk:  BASELFLAGS = -NOLOGO /opt:REF
mustang$

clコマンドでコンパイルするときは、CFLAGS_COMMONが該当するようなので、Defs-windows.gmkファイルを修正します。

CFLAGS_COMMON += -Zi -nologo

make[4]: *** No rule to make target `../../../src/share/lib/cmm/sRGB.pf', needed by `E:/java/mustang_out/lib/cmm/sRGB.pf'. Stop.

Mustangバイナリリリースの中(%JAVA_HOME%\jre\lib\cmm)に含まれる*.pfファイルをj2se\src\share\lib\cmmの中にコピーします。

LINK : fatal error LNK1181: cannot open input file 'odbc32.lib'

Platform SDKをインストールした際に、Core SDKだけ対象にしていたので、odbc32.libが含まれていませんでした。Platform SDKの中のMicrosoft Data Access components をインストールします。

なお、Windows用ビルド手順書(build-windows-i586.html)には、Platform SDKの中で必要なものは、Core SDKWindows Installer SDKとありました。ただ有償製品のVC++を入れると標準で含まれているかもしれません。

e:\java\mustang\deploy\src\common\windows\native\stdafx.h(26) : fatal error C1083: Cannot open include file: 'atlbase.h': No such file or directory

確信はないですが、ヘッダーファイルの問題だけ解決するならば、Platform SDKのinclude\win64\atl にatlbase.h初めatl*.hがあるので、これを環境変数INCLUDEに追加します。

>set INCLUDE=%INCLUDE%;"C:\Program Files\Microsoft SDK\Include\Win64\atl"

おそらく環境変数LIBにも追加した方がよいでしょう。

>set LIB=%LIB%;"C:\Program Files\Microsoft SDK\Lib\IA64"
D:\Program Files\Microsoft SDK\include\ComDef.h(23) : fatal error C1083: Cannot

open include file: 'comutil.h': No such file or directory

確信はないですが、ヘッダーファイルの問題だけ解決するならば、Platform SDKのinclude\win64\crt にcomutil.hがあるので、これを環境変数INCLUDEに追加します。

>set INCLUDE=%INCLUDE%;"C:\Program Files\Microsoft SDK\Include\Win64\crt"
e:/java\mustang\deploy\src\common\windows\native\WinRegistryWrapper.cpp(2) : fatal error C1083: Cannot open include file: 'afx.h': No such file or directory

これも確信はないですが、ヘッダーファイルの問題だけ解決するならば、Platform SDKのinclude\win64\mfcafx.hがあるので、これを環境変数INCLUDEに追加します。

>set INCLUDE=%INCLUDE%;"C:\Program Files\Microsoft SDK\Include\Win64\mfc"

おそらく環境変数LIBにも追加した方がよいでしょう。

>set LIB=%LIB%;"C:\Program Files\Microsoft SDK\Lib\IA64\mfc"
nafxcw.lib(nolib.obj) : fatal error LNK1112: module machine type 'IA64' conflicts with target machine type 'X86'

残念ながら、やはりIA64のライブラリをリンクしようとするとエラーになります。