OpejJDK for Mac OS X

OS X 向けの OpenJDK が利用できるようになっていたので、ビルドしてみた。

http://mail.openjdk.java.net/pipermail/macosx-port-dev/2011-January/000007.html

http://wikis.sun.com/display/OpenJDK/Mac+OS+X+Port

Mercurial forest extension を使ってコードを持ってきて、環境変数をセットして make. XCode が必要。binary plug は Snow Leopard に入っている JDK を使うので、別途落とす必要はない。

引っかかったのは2点:

IDL 関連のコンパイルエラー

 /private/tmp/macosx-port/build/macosx-universal/corba/gensrc/
 org/omg/CORBA/ParameterModeHolder.java:5: ??????????????  
 ascii ??????????
 * IDL-to-Java ?R???p?C?? (?|?[?^?u??), ?o?[?W???? "3.1" ??????
                                           ^

LANG, LC_ALL を unset したり、C に設定したりしても駄目。AppleJava は LANG を拾ってくれないので仕方ない。環境変数 _JAVA_OPTIONS=-Dfile.encoding=ASCII を使っても駄目だ。結局エラーになってるファイルが UTF-8 でできている事を確認して、native2ascii で ASCII のファイルに変換して通るようになった。

 $ find build/macosx-universal/corba/gensrc/org/ \
 -name '*.java' | while read p; do native2ascii \
 -encoding UTF-8  $p > tmpj; mv tmpj $p; done

StubDebuggerLocal.c (SAPROC) のエラー

jni.h が見つからないと言っている。

Making SA debugger back-end...
/Developer/usr/bin/llvm-gcc-4.2 -Di486 -D_GNU_SOURCE                   \
                    -m32 -march=i586 -mstackrealign -Wl,-install_name,@rpath/libsaproc.dylib -dynamiclib -compatibility_version 1.0.0 -current_version 1.0.0 -fPIC -fPIC     \
	           -I/private/tmp/macosx-port/hotspot/agent/src/os/bsd                                        \
	           -I../generated                                       \
	           -I/System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Home/include -I/System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Home/include/darwin -I/System/Library/Frameworks/JavaVM.framework/Headers                                \
	           /private/tmp/macosx-port/hotspot/agent/src/os/bsd/StubDebuggerLocal.c                                        \
	                                                    \
	                                              \
	           -o libsaproc.dylib                                                \
	           
/private/tmp/macosx-port/hotspot/agent/src/os/bsd/StubDebuggerLocal.c:26:17: error: jni.h: No such file or directory

hotspot/make/bsd/makefiles/saproc.make が makefile.
コンパイラにはいくつも -I オプションを渡していて、その中には jni.h を持つ物もある。でもエラーになっている。

$ ls /System/Library/Frameworks/JavaVM.framework/Headers/jni.h
/System/Library/Frameworks/JavaVM.framework/Headers/jni.h

一見、ファイルはあるように見える。

$ head /System/Library/Frameworks/JavaVM.framework/Headers/jni.h
head: /System/Library/Frameworks/JavaVM.framework/Headers/jni.h: No such file or directory

でも、中身は見えない。

$ ls -l /System/Library/Frameworks/JavaVM.framework/Headers/jni.h
lrwxr-xr-x  1 root  wheel  30 10 17 17:23 /System/Library/Frameworks/JavaVM.framework/Headers/jni.h -> ../../CurrentJDK/Headers/jni.h


シンボリックリンクだけど、リンク先が存在しない。

/Developer の下には jni.h が見つかったので、強引にそのディレクトリを -I に続けて指定する。

  ...
ifeq ($(OS_VENDOR), Darwin)
  BOOT_JAVA_INCLUDES = -I/Developer/SDKs/MacOSX10.6.sdk/System/Library/Frameworks/JavaVM.framework/Versions/1.6.0/Headers -I$(BOOT_JAVA_HOME)/include \
  ...


これで make が通るようになった。

$ build/macosx-universal/bin/java -version
openjdk version "1.7.0-internal"
OpenJDK Runtime Environment (build 1.7.0-internal-foo_2011_01_12_22_32-b00)
OpenJDK 64-Bit Server VM (build 20.0-b03, mixed mode)

OpenJDK Java7 起動成功!

SwingSet2.jar を実行して気づいたけど、この版はまだ X11 を使っている。otool -L の出力では Cocoa もリンクされていて分かりにくいが、lsof で見ると Apple Java では出てこない X11 関連のパス(フォントが目立つが)がたくさん出てくる。今までの Apple Java というよりは BSD port に近い。早く Cocoa 対応した物を見てみたい。