あと、Free Solaris 7(英語版) の日本語環境構築にも参考になると思います。
JLE によって何が変わっているか(現在の SunOS4.1.4 ユーザーのほとんどは、X11R6.3 等をインストールし、openwin, sunview は使用していないと思われるので、openwin, sunview の JLE/non-JLE の違いについては問題ではないとします)
libc.so.1.9 と libc.so.101.9 で setlocale() はかなり違うようです。 locale 関係のファイルとして、non-JLE の setlocale() は /usr/share/lib/locale を、JLE では /usr/lib/locale 以下にあるものを参照します。
また、これらに関係する locale.h, stdlib.h 等も、JLE/non-JLE でいろいろ違うので、これらのヘッダーを使ってコンパイルしたものは、後で libc.so.* だけをすり替えたりするとうまく動かないことがあります。
X11R6.3, X11R6.4 については、JLE なら -DX_LOCALE を付けなくてもいいですが、non-JLE の場合は -DX_LOCALE を付けて X11R6.3, X11R6.4 を make し、各種 X アプリケーションが setlocale() を呼び出す時は、libc.so.1.9 の setlocale() ではなく、libX11.so.4.30 の _Xsetlocale() が呼ばれるようにします。
X アプリケーションの中には setlocale()
を使わずに自分で日本語対応しているものもあり、この場合は
-DX_LOCALE
無しでも日本語対応可能です。
たとえば、kterm-6.1.0や、
kinput2-v2 の Wnn4
使用時 (sj3 を使う場合はダメ) では setlocale() は呼ばれません。
(Wnn4 自体 (jserver, uum) も setlocale() は呼ばれません)
このため、JLE → non-JLE 移行作業時には特に kterm-6.1.0
が重宝しました。最新は kterm-6.2.0 ですが、今でも
kterm-6.1.0
もキープしています。
kterm-6.2.0では setlocale()が呼ばれますが、これは XIM のためだけであり、ソースの kterm.h で、#undef KTERM_XIM することによって、setlocale() を呼ばないようにできます。(この場合、kinput2 での入力は XIM ではなく kinput2 プロトコルを使えばよい)
日本語を扱うことそのものが本質的であるようなもの、たとえば、vi, kterm, MH 等は当然日本語対応しなければなりませんが、 それ以外のものはむしろ変に日本語化したくないというのが 基本的な考えです。
ですから、sh, csh, ls, date ... 等は non-JLE に置き替わって問題ありません。
では、JLE では何が変わっているのでしょう。
JLE では、euctojis, jistoeuc 等の漢字コード変換フィルターが付属していて、それらは /bin にインストールされています。
JLE の /usr/kvm/sys/`arch -k`/conf 以下の config ファイルには、
options EUC options JLE
というオプションがあります。これらは、JLE の stty コマンドで defeucw という拡張機能が使えたり、JLE の setterm コマンドで、カーネルレベルで EUC←→SJIS 変換機能が使えたりするものです。
まず、setterm コマンドですが、これは必要無いでしょう。 漢字コードは端末エミュレーター側で合わせるべきです。setterm -x SJIS を実行して EUC←→SJIS 変換していたりすると、その状態でさらに rlogin 等を行なうと、コード変換が2重に起きたりして混乱のもとです。
defeucw は、コマンドライン上に入力された EUC コードに対して BackSpace を行なった時、カーソルがちゃんと漢字1文字 (2バイト幅) 分戻るための機能です。これはできれば欲しい機能です。 でも、無いからといって困るものでもありません。
JLE のカーネルソースでは、たとえ options EUC, options JLE
をコメントアウトしても、それらにかかわらず
param.c で sys/eucio.h
を include していたりして、余分なコードが残ります。
さらに、それ以外にも OBJ/*.o のファイルのいくつかは、JLE
で置き換わっています。
JLE/non-JLE とも、termcap ファイルの実体は /usr/share/lib/termcap に、terminfo は /usr/share/lib/terminfo にあります。そして、JLE では、最初から kterm エントリーが追加されています。
kterm 上で、lynx を使うと、 日本語が罫線のようなものに化けて正しく表示されないという話題が、 今でも時々聞かれます。
いちおう答を書いておきます。
$ infocmp kterm > kterm.ti $ vi kterm.ti # enacs=\E(B\E)0, の部分を enacs=, と修正。 $ tic kterm.ti
こうすると、$HOME/.terminfo 以下に terminfo のファイルが出来ますので、 これの kterm を TERMINFO ディレクトリ以下にコピーして下さい。
あるいは、lynx のソースで修正する方法もあります。lynx のソースの src/LYCurses.c の中の initscr() を呼んでいるところを見つけ、(#ifdef されて複数あるので注意)その直後に、
ena_acs = "";
と書いて下さい。ena_acs の定義のため、#include <term.h> が必要な場合があります。
vi についてはちょっと問題です。non-JLE の /usr/ucb/vi でも、EUC のファイルを一応表示できますし、気を付ければエディットもできます。 しかし、EUC を1文字ではなく 8bit コード2文字と見倣すため、カーソル移動がおかしくなります。 また、EUC の2バイト目の直前に文字を挿入したりすると漢字コードが壊れて化けます。
* vi (JLE バイナリー) /usr/local/jle/bin/vi として置く。 * libc.so.102.9 /usr/local/jle/lib/libc.so.102.9 として置く。 * /usr/lib/locale/japanese /usr/lib/locale/ja_JP.EUC 以下に置く。 (これは LANG=ja_JP.EUC で使用したいため) * /usr/local/bin/vi として、 -------- #!/bin/sh JLE=/usr/local/jle LD_LIBRARY_PATH=$JLE/lib; export LD_LIBRARY_PATH exec $JLE/bin/vi "$@" -------- というような sh-script を作る。 |
(emacs 系のエディターを使う方には関係無い話かも知れません。
しかし、私は emacs を全く使っていません)
JLE に付いている英語マニュアルは、non-JLE の英語マニュアルとは違うようです。JLE では、non-JLE の英語マニュアルと、その日本語訳版が付いているのかと思っていましたが、 そうではなく、JLE の英語マニュアルと、その日本語訳版という感じです。
いずれにしても、non-JLE に移行すれば、そのままでは日本語マニュアルは読めなくなります。 日本語マニュアルそのものは、JLE のものを持って来てもいいですが、non-JLE に付属の nroff コマンドが日本語に対応していないため、日本語マニュアルを表示できません。
そこで、non-JLE の Text カテゴリー(nroff などがある)はインストールしないことにし、代わりに
man-1.4h+lx
groff-1.10 + jgroff-0.99
をインストールしました。これで日本語マニュアルも OK です。表示のされ方が SunOS オリジナルとはちょっと違いますが、気になるほどではありません。
ちなみに、groff-1.10 は C++ で書かれてはいますが、libstdc++ (や、以前の libg++) は実は必要ありません。C++ が使用可能な状態で構築された gcc ならば、コンパイラコマンド(ドライバー)として、g++ や c++ でなく、gcc を使って make すればいいだけです。
これらについては私は全く使っていませんでした。Wnn4.2 等を使う限り必要ありません。kkcv 関係が外れることにより、余分なディスクスペースの節約にもなります。
現在、SunOS4.1.4 は、Solaris1.1.2 の CD-ROM の形で、安く入手できます。 JLE 版の、日本語 Solaris1.1.2 では、インストールメディア自体にすでに JLE が上書きされています。したがって、日本語 Solaris1.1.2 の CD-ROM からは JLE を外したインストールができません。
実は、日本語 Solaris1.1.2 の CD-ROM を使って、できる限り JLE を外そうと試してみたことがあります。non-JLE の /usr/include は、JLE では /usr/compat/include に退避されています。/usr/compat/include 等は、CD-ROM 上ではなぜか sunview_programmers という場違いなカテゴリーに分類されています。 もちろんこれだけではありません。/usr/bin 以下その他、JLE で置き換わってしまったコマンドを復元しなければなりません。
インストール時に使用される miniroot は、JLE 版の CD-ROM でも non-JLE と同一であることがわかりました。そこで、miniroot から non-JLE のコマンドを拾い集めました。
cat, date, grep, ls, sed 等が復元できました。 これらのコマンドは、ものによっては別件で patch が出ているものもあるでしょう。patch が入手可能ならば、patch を当てることにより non-JLE 化できます。
しかし、他にも多数のコマンドがあり、また、JLE 化したカーネルオブジェクトは復元できません・・
ということで、あきらめて英語版 Solaris1.1.2 を購入してしまいました。