目次へ

JDKのビルドならやっぱりSolarisですわよ奥様

絶対Windowsじゃないと困るんだ!とか、うぉれのLinux以外使いたくない!とかいうんじゃなくて、ただ「オープンソース化されたというならちょっとそのコンパイルってヤツをやってみたい」というだけの人なら、おまけに「けどあんまり面倒なのはいやヨ、さわりだけでいいの」という人なら、ゼヒともおすすめする環境はSolaris10だ。
ワタシは最初からその環境に目をつけていた。だって同じ太陽の下に生まれた兄弟じゃないの。サーバにBSD使ってるらしいと噂のあるどこかのOSベンダと違って、絶対に楽に違いない。
で、結果的にはまじめにやりさえすれば予想通り激楽だった。まじめにやりさえすれば。しかし最初にまじめにやらなかったワタシは天罰てきめんで二日ほどエラーメッセージに悩まされた。しかし「実際に使うJavaはSun様からバイナリをいただきゃいんだから、これはそうオープンソース化への御祝儀代わりのコンパイルってヤツよ」という平常心、あの気性の穏やかな熊のような心で取り組んだことで、素直に悔い改めて最初っからまじめにやり直すことができた。でももっと強い平常心を持っていたら最初っからまじめに(中止)

いつだかテレビであの熊が愚かな虎にハチミツの壺をひっくり返されるという筋の寸劇を流しているのを見て、不幸を穏やかに哀しみはするが決して虎を責めない熊の生き方にタイヘン共感し、自分もこの熊のように生きたいとは思っている。

ソルテン、それも最新版をゲットだ。2006年11月のリリース版およびコンパニオンソフトウェアのインストールについては、マイ駄文「それからのソルテン」を参照してくれたまい。


そのバイナリは必要なんだヨ

ワタシがやった最初の間違いは、ダウンロードサイトにあった「バイナリ」を、「プレビルド」と間違えたことだった。
たとえばopenJDKのJDK7のダウンロードサイトに行ってみよう。

まず、https://jdk7.dev.java.netに行く。そこに「Download JDK7」というリストがあって

