フリーSolarisでここまでやれる! (追記)

山森丈範 YAMAMORI Takenori ●yamamori

X_LOCALE で Netscape ! (改訂版)

SoftwareDesign 1999年2月号掲載版 では,日本語対応はできたものの Netscape 上で Java アプレットがうまく動作しませんでした. その後,試行を重ねた結果,Java アプレットを動作させる方法がわかりましたので, ここに改訂版を公開します.
以前は,netscape がリンクする X11 関係のライブラリはすべて X11R6.4 のものと強引にリンクしていましたが,改訂版では libX11.so のみ X11R6.4 のものを使うようにしました.fakelocale.cLD_PRELOAD は,以前と同様に必要です.(fakelocale.c のソース自体には変更はありません) これで,Java アプレットも OK となりました.

日本語 locale の無い Free Solaris 7 上で,Netscape の日本語化に挑戦しましょう.

Free Solaris 日本語版の場合は、日本語版との違い も合わせて御覧下さい。
日本語版の場合でも、Netscape リソースや、netscape の起動スクリプトの書き方などは、英語版で用いたものと同様です。


Netscape 3.x, 4.x は,openwin のライブラリと動的リンクした状態でのバイナリでしか配布されておらず, かつ,Free Solaris 7 の openwinや libc には,日本語 locale が無いため,たとえ Netscape のリソースで日本語フォントを設定しても,正しく日本語化されません. 筆者は,Netscape を X_LOCALE 付きの X11R6.4 と強引にリンクすることによって, ほぼ完全なレベルまで日本語対応することができましたので,その方法を紹介します.
○Motif はインストールする

lesstif が安定すればそちらに移行したいところですが,現状では Solaris 7 に付属の Motif をインストールします.SUNWmfrun にあります.(依存警告が出ますが無視します)

○openwin のライブラリの一部を取り出す

openwin のライブラリのうち,

libXmu.so.4 libXt.so.4 libXext.so.0 libSM.so.6 libICE.so.6

の5つのみが必要です.そこで,これらを CD-ROM からインストールします.

これらはパッケージの,SUNWxwplt と,SUNWxwice の中に入っています. pkgadd でこれらのパッケージごとインストールしてもいいのですが, 不要なファイルも多く,X11R6.4 と重複してややこしくなることから,筆者は pkgadd を使わず,unzip を使って直接ファイルを取り出しました.

具体的には,CD-ROM を /cdrom にマウントして,以下のようにします.

    $ cd /cdrom/Solaris_2.7/Product/SUNWxwplt/archive
    $ unzip -d /tmp none     # 奇妙ですが,none というアーカイブ名です
    $ cd /cdrom/Solaris_2.7/Product/SUNWxwice/archive
    $ unzip -d /tmp none

すると,/tmp/openwin 以下にファイルが展開されますので, /tmp/openwin/lib から,上記の5つのライブラリを, /usr/openwin/lib にコピーします.

さらに,fakelocale.c のリンクのため,/usr/openwin/lib で,

      libXt.so -> libXt.so.4

というシンボリックリンクを作っておきます.

○X11R6.4 の libX11.so を openwin のライブラリに見せかける
    # cd /usr/X11R6.4/lib
    # ln -s libX11.so libX11.so.4

として,X11R6.4 の,libX11.so (libX11.so.6.1) のみ, openwin のバージョン番号,libX11.so.4 ででも参照できるようにします.

SoftwareDesign 掲載版にしたがって,X11R6.4 の libXmu.so.4, libXt.so.4, libXext.so.0 のシンボリックリンクも作ってしまった方は, これらは削除して下さい.手を加えるシンボリックリンクは,libX11.so.4 のみです.
setlocale(), mbtowc() などのエミュレート

この fakelocale.c を用いて,共有ライブラリを作成し,netscape の実行時に LD_PRELOAD で読み込ませます.setlocale()XtSetLanguageProc() を呼んでいますが,これだけでは不十分で,XmTextField などがおかしくなります.原因は /usr/dt/lib/libXm.so.3libc 内の mbtowc() などのマルチバイトや wchar 関係の関数を直接呼んでいるためです.そこで,fakelocale.c では mbtowc() などのエミュレートも行なっています.これで XmTextField も OK になります.fakelocale.c のコンパイルは,

    $ gcc -shared -fPIC -o fakelocale.so \
      fakelocale.c -O2 -pipe \
      -I/usr/X11R6.4/include \
      -R/usr/openwin/lib \
      -L/usr/openwin/lib \
      -lXt

とします.include と lib の PATH がちょっとトリッキーですが,これで OK です.

コンパイルできたら /usr/X11R6.4/lib にインストールします.

    # install -c fakelocale.so /usr/X11R6.4/lib
