|
JaclとTcl Blendは、オープンソースで開発されており、両方とも SourceForgeのこのサイトで入手できます。 2003年のバージョン1.3.1以降、しばらく停止していましたが、 2005年6月に1.3.2が公開され、この新しい版はTcl/Tk 8.4.11、Java 1.4/5.0という、 最新の周辺環境でもテストされているようです。 Jacl/Tcl Blendを使用する場合には、 SunのJ2SE SDK 1.3以降と、 (Tcl Blendの場合のみ) Tcl/Tk 8.3以降が必要です。私は次の環境で動作を試しました。
Jaclにはソースアーカイブとバイナリアーカイブが配布されていますが、 Jaclはもともと純粋Javaで書かれたクラスライブラリ(JARファイル)なので、 バイナリアーカイブもどのOSでも共通にインストールできるので、 バイナリアーカイブでも十分使えますし、インストールはとても簡単です。 上記のリンクからバイナリアーカイブをダウンロードして、 展開すると中からjacl.jarとtcljava.jarという2つのJARファイルが出てくるので、 これらに環境変数CLASSPATHを通せば作業は完了です。 試しに、Java処理系で、クラス「tcl.lang.Shell」を実行させてみましょう。 これが(非公式な呼び名ですが)「jaclsh」とでも呼ぶべきものです。 SHELL> java tcl.lang.Shell %このようにプロンプトが出ればOKです。 なお、このときに、CLASSPATHにTcl BlendのJARファイル (tclblend.jar)を含めていると、次のようなエラーが出る場合があります。
Exception in thread "main" java.lang.NullPointerException
at tcl.lang.Interp.create(Native Method)
...
Exception in thread "main" tcl.lang.RuntimeError:
could not find class java/lang/Object.
Check that your LD_LIBRARY_PATH environment variable
includes the directory where libtclblend.so resides.
Try looking in the directories under the value of tcl_library,
...
これはなんだかよく分かりませんが、
tclblend.jarをCLASSPATHから外すと発生しなくなるようです。
さて、よくよく考えてみますと、 Jaclは純粋Javaで書かれたソフトウェアということは、 ソースコードはJavaで書かれているということは、UNIXでもWindowsでも、 別にソースアーカイブを入手する必要はないのですが… Javaコンパイラを持っていればビルドはそれほど難しくないので、 ソース配布からインストールしてもよいでしょう。 また先述の通り、Jacl 1.2.6には、 アプレットからJaclを起動しようとすると、 Javaコンソールに次のようなエラーが出て使えないというバグがあります。 could not load resource "/tcl/lang/library/init.tcl resource"これを直すには、ソースを1行だけ直してコンパイルする作業が必要になります。
バイナリ配布があってもソース配布からビルドしたいという苦労好きな皆様(帰れ)、 1.3.1での手順です。 WindowsではREADMEを読むと「msys-mingwを使え」 と書いてありますが、私の環境で試すと(msys 1.0.9+MinGW 3.0.0)、 configureがまず失敗しますし、シェル変数JAVAを自分で編集して強引にMakefileを作っても makeでまた失敗します。 ということで現在、1.3.1のコンパイルはLinuxで行い、 できたjacl.jarとtcljava.jarをWindowsに持ってきて使う、というセコ技で逃げています。 Linux環境でのコンパイルはとても簡単です。 1.3.0までと異なり、configureスクリプトはunixまたはwinサブディレクトリではなく、 アーカイブのトップディレクトリに移っているので、
UNIXでTcl Blend 1.3.0をインストールするには、 ソース配布からコンパイルすることになります。 前準備として、JDKをインストールしておくことと、 Tcl処理系をソース配布から configureのとき--enable-threadsオプションをつけて ビルドしておく作業が必要です (インストールはしなくてもよいです)。 また、TclのThread Extensionも必要です。 こちらも、必ずしもインストールしなくてもよいですが、 特定のディレクトリでビルドしておく必要があります。 では、まずThread Extension 2.5のUNIX環境でのインストール手順です。 アーカイブを展開したトップディレクトリにconfigureがありますが、 これはトラップなので実行してはいけません。 人食い箱です。赤く光るのです。(なんじゃ、そりは) ちょっとトリッキーなので要注意。 % tar xozf thread-2.5.1.tar.gz % cd thread-2.5/unix % sh CONFIG % make # make installでは、ここからがTcl Blendのインストール手順です。 % tar xozf tclBlend1.3.0.tar.gz % cd tclBlend1.3.0 % sh configure --with-tcl=../tcl8.4.3/unix \ --with-thread=../thread-2.5/unix \ --with-java=/usr/local/j2sdk1.4.1_02--with-tcl はTclをビルドしたディレクトリを指定します。 同様に、--with-threadにはThread Extension をビルドしたディレクトリを指定します。 --with-threadは「thread2.5」ディレクトリの位置を指定しても、 その下の「unix」ディレクトリの位置を指定しても、どちらでもよいようです。 JDKは、PATHに通っているjavacコンパイラを含んでいるものが認識されるので、 あらかじめPATHをそのようになるようにしておくか、 configureの--with-javaオプションを使います。 % make % su root # make installこれで、インストール位置を特に指定しなければ、 /usr/local/bin に jtclsh と jwish、 /usr/local/lib に tclblend.jar と libtclblend.so、 /usr/local/lib/tclblend に pkgIndex.tcl が入ります。 tclblend.jarは環境変数CLASSPATHに追加しておく必要があります。 jtclshとjwishはJava VMを実行するためのもろもろの環境変数の設定をしたあと、 スクリプト名に従ってtclshかwishを呼び出すスクリプトです。 しかし実行してみると、(1.2.6の場合)次のようなエラーで止まってしまいました。
basename: error in loading share libraries:
/usr/local/jdk1.3/jre/lib/i386/classic/libjvm.so:
undefined symbol: jdk_sem_post
The wrapper script must be named jtclsh or jwish.
ありゃりゃりゃーん!!
そこでWebで検索を行ってみると、PHPの一部のバージョンでも、
このようなエラーが起きることがあるそうで、その際の対応策として、
ネイティブの共有ライブラリのパスを少し変えると動いたそうです。
そこで、jtclshをテキストエディタで編集して、次のように書き換えてみます。
#JAVA_ARCH_GREEN_RUNTIME_LIBS=/usr/local/jdk1.3/jre/lib/i386:
/usr/local/jdk1.3/jre/lib/i386/green_threads:
/usr/local/jdk1.3/jre/lib/i386/classic:${LIB_INSTALL_DIR}
JAVA_ARCH_GREEN_RUNTIME_LIBS=/usr/local/jdk1.3/jre/lib/i386:
/usr/local/jdk1.3/jre/lib/i386/green_threads:
/usr/local/jdk1.3/jre/lib/i386/server:${LIB_INSTALL_DIR}
#JAVA_ARCH_NATIVE_RUNTIME_LIBS=/usr/local/jdk1.3/jre/lib/i386:
/usr/local/jdk1.3/jre/lib/i386/native_threads:
/usr/local/jdk1.3/jre/lib/i386/classic:${LIB_INSTALL_DIR}
JAVA_ARCH_NATIVE_RUNTIME_LIBS=/usr/local/jdk1.3/jre/lib/i386:
/usr/local/jdk1.3/jre/lib/i386/native_threads:
/usr/local/jdk1.3/jre/lib/i386/server:${LIB_INSTALL_DIR}
つまり、「classic」を「server」に変えればOKでした。
(jwishはjtclshへのシンボリックリンクなので、編集は不要です)
これで、Tcl/Tkでおなじみの「%」というプロンプトと、
jwishの場合は空のウィンドウが出れば完了です。
さっそく、伝統と格式にのっとり、
% puts "Hello, World."とやってみるのです。 なお、JaclのJARファイルとtclblend.jarを両方CLASSPATHに含めている場合には、 tclblend.jarの方を先に(より先頭に近いほうに)含めないと、 スクリプトを実行させようとしたときに、 jacl.jar found on env(CLASSPATH) before tclblend.jarというTclエラーになってしまいます。
Tcl Blendのまず一番ややこしいのは環境変数の設定です。JDKのjavaコマンドや、 Tcl/Tk処理系が動くのを確認して、 ダウンロードしてきたライブラリやJARアーカイブを適当なところに配置して環境設定をするわけですが、 バイナリ配布の場合は文書もついておらず、なかなか難しいです。 ここではとりあえず、MS-Windows98、JDK 1.2.2、Tcl/Tk 8.3、 およびMS-Windows XP、J2SE 1.4、ActiveTcl 8.3.4.2上の環境設定です。 ちなみに JDK 1.1.x の元ではまた違う設定になるはずなのでご注意ください。
Tcl/Java 1.2.6では下記の問題は解決されたので、 この項の内容は完全におぶそりたるになりました。 が、戦争の記憶を未来に伝えるために残しておきたいと思います。 (なんじゃ、そりは) 1998年のことでした。(遠い目)Tcl Blend 1.2.5 はまだスタブ機構には対応していないので、 Tcl/Tk 8.2 用のTcl Blend は Tcl/Tk 8.3以降では使えません。 どうしてもという場合はソース配布をコンパイルして作ります。 ここでは MS-Windows98上、Visual C++ 4.0 で JDK 1.2.2+Tcl/Tk 8.3 対応の Tcl Blend 1.2.5 をビルドした例をメモっています。 当日用意するもの:
※基本的なことですが、バナナはおやつに含みません。手順は次の通りです。
|