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 に設定したりしても駄目。Apple の Java は 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 対応した物を見てみたい。