が挙げられている。迷わず二番目の「source snapshots」を選ぶデショ。
さて、ここを選ぶと(http://download.java.net/jdk7/)今度はまたリストがある。 最後の「Mozilla Binaries...」はUnix用とWindows用とある。 さて一番上の「JDK7 Source」は迷わずjdk-7-ea-src-b05-jri-04_jan_2007.jarというダウンロードリンクをつついてゲットだッ。とそこまではよかった。
「あとReadmeとかはいいとして、それからワタシはソースからコンパイルするんだからこのバイナリというのは関係ないわね」

ブブー

JDKはついこないだオープンソース化されたばかりだが、ここまで発展するのに一部オープンソース化できないサードパーティーなどのコンポーネントを含んでいる。将来すべてがクリアでオープンなコードに書き換わるまで、今はその部分だけはバイナリで提供している...そのハナシはSun様の「Javaの開き始めました」ドキュメントを何度も読んでよく知っていて自分がSun様に代わって説明してもいいくらいと思っていたのに、スコーンと忘れてたっつかそれがコレだということがアタマに浮かばなかったのだ。それでエラー連発だ。「JDK Biranies for Source Buildって書いてあるだろゴルァ」もちゃんとダウンロードすべし。


急がば回せ!

ワタシがやった二番めの間違いは、「ちょっと試すだけなんだからプラグインとかいらないし」と思ってしまったことだった。後述のように、Mozilla用プラグインをビルドするにはgcc2.95が要る。それはSolarisのパニオンDVDからインストール紗英すればよいのだが、「まあそれもめんどくさいし」とももってしまった。それでビルドしようとすると「モヂラのヘッダがありません」というエラーが出る。実はプラグインのビルドをスキップするビルドオプションもあるのだがいちいちオプションを打つよりは一回DVDを回したほうがずっとカンタンということがわかった。おまけにCUPSという印刷管理システムのヘッダファイルも必要なのだがこれもパニオンに入っている。つまりどのみち回さないわけにはいかないのだヨきみぃ。だから観念して往生して「Mozilla Binaries for Source Build 7」も、Unix用のをダウンロードする。

同じところに展開する

こうしてJDKビルドのための三役をゲットしたことになる。

jdk-7-ea-src-b05-jri-04_jan_2007.jar
jdk-7-ea-bin-b05-jrl-04_jan_2007.jar
jdk-7-ea-mozilla_headers-b05-unix-04_jan_2007.jar

三つのjarファイルは展開して使う。このときダブルクリックで開いたり右クリックで「ここに抽出」を選んだりなどとしてはいけない。jarを使わないと正常に展開されないゼ。
で、どこに展開するか。ワタシは/home/noniko/openjdkという作業用フォルダを作った。
このjarファイルは実に親切である。試しにjdk-7-ea-src-b05-jri-04_jan_2007.jarを以下のようにして展開してみよう。これら三役が揃い踏んでいる場所に行って

java -jar jdk-7-ea-src-b05-jri-04_jan_2007.jar

すると、ちょっとだけ待つかも知れないが、GUIが立ち上がって「どこに展開しますか」ときいてくる。同時に与えられたファイルブラウザから、/home/noniko/openjdkを選んでやればよいのだ。このソースコードのアーカイブが一番時間がかかる。あとの二つも同じところを指定する。これらの展開はハナイキで終わる。 終わると、openjdkフォルダの中は、以下のようなファイル/フォルダ構成になっているはずだ。
JDKソースのフォルダ・ファイルリスト

BinaryLicense.txt        j2se
JavaResearchLicense.txt  javalogo52x88.gif
MPL-1.1.txt              motif
README-builds.html       share
README.html              sunlogo64x30.gif
build-linux.html         
build-solaris.html       
build-windows.html       
build.html               
control                  
deploy                   
hotspot                  
install                  
上記で、フトシさんはフォルダだ。単体ファイルは全部インストラクションだのライセンスだの画像だから、ビルドそのものには関係ない。ただし、README-builds.htmlは全ての指針が書いてある大事なファイルだ。

Sun Studio11を入れる

ソルテン自身をもらってきた場所からSun Studio 11ももらってくる。インストールはきわめてカンタンだが、ひとつ注意事項がある。studio11-solx86.tar.bz2というファイルをもらったら、自分でsunstudio11などというフォルダを作っておいてそこにこいつを一度納める。というのはコイツは右クリック「ここに抽出」で桶なのだが、身仕舞いの悪いヤツでその場に散らかるからだ。
展開されたらそこでターミナルを開いて(好きな場所からターミナルを開く方法も「それからのソルテン」を参照のこと。もちろんコマンドを駆使してそこに移動してもヨヒ)

suでrootになり
./installer

あとはウィザードに従うのみ。
そしたらStudioのbinフォルダを環境変数PATHに設定しておく。これはもちろん他のビルドやCCおよびGCCの学習にも長く使って行きたいモノであるから、ここで一現さんの設定をするよりちゃんと環境設定ファイル.profileに記載しておいたほうがお得ざます。ちなみに他のパスも含めて宅ではこんな風に設定しておりますの。
STDPATH=/opt/SUNWspro/bin
export STDPATH

MYPATH=/usr/sfw/bin:/opt/sfw/bin:/opt/sfw/lib/bin:/usr/ccs/bin
export MYPATH

PATH=$STDPATH:$MYPATH:$PATH
export PATH

ちなみに、環境設定ファイルの変更を反映するには

今立ち上げた君のそのコンソールでぇ〜(フォークソング風に早口で歌う)変更を反映するにはいくつか方法があるう〜。たとえば自分自身でもう一度ログインしなおす。このときハイフン「-」をつけて「ホームディレクトリからやり直します」旨通告する。
su - noniko
パスワード:(入力する)
Sun Microsystems Inc.   SunOS 5.10      Generic January 2005
みたいに、ログイン成功のメッセージが帰ってくれば、そのとき環境設定ファイルは読み込まれている。
また、環境設定ファイルを読み込めとチョクで命令するには「. 環境設定ファイル名」とすればよい
. .profile
昔はこの「.」って何かわからなかったんだヨのに子も。ちったあ物知りになったもんだヨ。

だがいくつもコンソール乱立状態になったりうっかりコンソールを閉じてまた上げたりして、あーこのコンソールで環境設定読んでねえしムキーとかなりやすい人はもう男らしくズバーッとデスクトップごとログアウトしてまたズガーっとログインし直したほうがスッキリする!とにかくそのようなことをやってSun Studioの「cc」コマンドをシステムに覚えさせておく。


日本語環境だとエラーが出る

ビルドの過程で、「いつビルドしたか」をタイムスタンプするために、システムから日付を取得してフォルダ名かファイル名かにする部分がある。日本語環境だと日付は日本語で取得されるので馬鹿野郎こんな変な名前のファイルが作れるかガチャーン何だその辛気くせぇ顔は酒だ酒持ってこぉーいというようなエラーが出る。そこで環境は英語っつか「C」にしよう。やはり、作業するコンソールで
LANG=C
export LANG
とやってもいいんだが、何もまじないみてぇなインターフェイスになるわけじゃない、一度がッとログアウトしてログイン画面でオプションの言語に「C」を選んでログインし直したらいいじゃないか!なんかめんどくさそうなものを扱うときは、ワタシはいつもそうしている。

いちばんめんどくさい作業は二つ

最も激楽なSolarisといってもめんどくさい作業は二つある。だが、これだけでいんだから他のOSでやってみればありがたさがわかるかもヨ。将来完全にオープンソース化されたらこんな作業もしなくてよくなるのかも知れない。わかんないけど。

あとは環境変数のオンパレードだ

ここまで準備をしたらあとは環境変数を設定していくわけだが、README-builds.htmlを読むとどうにも解せない箇所がある。いろいろな環境変数のデフォルトにこんなものがあるのだ。

SLASH_JAVA が「/java」というパスだ、という設定を筆頭に
$(ALT_SLASH_JAVA)/re/j2se/1.5.0/archive/fcs/binaries/platform とか
$(ALT_SLASH_JAVA)/devtools とか
$(ALT_JDK_DEVTOOLS_PATH)/shared/cups とか

んな不可解な奇っ怪なパスが俺のおまえの誰かのどのパソコンのどのOSに通ってるってんだコラ見せてみろよ知るか俺ぁこんな生まれてこのかた見たことも聞いたことも

と思いませんか。そこでいろいろググって見たところ、みなさんこのような獣道は一切無視して、わたしたちにも十分馴染みのある御自宅のパスに全部きれいさっぱり髪の毛一本残さず書き換えておられるようでございます。
のに子的推論は以下のどちらかですね。これらの奇怪なデフォルトは

これまでのプロプライエタリな開発者のみなさまが専用でお使いになっていた?
これからのオープンソースプロダクトはこういう構造になる予定?

いずれにしろ書き換えちまえばいいんだ!と、理解したら、以下の環境変数を.profileに書き込む(一部、デフォルトで書いてあるものも示してある)。いんだヨ。ちっと初期設定が増えたからってデスクトップの起動が遅くなるわけじゃないっつかすでに十分遅(中止)

PATH=/usr/bin:/usr/ucb:/etc:.
export PATH

STDPATH=/opt/SUNWspro/bin
export STDPATH

MYPATH=/usr/sfw/bin:/opt/sfw/bin:/opt/sfw/lib/bin:/usr/ccs/bin
export MYPATH

PATH=$STDPATH:$MYPATH:$PATH
export PATH

OPENJDK=$HOME/openjdk
export OPENJDK
ALT_BOOTDIR=/usr/jdk/instances/jdk1.5.0
export ALT_BOOTDIR
ALT_DEVTOOLS_PATH=/usr/bin
export ALT_DEVTOOLS_PATH
ALT_MOZILLA_HEADERS_PATH=$OPENJDK/share/plugin
export ALT_MOZILLA_HEADERS_PATH
ALT_MOTIF_DIR=$OPENJDK/motif_area
export ALT_MOTIF_DIR
ALT_COMPILER_PATH=$STDPATH
export ALT_COMPILER_PATH
ALT_GCC_COMPILER_PATH=/opt/sfw/gcc-2/bin
export ALT_GCC_COMPILER_PATH
ALT_ODBCDIR=$OPENJDK/odbc
export ALT_ODBCDIR
ALT_CUPS_HEADERS_PATH=/opt/sfw/cups/include/
export ALT_CUPS_HEADERS_PATH
ALT_OUTPUTDIR=$OPENJDK/myjdk
export ALT_OUTPUTDIR

このALTだらけの環境変数の詳細はドキュメントに書いてあるのでカンタンにご紹介。 これが「とにかくまじめにやる」場合の、最低限の環境設定だ。あんなオプションこんなオプションで高度なビルド技をかます場合は他にも指定する変数が出てくる。
パスっていったいどこのフォルダまで指定すればいいの、binフォルダ、実行ファイル、それともアプリケーションのホーム?...と迷う場合は、多くはREADME-builds.htmlに書いてあるんだけど間違っていたらエラーメッセージが出るのでわかる。たとえば最初、CUPのヘッダファイルのパスの指定を

ALT_CUPS_HEADERS_PATH=/opt/sfw/cups/include/cups

とやってしまった。だってこの下に実際のヘッダファイルがあるんだもーん。でもそしたらビルドのときに、

「ホントに/opt/sfw/cups/include/cups/cupsなんてパスあんのかゴルァ」

というメッセージが出た。つまり、includeフォルダで止めとけということだ。こんなふうにして環境変数をやりくりしていく。

ついにビルドだッ

ではいよいよビルドであーるッ。openjdkフォルダの下のcontrol/makeフォルダに行く。Makefileを始め、ナントカ.gmkなどのファイルがありますか?ではそこでターミナルを開きます。そして運命のコマンドを。

gmake dev

ハイ、これだけです。なんと簡潔な!ちなみにgmakeというのはGNUのmakeで、Solarisでmakeとやると/usr/ccs/bin/makeというモノが呼ばれてくる。このGNUでないmakeは実は結構親切で、呼ばれはしたがああこりゃgmakeだねあっしゃあお呼びでないようだねと自動でgmakeを呼んでくれるのだが今回はダメのようだ。
以前はgmakeもパニオンで入れなければならなかったがソルテンでは/usr/sfw/gmakeがちゃんと入っていて、フツーにgmakeとやれば出てくるのはこっちだ。
さて御同輩、わしゃわしゃとターミナルに出力が現れましたか?ハイ、ではあとは待つだけです。ワタシのWinchester 3500+でメモリ1GBのかなり強力であるはずのスペックでも3時間半かかりました。あとビルドしながらモノカキだのウェブブラウズだのやった日にゃ途中で何度もウィンドウがトド凍ります。エラーで終了しないことを祈りながらひたすら眺めるべし!ありがたいお経のようで、見ているだけで心が洗われてくるような気がする。何か御利益があるかも知れないぞヨ。

動作確認するには

これはREADME-builds.htmlに書いてあることですが、生成ブツのフォルダを開きます。ここではmyjdkフォルダにあるはずなので、myjdk/demo/jfc/java2Dというフォルダに行きます。ここでターミナルを開いて、

$OPENJDK/myjdk/bin/java -jar Java2D.jar

と、ちゃんと今ビルドしたjavaのパスを正確に指定して実行します。出ましたかー?とにかくやたらいろいろ動く画面が出ましたかー?ではそのわやわやと動くウィンドウを閉じて、次にこう打ってみましょう。

java -jar Java2D.jar

ハイ。これはソルテンについてるJDK5での実行です。出ましたかー?途中で「クラスが見つからない例外」が出ましたかー?そぉーです。先ほどのデモはJDK5ではないJavaで動いていることが証明されたのでぇーす!

あらSun様見てたのねホーッホッホッホッ

実はまずこの方法はJDK6で試し、次にJDK7のビルドでもうまく行ったので日本語版を書くことにした。その前にJDK6に成功した時点で英語ブログにまず書いた(Noniweblog Worldwide)。ちっとレイアウト的にアレなものになったが、そしたら二日後にコメントが入っていた。

おまえさん、やるじゃねぇか。もしJDKビルドの「merit badge」があったら、ひとつくれてやってもいいところだゼ。

それがね奥様、Sun様のJDKのエンジニヤの人だッたのヨ。もうこんな偉い人にホメられちゃってどうしようかしらホーッホッホホーッホッホッホッ。でもSunの人ってみんな「もしナントカがあったらやってもいいゼ」ってジョークが社風なんだろうか(オープンソースマガジン2006年12月号「のに子のちゃれんじざわ〜るど」参照)...今度は「ゼヒお願いします」じゃなくて「そのお言葉がわたくしめにはすばらしいバッヂでございます」とレスってさしあげた。
けどmerit badgeってなんなんだろう。調べてみた。

「ボーイスカウトの「技能章」。応急処置とかキャンプとかいう分野を学習して、当局に認定されるとバッチがもらえる」

ボォォーイスカウトかよッ。またnoniki兄貴と思われたのかッ。だがそのあとに重要なコメントがいろいろあったのでここになるべくまじめに紹介する。

ちょっと言わせてもらうゼ。まず、OPENJDKって語を使ってるようだが、これはまだ真のオープンソースJDKじゃなくて、まだJRLライセンスのJDKなんだヨ。ま、いずれ真のオープンソースになるわけだから、大したこっちゃねえがな。
  1. プラグインやjavawとかのビルドをスキップするには

    gmake BUILD_DEPLOY=false dev

    とやるんだゼ。
    http://weblogs.java.net/blog/kellyohair/archive/2006/12/jdk6_build_chea.html
    に、他にもいろんなワザを書いてあるから読んでみな。

  2. 公式ビルドはSolaris8で作って、以降のバージョンにも対応するようにしてるんだ。Solaris10でビルドしたブツを古いSolarisで走らすと、ネットワークやソケットの部分でちっとトラブるかも知れないぜ。これはソルッパチとソルテンで/usr/includeファイルの内容が違ってるからなんだが、まあ今じゃみんなソルテンでJava開発してるからな。

  3. LinuxでのビルドもSolarisとそんなに変わらないゼ。Windowsはかなり違うね、インストールしなきゃならないモノも多いし。

まじめってあの、内容がネ。

他のプラットフォームでも!参考文献ざます

Java SE SDKをビルドする(Mustang編) WindowsとSolaris x86でそれぞれビルドする方法がくわーしく説明してある。
Cay Horstmann's Blog-Honey, I built the JDK! (on Ubuntu)なんとUbuntu Linuxで。ムム、やるな。

さあ、まずはソルテン、それに味をしめたら(日本語の誤用)いろんな環境でJDKをビルドしてみよう!してどうするっていいじゃないかそんなことは。オープンソース化記念でも今年一年の無病息災祈願でも。