なかなかビルドが終わりません。エラーを解決しても次から次へとエラーが出てきます。これは大変だ。というかビルドというのはソフトウェア開発の中でも大変な作業の一つです。
ビルドエラー対処
では昨日のエラーの解析から始まります。
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のMakefileがDirectX 9.0 SDKの環境変数を設定するルールを以下のように定めているためです。
- 環境変数ALT_DXSDK_PATHが指定されている場合
- DXSDK_INCLUDE_PATHは、DXSDK_PATH\Include
- DXSDK_LIB_PATHは、DXSDK_PATH\Lib
そこで、環境変数ALT_DXSDK_PATHは指定せずに、直接インクルードパスとライブラリパスを指定します。
- 環境変数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 SDKとWindows 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\mfc にafx.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のライブラリをリンクしようとするとエラーになります。