0. 準備 ugs.tar.gz を適当なディレクトリの下で展開してください。ugs と いうサブディレクトリが作成され、その中にはライブラリ、ソース、 ドキュメント、テストプログラムが含まれます。もしお使いのシス テムが Linux-2.0.x ならば、ライブラリ ugs.a がそのまま使用でき ます。ugs の特に決められた置き場所というのはありません。 Linux-2.0.x 以外の環境で ugs を使おうとする場合は、ライブラリを 作成し直す必要があります。次節で述べるシステムに関しては、既に 作成されたバイナリが以下に置いてありますので、そちらを利用する 方が便利かも知れません。 ftp://iris.riken.go.jp/pub/ugs/ugs-.a.gz 1. ライブラリの作成方法 自分でライブラリを作成するには、先ず ugs.tar.gz を展開して作成 されたサブディレクトリ ugs/ に移動し、 Imakefile.def の先頭部分で定義されているシステム名を適当に編集してください。 それぞれのシステムに関する注意事項は次節を参照してください。 以下のコマンドを順次実行すると、ライブラリ ugs.a が作成されます。 % xmkmf % make Makefiles # 最後の 's' に注意 % make clean % make all make の最後に、tryxw, tryps, trytek というテストプログラムを サブディレクトリ test/ 以下に作成します。これらが正常に動くか どうか確認してください (テストが動いたからと言って完全なライブ ラリである事が保証されるわけではありませんが)。 テストの動作が確認されたら、ugs.a を適当なディレクトリに移動して ください。make install は用意されていません。 2. 動作確認されているシステム 現在の所、動作の確認されているシステムは以下に示す通りです。 他のシステムでも、私が動作確認に必要な環境を持っていないというだけで、 通常の UNIX + X11 システムならば移植は容易と思います (多少のソースの 書き換えは必要かも知れませんが)。ベクトルフォントデータ格納のために 2 バイトの圧縮形式を用いていますので、big/little-endian の指定が必要 です。関係するのは src/uge002.F 中の一行だけですが、プリプロセッサで 選択処理しています。Imakefile.def に無いアーキテクチャを指定する場合は、 この部分にも変更を加えてください。 ・Linux-aout Slackware 等では FORTRAN ソースの実行のために f2c と gcc を 連続して起動する f77 というシェルスクリプトが標準で入って いますが、ポインタ処理とオプション指定 (特にデバッグ) の都合の ため、fort77 (f77 の上位互換 perl スクリプト) と g77 (GNU-FORTRAN) を使っています。代表的な入手先は以下の通りです ('96/2/22 現在)。 ftp://sunsite.unc.edu/pub/linux/devel/lang/fortran/ {fort77-1.9.tar.gz,g77-0.5.17.{aout,ELF}.bin.tar.gz} ミラーとしては、最近は ftp://ftp{0,1,2}.iij.ad.jp/pub/linux/sunsite/... が充実していて便利です。 ・Linux-ELF Fortran の BLOCK DATA のみから成るオブジェクトは誰からも呼ばれない モジュールなので、ライブラリに加えても通常はリンクされません。が、 Linux-aout や SunOS では何故か指定無しでも正しくリンクされていました。 しかし、ELF ではそううまく行かないようです。BLOCK DATA を強制リンク する一般的方法は BLOCK DATA サブプログラムの名前を EXTERNAL 宣言 する事です。OSF/1 ではこの方法を用いていたのですが、Linux でこれを 行なおうとすると、g77-0.5.17 以前では UGS のフォントデータで用いて いる integer*2 型を扱えず、一方 f2c は BLOCK DATA をサブプログラム として変換してくれないので EXTERNAL 宣言しても対象となるルーチンが 無いと怒られる、という八方塞がりの状態でした。幸いな事に g77-0.5.18 では integer*2 型が扱えるようになったので、BLOCK DATA も g77 でコン パイルする事により、何とか難を逃れる事ができました。 Linux-2.0.x における Fortran の諸問題については http://iris.riken.go.jp/iris/Fortran-FAQ.html に記述されていますので、参考にしてください。 ・SunOS-4/5 (Solaris) X11 アプリケーションが make できるようになっていれば、問題有りません。 ・OSF/1, Digital Unix このシステムの最大の問題は、ポインタが 64-bit であるという事です。 UGS では Graphics Segment (描画データを格納する領域) のアドレスを INTEGER 配列 (当然ながら 32-bit) に保存しているので、そのままでは 正常に動作するはずが有りません。が、FNAL 版ではこの部分に関して何も 手当てしていませんでした。根本的な書き換えが必要なので、私も気が進み ません。ソースを追える範囲では運良く難を逃れているようにも思われます。 で、f77 のオプティマイズレベルがデフォルト (-O4) のままでは確かにコケ ます。が、-O1 まで下げると何となく動作するので放っています。一つの 確実な解決方法は、リンク (ld) のオプションに -taso というオプションを 付けて、必ず下位 32-bit にロードされるように指定する事です。 さ.ら.に.重要な注意。本リリースの UGS では、Exposure 等の非同期に 発生する X のイベントを処理するために alarm によるタイマ割り込みを 使っています。ところが、DEC-FORTRAN は READ(5,.. の入力待ちの最中に タイマ割り込みが発生すると Severe Error (39) が起こると言うアホな 仕様になっています。従って、X に出力する際には READ 文を他の等価な C のサブルーチンに置き換える必要があります。;_;) …と思っていたら、どうも Solaris も同様の仕様であり、更には Linux でも libc-5.4.38 以降で仕様変更されたようです (但し、5.4.38 自身は バグっていて上記方法でも問題を回避できません。5.4.44 以降を使って ください)。 ・FreeBSD 基本的には Linux と同様なのですが、標準パッケージの g77 ではうまく make できないようです。詳しくは topdrawer/INSTALL.FreeBSD を参照して ください。 ・HPUX 東北大の高橋さんが移植されたそうです。詳しくは topdrawer/INSTALL.HPUX を参照してください。