試験運用中なLinux備忘録・旧記事

はてなダイアリーで公開していた2007年5月-2015年3月の記事を保存しています。

x86_64のmultilib環境におけるGTK+ 2のテーマについて

multilib環境

x86_64に限ったものではないのだが、multilib環境とは、同一のライブラリが(x86_64用とx86_32用のように)、同一CPUで動作する複数のCPUアーキテクチャ向けに存在する環境のことで、「multilib」自体は、32/64bit向けのライブラリを共存させる仕組みという使われ方のようだ。
参考URL:

テーマエンジンの探索パスとmultilib環境

場所はシステムのアーキテクチャごとに分けることができる。strace*1で動作を読んでみると、手元のx86_64版Gentoo Linuxでは

  1. ${HOME}/.gtk-2.0/2.10.0/x86_64-pc-linux-gnu/engines/
  2. ${HOME}/.gtk-2.0/2.10.0/engines/
  3. ${HOME}/.gtk-2.0/x86_64-pc-linux-gnu/engines/
  4. ${HOME}/.gtk-2.0/engines/
  5. /usr/lib64/gtk-2.0/2.10.0/x86_64-pc-linux-gnu/engines/
  6. /usr/lib64/gtk-2.0/2.10.0/engines/

のように読み込みを試行しているらしい。
2.10.0」というのは、GTK+ 2のバージョンによって、モジュールの過去のバージョンとの互換性が無くなることがあるため*2、どのバージョンと互換なのかを示す。これは含めた書き方のほうが管理上好ましい。
アーキテクチャ名を示すディレクトリに関しては、/usr/lib64/以下はライブラリのディレクトリ名で32bit/64bitが区別できるが、ホームディレクトリ以下に関してはディレクトリ名の末尾では区別できないため、システムタイプ(「x86_64-pc-linux-gnu」や「i686-pc-linux-gnu」)を含めた形を使用するのがよさそう。multilib環境におけるx86_32版との共存にも使える。

のような形に配置することで、x86_64上でx86_32なGTK+ 2アプリを動かすときにも同じ外観にできる。*3
ディストリのパッケージとして追加インストールできるエンジンは存在するが、そのx86_32版が用意されていない、という場合には使えるかもしれない。*4
x86_32のエンジンをx86_64上でビルドするには、32bitのchroot環境を作成して、GTK+ 2の開発パッケージ(Debian/Ubuntuでは「libgtk2.0-dev」)を入れ、ビルドするのが楽。

x86_64環境上でchrootを使わずにx86_32版のGTK+ 2用エンジンをビルドする場合

Glib 2/ATK/cairo/Pango/GTK+ 2のx86_32版の開発ファイル(*.la/*.pc/*.h)を配置する必要がある(この環境を整えていない場合に最も面倒な部分)。
configureスクリプトでは、x86_32版をビルドするための指定がいくつか必要。下はGentoo Linuxにおける指定例。

$ CFLAGS="-m32" CXXFLAGS="-m32" PKG_CONFIG_PATH=/usr/lib32/pkgconfig ./configure --prefix=/usr --libdir=/usr/lib32
$ make

ホームの下に入れる場合は

$ find -name "*.so" -exec strip {} \;
$ find -name "*.so" -exec cp {} ~/.gtk-2.0/2.10.0/i686-pc-linux-gnu/engines/ \;

システム全体で使用したい場合は

$ sudo make install-strip
もしくは(pacoを使用する場合)
$ sudo paco -lp "[パッケージ名]-[バージョン]-686" make install-strip

のようにしてインストールする。
関連記事:

*1:プログラムの動作を非常に細かいレベルで記録するツール

*2:2.4.0と2.10.0でモジュールの仕様が変更されている

*3:ディストリによっては、32bitのシステムタイプが「i686-pc-linux-gnu」にはなっていない可能性があるので、違っている場合はそれに合わせる

*4:x86_32版エンジンファイルを複数ユーザで使用したい場合は/usr/lib32/gtk-2.0/2.10.0/engines/(ディストリによって異なる可能性がある)に入れる