GTK+ 1.2.0 と GIMP 1.1.2


いつのまにか GTK+-1.2.0 が出ていることを、コンダラ掲示板_tom_さんから教えてもらった。聞けば_tom_さんは GTK+ 1.0.6 の環境を捨てて、GTK+ 1.2.0 のみに統一するとの由。 お供させていただきます、ということで、オレもそうすることにした(笑)

従来は、GTK+ の 1.0系 と 1.1系を混在させるのはいろいろとややこしく、赤帽でも GNOME などのために gtk+10-1.0.6 などというパッケージを置いているくらいなのだが、1本化できるものならしてしまいたいよなぁ。

一応 1.2.0 と minor 番号が偶数なんだから、それなりに安定していることも期待できそうだし。実質、意識して GTK+ に依存しているものといえば、オレの場合は GIMP くらいだから、たいした手間じゃないかも知れぬ。

とか思ったオレは甘かった(笑)

なにが依存してるか見てやれ、どうせ一発じゃ消せねぇんだし。とりゃ!

removing these packages would break dependencies:
        gtk+ <= 0.99.13 is needed by sane-0.74-3jrpm
        gtk+ <= 1.0.4jp is needed by gimp-1.0.2jp-2jrpm
        gtk+ <= 1.0.4jp is needed by gimp-libgimp-1.0.2jp-2jrpm
        gtk+ is needed by imlib-1.8-5.1
        gtk+ <= 1.0.6jp is needed by glade-0.3.9jp-1jrpm
        gtk+ = 1.0.6jp is needed by gtk+-devel-1.0.6jp-5jrpm
        gtk+ <= 1.0.0 is needed by gkdcpi-0.1-1jrpm
        libgdk.so.1 is needed by control-panel-3.7-7
        libgdk.so.1 is needed by sane-0.74-3jrpm
        libgdk.so.1 is needed by gimp-1.0.2jp-2jrpm
        libgdk.so.1 is needed by imlib-cfgeditor-1.8-5.1
        libgdk.so.1 is needed by glade-0.3.9jp-1jrpm
        libgdk.so.1 is needed by gicq-0.22ja-1jrpm
        libgdk.so.1 is needed by gkdcpi-0.1-1jrpm
        libgdk.so.1 is needed by ruby-gtk-0.16-1
        libgtk.so.1 is needed by control-panel-3.7-7
        libgtk.so.1 is needed by sane-0.74-3jrpm
        libgtk.so.1 is needed by gimp-1.0.2jp-2jrpm
        libgtk.so.1 is needed by imlib-cfgeditor-1.8-5.1
        libgtk.so.1 is needed by glade-0.3.9jp-1jrpm
        libgtk.so.1 is needed by gicq-0.22ja-1jrpm
        libgtk.so.1 is needed by gkdcpi-0.1-1jrpm
        libgtk.so.1 is needed by ruby-gtk-0.16-1

あ、そうっすか(-_-#) そんなにイッちゃってますか。

しゃあねぇ。覚悟をキメよう。

gtk+-1.2.0.tar.gzgib-1.2.0.tar.gz それに gimp-1.1.2.tar.bz2 を持ってきて作業開始だ。

とりあえず、赤帽 5.2 の CD-ROM に入ってた GNOME の src.rpm を参考にして、 glib-1.2.0 と gtk+-1.2.0 のパッケージをとっとと作って入れてみた。GTK+ には 1.1.7 以降からだったと思うが、ひぐちさんの手による Wide Char 化のパッチが入っているので、放っておいても GtkEntry や GtkText などの Widget で日本語を使うことができる。感謝だ。

期待通り、普通に .configure して make してやるだけで、testgtk の Entry や Text で日本語がサクサク使える。うほ〜(笑)

だが、ここで疑問が。_tom_ さんに指摘されたのだが、gtk+ 1.1 以降って、Shared Library の名前の付けかたが謎なんだよね。たとえば、gtk+ 1.0.6 などの 1.0系だと、libgtk.so.1.0.6 などというファイル名で、libgtk.so.1 をリンクするようになっているのだが、これに対して gtk+ 1.1系以降だと、たとえば今回の GTK+ 1.2.0 だと libgtk-1.2.so.0.0.0 などというファイル名で、それを使うアプリケーションは libgtk-1.2.so.0 をリンクするようになっているのだ。

なにがマズいのって? すげ〜マズいように思うぞ、オレは。

例えば、GTK+ が 1.2.1 にバージョンアップしたとしよう。マイナーアップね。普通はその程度の変更なら、ライブラリをだまって差し替えても上位のアプリには影響は出ない。そのための Shared Library の仕組みなんだからねぇ。だが、GTK+ 1.1以降(1.2も含む)ぢゃそうはいかないのだ。だって、libgtk-1.2.so.1.0.0 になっちゃうんだもん、ファイル名が。

当然、アプリケーション側が libgtk-1.2.so.0 を探しにきても、そんなものはないわ!と言われて動作しなくなる。つまり、GTK+ 1.2 の今後のマイナーアップに付きあうには、それを使うアプリをその都度コンパイルし直しのインストールし直しが義務付けになってしまう、というスゲー命名法なのだった。

冗談だろ〜、もしも GTK+ 1.2.1 が出たなら、せめて libgtk-1.2.so.0.0.1 にしてくれよな、と思うのだが、既存の GTK+ 1.1.10 とかを見ても、平気で libgtk-1.1.so.10.0.0 などと謎ちゃんなファイル名になっているのを見ると望み薄かも。

strings libgtk-1.2.so.0.0.0 などとして見てみると、libgtk-1.2.so.0 などとシッカリ書き込まれちゃってるし。これをなんとかしたいよなぁ、と思っていろいろ調べてみると、どうやら ltconfig がキモなようだ。抜粋すると

# This must be Linux ELF.
linux-gnu*)
  version_type=linux
  library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so'
  soname_spec='${libname}${release}.so$major'
  finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir'
