torutkのブログ

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

Java SE 6 (Mustang)のビルド再開(Windows)

Visual Studio .NET 2003のVC++7.1を用いてビルドを実施していくことにしました。
今度は素直に進むかと思いきや、がんがんエラーが発生します。どういうことだぁ〜。

Mustang b50のリリース

本日(U.S.時間では9/1)、b50がリリースされています。Bug Fixedを見ると、ビルド関係のものがかなり修正されています。Windows環境でのMakefileで扱うパスにおいてCygwin表記とWindows表記の混乱が修正されていたりするようです。Makefileの見直しもかなり行われて統廃合等あるようです。

Mustang b50でビルド実施

ソースアーカイブの展開

まずソースアーカイブを展開します。jdk-6.0-ea-src-b50-jrl-01_sep_2005.jarをダブルクリックし、ライセンス(JRL)に同意するため[ACCEPT]ボタンをクリックし、インストール先を指定するファイル選択ダイアログで適切な場所を指定します。例)E:\work\mustang\b50

Mozilla Headers and Librariesの展開

Java Plug-inをビルドするのに必要となります。jdk-6_0-ea-mozilla_headers-b50-windows-i586-01_sep_2005.jarをダブルクリックし、ライセンス(MOZILLA PUBLIC LISENCE Ver.1.1)に同意するため[ACCEPT]ボタンをクリックし、インストール先を指定するファイル選択ダイアログで適切な場所を指定します。例)E:\work\mustang\mozhead

JDKソースビルドに必要なバイナリの展開

jdk-6.0-ea-bin-b50-jrl-01_sep_2005.jarをダブルクリックし、ライセンス(JRL)に同意するため[ACCEPT]ボタンをクリックし、インストール先を指定するファイル選択ダイアログで先ほどソースアーカイブを展開した場所を指定します。例)E:\work\mustang\b50

ビルドの実施
E:\> cd work\mustang\b50\control\make
E:\work\mustang\b50\control\make> make scsl
   :
コンパイラー・バージョンの誤認識

気になるメッセージが出ています。

  CC_VER = for [requires at least 12.00.8168]

WARNING: To build Java 2 SDK 1.6.0 you need :
       VC6 - link.exe version "6.00.8447"
       Specifically the Visual C++ 6.0 Professional + VC6-SP 3 link.exe.
        You appear to be using Linker version "7.10.3077"
       Please install the required version of Visual C++ and start your build again.

WARNING: The windows compiler must be version VC6 12.00.8168
       Specifically the Visual C++ 6.0 Professional + VC6-SP 3 Compiler compiler.

Visual C++ 7.1なのに、なぜか Visual C++ 6.0と誤認識しています。
CC_VERという変数の値は本来バージョン番号なのですが、ここに"for"という文字列があるのが原因です。
j2se/make/common/shared/Compiler-msvc.gmkのファイル中に以下の記述があります。

  # 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}')
    CC_MAJORVER :=$(call MajorVersion,$(CC_VER))
    REQUIRED_CCTYPE = Optimizing
    ifeq ($(CC_MAJORVER), 13)
      COMPILER_NAME="Visual C++ 7 Professional"
      COMPILER_VERSION=VC7
      REQUIRED_CC_VER = 13.10.3077
      REQUIRED_LINK_VER = 7.10.3077
    else
      COMPILER_NAME="Visual C++ 6.0 Professional + VC6-SP 3"
      COMPILER_VERSION=VC6
      REQUIRED_CC_VER = 12.00.8168
      REQUIRED_LINK_VER = 6.00.8447
    endif

CC_VERを作っているロジックは

>cl 2>&1 | head -n 1
Microsoft(R) 32-bit C/C++ Optimizing Compiler Version 13.10.3077 for 80x86

で表示されるメッセージからgawkで8番目の単語を抜いていますが、この8番目はなんと"for"なのです。「バージョン番号っ、フォーっ!」
また、CC_TYPEを作っているロジックは同じく上記メッセージの5番目の単語を抜いていますが、この5番目はなんと"Compiler"なのです。
本来は、CC_VER=13.10.3077、CC_TYPE=Optimizing になるべきなので、上述のCompiler-msvc.gmkの記述を修正します。

+    CC_VER  := $(shell $(CC) 2>&1 | $(HEAD) -n 1 | $(NAWK) '{print $$7}')
     LINK_VER := $(shell $(LINK) | $(HEAD) -n 1 | $(NAWK) '{print $$6}')
+    CC_TYPE := $(shell $(CC) 2>&1 | $(HEAD) -n 1 | $(NAWK) '{print $$4}')
NMAKE : fatal error U1077: 'link.exe' : return code '0x460'
filebuff.obj : error LNK2019: 未解決の外部シンボル "public: void __thiscall std:
:locale::facet::_Register(void)" (?_Register@facet@locale@std@@QAEXXZ) が関数 "c

C++標準クラスライブラリのstd::locale::facetクラスが見つからないのでしょうか?
link.exeに指定している*.libにはmsvcrt.libはなかったのでこれが原因かもしれません。
→それは違いました。
Microsoft Platform SDK for Windows 2003 SP1をインストールして、かつ環境変数LIB、INCLUDEの先頭にこのPlatform SDKのinclude、libを指定していたためです。
MustangのBuidドキュメントには、Visual Studio .NET 2003のコンパイラを使う場合、Microsoft Platform SDKは、Visual Studio .NETに含まれるものを使用するとあります。
なので、最新のPlatform SDKを指定してはいけなかったようです。