*注意:Solaris 7 の /usr/sbin/install だとうまく行かないので,GNU install など,あるいは cp で代用して下さい.
○Netscapeリソースの設定

リソースファイル Netscape を作り ます.Netscape 3.x 4.x 共通です.オリジナルの Netscape.ad とマージする必要はありません.

リソースファイルは,たとえば /usr/local/lib/netscape などのディレクトリの下に置き,このディレクトリを XAPPLRESDIR で指定するようにします.

ldd netscape で確認

ここまでの設定作業で,結果的に netscape が意図通りのライブラリとリンクされていることを,ldd コマンドで確認します.B-シェル文法で,LD_LIBRARY_PATH と,LD_PRELOAD を一時的に設定して ldd を実行します.Netscape 4.08 での例です.

    $ LD_LIBRARY_PATH=/usr/X11R6.4/lib LD_PRELOAD=fakelocale.so ldd netscape
            fakelocale.so =>         /usr/X11R6.4/lib/fakelocale.so
            libXm.so.3 =>    /usr/dt/lib/libXm.so.3
            libXt.so.4 =>    /usr/openwin/lib/libXt.so.4
            libXmu.so.4 =>   /usr/openwin/lib/libXmu.so.4
            libXext.so.0 =>  /usr/openwin/lib/libXext.so.0
            libX11.so.4 =>   /usr/X11R6.4/lib/libX11.so.4
            libsocket.so.1 =>        /usr/lib/libsocket.so.1
            libnsl.so.1 =>   /usr/lib/libnsl.so.1
            libdl.so.1 =>    /usr/lib/libdl.so.1
            libresolv.so.2 =>        /usr/lib/libresolv.so.2
            libm.so.1 =>     /usr/lib/libm.so.1
            libc.so.1 =>     /usr/lib/libc.so.1
            libSM.so.6 =>    /usr/openwin/lib/libSM.so.6
            libICE.so.6 =>   /usr/openwin/lib/libICE.so.6
            libmp.so.2 =>    /usr/lib/libmp.so.2

以上のようになっていれば OK です.libX11.so.4/usr/X11R6.4/lib とリンクしていることがわかります.

○起動スクリプトの作成

以上を確認の上,netscape408 のような起動スクリプトを書きます.LD_PRELOADLD_LIBRARY_PATH を両方指定するのがポイントです.これで日本語対応の Netscape が立ち上がります.(リストは Netscape 4.08 での例ですが,他のバージョンでも同様です)

FilterEvents に対応した kinput2 を使っていれば,kinput2 での日本語入力もできます.

Netscape 3.04, 4.08, 4.5 すべてについて,動作を 確認しました.(Netscape 4.5 については,Xlib がダイナミックリンクされた Solaris2.4 用バイナリを使って下さい)

注:Netscape 4.51 では、Solaris 2.5.1 用バイナリで OK です。

○Java アプレットも OK

SoftwareDesign 掲載版では,日本語対応はできたものの Java アプレットについては動作しませんでしたが,この改訂版により,Java アプレットも無事動作可能となりました.

その他,Web ページタイトル,セレクトメニュー,ブックマーク, TEXTAREA など,日本語表示,kinput2 での入力などにはもちろん対応できていますので,これで英語版 Free Solaris 上で,充分使いものになるようになったのではと思います.


●もう一度確認

このページの設定内容の他、以下の設定も再度確認して下さい。


LD_PRELOAD の問題

ひとつ問題が確認されています.

fakelocale.so のために LD_PRELOAD をセットして Netscape を起動していますが,これが Netscape から起動される子プロセスに影響して,問題になることがあることがわかりました.

具体的には,ページをプリントアウトしようとして,Netscape の Print Command: として lp を指定すると,うまく動作しません.

これを回避するためには,以下のような wrapper を書いて,Print Command: としてこの wrapper を指定して下さい.
(Thanks to shimoda@jwa.or.jp)

#!/bin/sh
unset LD_PRELOAD
exec /bin/lp "$@"

これで,lp によるプリントアウトもうまくいきます.

なお,この問題を fakelocale.c 内で putenv("LD_PRELOAD="); を行なう方法も試してみましたが,Netscape の場合はこれでうまく行き,上記の wrapper も要らなくなりますが,putenv() の方法では JDK 方がうまく行かなくなりますので,やはり,falelocale.c は,変更無しとし,lp のように,必要なものについては wrapper を挿入する方法が最善と思われます.

To 『フリー Solaris でここまでやれる!』index


このページは、技術評論社 SoftwareDesign 1999年2月号、『フリーSolarisでここまでやれる!』の原稿を元に、Web 用に再構成したものを、さらに改訂したものです。
To 謎の処理系 SunOS 4.1.4 Home
yamamori