…

などとなっているでわないか。問題は soname_spec だ。.so の後に $major などを つっくけてる(香織ちゃん風)。取っちまうか(笑)

これを取ってしまうと、GTK+ 1.2.n の n が何であれ、libgtk+-1.2.so をリンクするようになってしまうけど、まぁ良かろう。アプリをその都度リビルドなんてヤだもんね 。

で、よくよく見れば、実はこの .so$major な攻撃は glib 1.2.0 にも、GIMP 1.1.2 にさえも入っていたのだった。GTK+ のみならず、glib にも GIMP にも ltconfig の $major を付けなくするパッチを作ってあてちゃったよ。

で、できた glib を gtk+ をパッケージにしてインストールし、gimp もパッケージにしてブチ込んだ。すごいっスー! GIMP 1.1.2 って、ちゃんと gettext 対応バリバリで、メニューもなんも最初っから日本語だよ。これが真の姿だよなぁ。作者の方には大変申し訳ないが、gtkconv は邪道な 気がしてあまり好きではなかった(し、あててなかった)オレとしては、この gettext 対応は素晴しいぜ。訳して貢献してくださったのであろう日本の方に大感謝だね。

だが… Text Tool で日本語のフォントが選択できぬ。日本語が書けぬ…

あれ〜?と思って testgtk の方を見てみると、Font Selection のメニューでも同じだわ。GTK+ 側だなコレわ。でもこれ、この Font Selection のダイアログ・ボックスって、どっかで見た記憶が… デジャブか?と一瞬思ったが、そうだ、これは glade で見たんだった、と思いだした。

しかも、glade のソースには、GICQの日本語化でお世話になっている水引さんの手によるパッチが存在するんだよ(笑) 今はもうホームページには置いておられないようだけど…

手元のとさっそく引っ張り出してみてみると、モロに gtkfontsel.c なんてのが glade-0.3.9 に含まれてて、GTK+ 1.2.0 のとまるっきり中身が一緒だ(笑) 水引さんのパッチをちょっとだけモディファイしてあててみたら、ちゃんと testgtk では日本語のフォントが選べて、preview もできるようになったぜ。

そうこうしているウチに _tom_ さんから GIMP 1.1.2 側のパッチをメールで頂いちゃったので、それをサクッと GIMP にあてると、Text Tool で日本語は入るわ、script-fu でも日本語のロゴが作れたわで、もう移行するのに全然問題ねぇなコレわ(笑)

GTK+ を差し替えるにあたって、依存するものも全部 make し直しだ。以下、新しく入れ換えたのは

GTK+ に直接依存しているもの

control-panel-3.9-1.i386.rpm
glade-0.3.9jp-1jrpm.i386.rpm
sane-1.00-1.i386.rpm
sane-devel-1.00-1.i386.rpm

上記のうち、たぶん glade-0.3.9 は細々した不都合があるんじゃないか、と思う。まだ調べてないけど。

imlib がらみ

imlib-1.9.3-1.i386.rpm
imlib-cfgeditor-1.9.3-1.i386.rpm
imlib-devel-1.9.3-1.i386.rpm
ImageMagick-4.1.0-4.i386.rpm
ImageMagick-devel-4.1.0-4.i386.rpm
libgr-2.0.13-14.1.i386.rpm
libgr-devel-2.0.13-14.1.i386.rpm
libgr-progs-2.0.13-14.1.i386.rpm
libjpeg-6b-8.i386.rpm
libjpeg-devel-6b-8.i386.rpm
libpng-1.0.3-1.i386.rpm
libpng-devel-1.0.3-1.i386.rpm
libtiff-3.4-5.1.i386.rpm
libtiff-devel-3.4-5.1.i386.rpm
libungif-3.1.0-5.i386.rpm
libungif-devel-3.1.0-5.i386.rpm
libungif-progs-3.1.0-5.i386.rpm
zlib-1.1.3-3.i386.rpm
zlib-devel-1.1.3-3.i386.rpm

