libwcsmbs と xfsxtt (アドオンで楽しよう)


X_LOCALEを捨てようの追記にも書いたけど、最近ではもうX_LOCALEを捨ててwcsmbsで、ってのがglibcベースなディストリビューションでは標準的と見られて来つつあるようだ。

だが今の時点ではあくまでも、glibcにwcsmbs化パッチのあたった、いわゆるglibc+wcsmbsというのが主流なように見える。でもどうなんだろうねぇ。オレ的にはやはり、libwcsmbsの方がずっとずっとず〜〜っといいとしか思えないけどなぁ。

glibc+wcsmbsって形態だと、glibcをずっと追いかけ続けなくちゃならないうえに、glibcまわりを全部差し替えるリスクを常に負わなければならないのに比べて、libwcsmbsなら単に追加するだけ。一見するとメリットばかりでデメリットはない。

と、思っていたのだが、実はそこにはおやくそくな落し穴が(笑)

libwcsmbsは、glibcに対するアドオンというその性質上、/etc/ld.so.preloadに記述してプリロード指定されることによって使われる。が、この環境でrpmを作ると、Requiredにlibwcsmbsが常に含まれてしまうのだった。

これはどういうことかというと、libwcsmbsでLOCALEをサポートするようにした環境で作ったパッケージは、今主流となりつつあるglibc+wcsmbsな環境にインストールしようとするとlibwcsmbsがないから入らんよと言われてしまうってことだ。

同じ様にX_LOCALEに別れを告げた環境なのに、パッケージの互換性がないのはマズかろう。

う〜ん、困ったのぅ、これさえなければ文句なしなんだが… と思っていたのだが、実はすっげ〜安易な方法で回避できるようだ。といってもオレ自身、libwcsmbsに移行してからまだそんなに大量のパッケージを作っていないので、今は様子を見ているところなのではあるが。

で、その回避方法ってのは実にバカッぽい方法で(笑)、パッケージを作るときに、あらかじめ/etc/ld.so.preloadをリネームしとく、という実に原始的な方法だ。わはは。

たとえばこんな感じ。オレはいつも一般ユーザでパッケージ作成の作業をしているので、

sudo mv /etc/ld.so.preload /etc/ld.so.preload.orig
rpm -ba hogehoge.spec

などとする。こうしてrpmを作ると、Requiredにはlibwcsmbsが入っていないパッケージができる。たとえsetlocale()などを呼び出すプログラムをパッケージにするときでも、それはあくまで実行時の話で、makeの過程ではLOCALEもへったくれもないもんねぇ。
で、rpmができたら忘れずに

sudo mv /etc/ld.so.preload.orig /etc/ld.so.preload

として戻しておく。これは最後の最後、もうこのspecファイルで大丈夫、という状態でやろう。ありがちなパターンとして、%prepのフェーズでうまくパッチがあたらないとか、%installのフェーズでPermission deniedになるとか、そういうのを直してからね。

とはいえ、もしも戻すのを忘れたところで、libwcsmbs.soはあるがld.so.preloadがない、という状況なら、日本語がうまく扱えなくなるだけでそんなに深刻じゃないよな。逆にld.so.preloadはあるのにlibwcsmbs.soがない、という状況だとなかなかにして強烈な状態になるかも。

libwcsmbs.soをプリロード指定しているにも関わらず、それが見付からないってなことになると、libc.so.6自体がロードに失敗してしまう。つまるとこ、cpもmvもcatも、libc.so.6をシェアするコマンドは枕を並べて動かなくなっちゃうぞ(笑)

libwcsmbsのコンセプトの秀逸なところは、やはりオリジナルの配布物を「差し替え」るのではなくて「追加」するところにこそあるわけだが、同様なコンセプトで実現できるものとして、xfsxttというのをパッケージにしてみた。

wcsmbsと同様に、Xの世界ではもうX-TTを使うのがほぼ標準的となっている感があるが、永繁さんが提供なさっているX-TTのパッケージ群は、必要なものを全部見極めて落してきて、オリジナルのX関係のパッケージをほとんど全て捨てて差し替える必要がある。

NeoMagicなチップを使う場合などのように、Xサーバを作り直さない限りどうしようもない場合を除けば、もうちょっとイージーにTrueTypeを楽しめてもいいような気がするよねぇ。

てなワケでパッケージにしてみたのがxfsxtt-3.3.2.3-1.i386.rpmだ。ソース、バイナリともパッケージ置き場に置いておいた。基本的には中身はPJE-0.15のxfsxtt-1.0-3と変わりはない。

ただ、PJEのものはX-TT 1.0ベースなのと、X332src-1.tgzから正直にxfsに必要な部分だけをextructしてきてmakeするようになっているのに対して、オレが使っているのはX-TT1.0pl00ベースでちょっと新しいってのと、あとRedHatに標準で含まれているXFree86-3.3.2.3-25のspecファイルをベースにしているため、RedHat版のパッチがズラッとあたっていることだ。

