Cygwin から Windows の JDK を使う
ほぼ CygwinでJavaを快適に使う どおりに。ただ、俺の場合 JDK を「D:\Program Files\Java\jdk1.5.0_11」なんて位置にインストールしてたからちょっと問題が。「Program Files」の空白がですね。いつもいつも困らせてくれますね。
よくわからないけど、上のサイトの java_wrapper に適当に手を加える。
java_wrapper.patch
--- java_wrapper 2007-02-18 03:44:48.000000000 +0900 +++ java_wrapper 2007-04-12 08:52:54.046875000 +0900 @@ -50,12 +50,12 @@ # # スクリプトのmain処理部 # -if [ -z $JAVA_HOME ]; then +if [ -z "$JAVA_HOME" ]; then echo "JAVA_HOME not defined." exit 1; fi -WIN32JDKDIR=`cygpath $JAVA_HOME` +WIN32JDKDIR=`cygpath "$JAVA_HOME"` CMD=`basename $0 .exe` PROGRAM=$WIN32JDKDIR/bin/$CMD @@ -67,12 +67,12 @@ exit 0; fi -if [ ! -e $PROGRAM ]; then +if [ ! -e "$PROGRAM" ]; then echo "$PROGRAM not found." exit 1; fi -if [ -n $CLASSPATH ]; then +if [ -n "$CLASSPATH" ]; then CLASSPATH=`cygpath -p -w "$CLASSPATH"` fi @@ -93,4 +93,4 @@ esac echo CLASSPATH=$CLASSPATH CMD=$CMD PROGRMA=$PROGRAM ARGS=$ARGS -exec $PROGRAM $ARGS +exec "$PROGRAM" $ARGS
問題になりそうな箇所をダブルクオーテーションでくくっただけですね。java_wrapper と同ディレクトリに java_wrapper.patch として置いて「patch
追記
cygwin だと、gcj の吐くバイナリは標準ライブラリを全部静的にリンクしているらしい。
$ time gcj -c hello.java gcj -c hello.java 0.17s user 0.23s system 63% cpu 0.631 total $ time gcj --main=HelloWorld hello.o -o hello gcj --main=HelloWorld hello.o -o hello 1.96s user 1.50s system 66% cpu 5.162 total $ ll 合計 6290 -rwxr-xr-x 1 Gekko なし 422 Apr 12 09:05 HelloWorld.class* -rwxr-xr-x 1 Gekko なし 6359834 Apr 12 20:24 hello.exe* -rw-r--r-- 1 Gekko なし 107 Apr 12 08:04 hello.java -rw-r--r-- 1 Gekko なし 5796 Apr 12 20:24 hello.o
コンパイルにかかる時間はたいしたことなく、オブジェクトファイルも大きくはない。リンクにとても時間がかかり、実行ファイルが超でかい。どうやらそういうことだそうで。
うすぼんやりと 2chのgcjスレ を眺めるに、UNIX系ならデフォルトで動的リンクの設定でコンパイルされるらしい。Cygwin でも静的リンクをやめて、動的リンクの方法もあるらしいけど、めんどうなのでしていない。
俺なんかはつい「ネイティブコードなんだから速いんじゃね?」と思ったりもするけども、そんな単純な話でもないらしいです。あろはさんも語ってましたけど、JVMさんもけっこうがんばりやさんらしいです。
http://www.shudo.net/article/Fedora-Core-Expert-200507-GCJ/
この辺の GCJ の記事を見るに、どっちかっていうと速度とかの面でも JDK には基本的には下から起っかけてる雰囲気なのかも。