特に、libpng が 1.0.2 だと gnome-libs 0.99.8.1 が make できなかった。

自作もの

gkdcpi-0.1-3.i386.rpm  GtkMenuFactory は使っちゃいけないそうなんで改造した。

ソースをいじらないと GTK+ 1.2.0 に対応できなかったもの。GICQの新しいのが出てたので、ついでに水引さんの日本語化パッチをあててみた。

gicq-0.32jp-1.i386.rpm
libicq-0.32-1.i386.rpm
libicq-devel-0.32-1.i386.rpm

GNOME関係。必要最小限、どんなもんかと思って試しにね。動いた。けど 1.0 がもう出てるっつ〜話だ。でも、gnome-libs のもっと新しいヤツって、esound とかに依存してるみたいでちょっとムカッと来たので途中まで作業して捨てたよ凸(-_-#) だってデスクトップ環境のコアになるライブラリがaudio関係のデーモンに依存するなんて変だと思わない? サウンドカードなんて入れてないけど、X は使ってる、って人だっていっぱいいると思うんだけどなぁ。

audiofile-0.1.6-1.i386.rpm
audiofile-devel-0.1.6-1.i386.rpm
ORBit-0.3.98-1.i386.rpm
ORBit-devel-0.3.98-1.i386.rpm
gnome-libs-0.99.8.1-2.i386.rpm
gnome-libs-devel-0.99.8.1-2.i386.rpm
gnome-linuxconf-0.17-2.i386.rpm

てなワケで、オレ的には GTK+ 1.2.0 に環境をスッキリ統一しちゃって幸せなのだが、 .so$major の件もあるし、差し替えの影響大なので、パッケージは置いてない。すまん。

spec とパッチくらいは置こうとは思うけど、もちょっと様子を見てからね。あ、最近秘かにユーザが増えてきて嬉しい dcup も実わそのままぢゃ GTK+ 1.2.0 では動かない。make も失敗する。手元では修正済みで動作確認もしてあるんだけど、これももちょっと様子見てから tar玉にして載せよう。

なにしろ、GTK+ 版ぢゃない真・dcup を S-Lang と ruby で書いてしまい、jed に統合してしまったので、このところ使っていないんだよ(笑)

あと、Scanner も使うから、SANE-1.0.0 がちゃんとイケてるか見ないといかんし、そもそも .so の後に妙な番号が付いて上位層に影響が出ることなんて、GNOME や GTK+ 1.1 の I18n に携わってこられた先人達はとっくに気がついてるハズなんだよなぁ。でも gtk ml などでも特に話が出たような感じはしないし…

と、ちょっと気になっているのだった。

3/14/99 追記:

上記の .so の後の major 番号は、オレのタコな杞憂だった。gtk+ 1.1.7 や gtk+1.1.8 などの頃に libgtk-1.1.so.7.0.0 だの lingtk-1.1.so.8.0.0 などと、出る度に major 番号が違っていたのは、それはそのまんま、バイナリでの互換性がなく、差し替えると動作しなくなるアプリがある、というだけのことだった。

単に 1.1.x の x を major 番号に持ってきていたのは、たまたま&区別がつきゃなんでもいい くらいのものだったのだろう。実際、gtk+ 1.1.14 や gtk+ 1.1.15 などの、開発版でも gtk+ 1.2 に近いものは、それぞれ libgtk-1.1.so.14.0.0 と libgtk-1.1.so.14.0.1 というように、ld が 同じ libgtk-1.1.so.14 を見にくるようになっていた。つまりバイナリでの互換性があったのだ。

今後、gtk+ 1.2.1 などが出た場合にも、バイナリでの互換性があればlibgtk-1.2.so.0.0.1 となることが予想できる。もしもそうでなくて、libgtk-1.2.so.1.0.0 などになっていた場合は、それは gtk+ 開発元で、 バイナリレベルの互換性がないので差し替えは不可、という意識のもとにそういうファイル名にした、と解釈することにする。 (というか、それが普通なんだそうだ(汗))

というわけで、GTK+ 1.2.0 および GIMP 1.1.3 などの RPM パッケージを使ってみたいなぁ、という人は_tom_さんのところからゲットしよう。


メール 戻る