まぁパッチがあたっていると言ったところで、ほとんどがXサーバ本体に対するものなので、xfsしかmakeしないこのパッケージではほとんど意味ないと思うけどね。詳しく見てないけど(笑) ただ、バージョン番号だけはこだわりで、独立したものをつけずにベースとした3.3.2.3を貰ってつけた。releaseは26だけどこれは自作の判別のためだ。

パッケージ置き場からfreetype関係ともども持っていけば、問題なくインストールできると思う。もうすでに永繁さんバージョンのX-TTをちゃんとセットアップして使えている人には意味がないが、つい先頃リリースされたRedHat 5.2を期に、新規にセットアップし直そうという人にはおすすめかな。

なにしろRedHat 5.2標準のXFree86-3.3.2.3-25関係を黙ってインストーラの言うとおりに入れたら、その後にfreetypeとxfsxtt、フォントを入れて、設定を整えるだけだ。設定も簡単だしね。

freetypeとxfsxttのインストールが無事に済んだら、まず/etc/X11/XF86Configでフォントパスの指定をxfs経由に変更しよう。xfsとの通信にはtcpの7100番を使うとすると、こんな感じになる。

   FontPath   "/usr/X11R6/lib/X11/fonts/misc/:unscaled"
   FontPath   "/usr/X11R6/lib/X11/fonts/75dpi/:unscaled"
   FontPath   "/usr/X11R6/lib/X11/fonts/100dpi/:unscaled"
   FontPath   "/usr/X11R6/lib/X11/fonts/Type1"
   FontPath   "/usr/X11R6/lib/X11/fonts/Speedo"
   FontPath   "/usr/X11R6/lib/X11/fonts/misc"
   FontPath   "/usr/X11R6/lib/X11/fonts/75dpi"
   FontPath   "/usr/X11R6/lib/X11/fonts/100dpi"
   FontPath   "tcp/localhost:7100"    <- これが大事

でもって、xfsの設定ファイルである/etc/X11/fs/configも編集しよう。こんな感じ。

# font server configuration file
# $XConsortium: config.cpp,v 1.7 91/08/22 11:39:59 rws Exp $

clone-self = on
use-syslog = off
catalogue = /usr/X11R6/lib/X11/fonts/ttf
error-file = /usr/X11R6/lib/X11/fs/fs-errors
# in decipoints
default-point-size = 120
default-resolutions = 75,75,100,100
deferglyphs = all
port = 7100

catalogue = にTrueTypeフォントを置くディレクトリのフルパスを指定しよう。fonts.dirやfonts.alias、各種フォントが置かれるディレクトリだ。その他、default-point-sizeやdefault-resolutionsなどはモニタの解像度や好みに応じて変えてもいいと思う。port番号は必ず/etc/X11/XF86Configで指定したものと合わせよう。

で、特に重要なのが、deferglyphs = all の指定だ。allでなくて16でもいいらしいけど、オレ的にはずっとallを使っていて不都合ないので、allにしている。これを指定しておかないと、あるフォントファイルを開くたびに全グリフを取得しようとして、時間が止まったかのようにゲロ遅くなるので絶対に忘れないようにしよう。

さらに、Xをstartxで起動している場合には

startx -- -deferglyphs alll

などとして明示的に指定して起動する必要がある。いち〜ちめんどくせ〜な、と思う人は、~/.xserverrcというファイルを用意して

Xwrapper -deferglyphs all $@

などと書いておけば、startxと打つだけでよい。オレはこうしてる。xdmを使っている人は、同様なことを/etc/X11/xdm/Xserversに書けばよいだろう。オレ的には今、xdm3dをほげっている最中なので普段はstartxなのだ(笑)

11/30 追記

ごめんなさい、ウソ書いてました。上記の~/.xserverrcでは、頭にexecを付けておかないと、Xが落ちなくなっちゃうんだわ(笑) というわけで

exec Xwrapper -deferglyphs all $@

が正しい設定でした。追記終わり。

さて、ここまで設定が進んだら、一旦Xを落してコンソールに戻り

/usr/X11R6/bin/xfs-xtt -port 7100 &

などとしてみよう。xfs-xttはおとなしく実行できたかな? Xを立ち上げて、TrueTypeが正しく扱えているか確認しよう。すべて問題なく動作しているのを確認したら、/etc/rc.d/rc.localにでも上記のとおりxfs-xttの起動の呪文を追加しておこう。

これで、XFree86のreleaseがもしも上っても、追いかけてXFree86のフルソースからmake Worldしなくても済むようになればいいなぁ。すげ〜時間かかるもんね、makeWorldって。


メール 戻る