x86_64版Gentoo Linuxの32bitライブラリを自前で管理(chroot無しでemul-linux-x86-gtklibsをビルド)
下に書いている順番どおりにビルドする前提での覚え書きなので、ビルドの順番を入れ替えたり、途中のファイルコピー作業を飛ばしたりするとエラーになる可能性がある(GTK+ 1とImlib 1の系統とそれ以下は独立なので、その2つを飛ばしたところから始めることは可能)。
準備として、あらかじめ「emul-linux-x86-gtklibs」をインストールしておく。ビルドするパッケージは、すでに64bit版が入っている必要もある。
(2007/10/11)Glib(他にはdbusなど)には、アーキテクチャ依存のヘッダファイルが/usr/lib64/以下に置かれている。しかし、これらのヘッダファイルは、「emul-linux-x86-*」パッケージではインストールされずに捨てられてしまう上、tbz2ファイルから32bit版のヘッダファイルを取り出して/usr/lib32/以下に配置しても、そのままでは使用されず*1、パッケージ検出システムpkgconfig用の.pcファイルを/usr/lib32/pkgconfig/以下に配置の上、PKG_CONFIG_PATHを指定する必要も出る。これらを行わないと、挙動のおかしなライブラリになってしまうかもしれない。
- GTK+ 1(1.2.10-r12)
- Imlib 1(1.9.15-r1)
- ATK(1.18.0)
- glitz(0.5.6)
- cairo(1.4.10 USE="X glitz opengl svg xcb -debug -directfb -doc")
- Pango(1.16.5)
- GTK+ 2(2.10.14)
- gtkglext(1.2.0)
- gtk-engines(2.10.2)とgtk-engines-xfce(2.4.1-r1)
- gtk-engines-qt(0.8)
- インストールするebuildの例
GTK+ 1(1.2.10-r12)
まず、lib64のライブラリとリンクしようとするので--- /usr/portage/x11-libs/gtk+/gtk+-1.2.10-r12.ebuild.orig +++ /usr/portage/x11-libs/gtk+/gtk+-1.2.10-r12.ebuild @@ -57,6 +57,9 @@ --with-x \ ${myconf} || die + if use amd64 && [[ "${ABI}" = "x86" ]]; then + find . -name Makefile | xargs sed -i -e 's/lib64/lib32/g' + fi emake CC="$(tc-getCC)" || die }
で回避。次に、「glibconfig.h: No such file or directory」が出る件については、「emul-linux-x86-baselibs」に含まれるGlib 1(もしくは自分でビルドしたGlib 1)のtbz2ファイルを用意して該当ディレクトリをコピーして対処。下の例では、「emul-linux-x86-baselibs」のものを使用している。
$ sudo emerge -avf emul-linux-x86-baselibs $ tar jxf /usr/portage/distfiles/glib-[バージョン(1系)].tbz2 $ sudo cp -r usr/lib32/glib/ /usr/lib32/
これで該当ヘッダファイルを含むディレクトリがコピーされ、ビルドが通るようになる。
Imlib 1(1.9.15-r1)
lib64の修正のみ。--- /usr/portage/media-libs/imlib/imlib-1.9.15-r1.ebuild.orig +++ /usr/portage/media-libs/imlib/imlib-1.9.15-r1.ebuild @@ -43,6 +43,9 @@ $(use_enable gtk gdk) \ $(use_enable gtk gtktest) + if use amd64 && [[ "${ABI}" = "x86" ]]; then + find . -name Makefile | xargs sed -i -e 's/lib64/lib32/g' + fi emake || die "emake failed." }
ATK(1.18.0)
(2007/10/11)Glib 2のヘッダに関する修正をするため、ヘッダと.pcファイルが無ければ準備をして$ tar jxf [tbz2の保存先]/dev-libs/glib-[バージョン(2系)].tbz2 $ sudo mkdir /usr/lib32/pkgconfig $ sudo cp -r usr/lib32/glib-2.0/ /usr/lib32/ $ sudo cp usr/lib32/pkgconfig/* /usr/lib32/pkgconfig/
PKG_CONFIG_PATH指定でビルド。
$ sudo bash -c 'CHOST=i686-pc-linux-gnu ABI=x86 FEATURES="noman noinfo" PKGDIR=[tbz2の出力先] PKG_CONFIG_PATH=/usr/lib32/pkgconfig emerge -avBO atk'
glitz(0.5.6)
「emul-linux-x86-gtklibs」では、glitzを使用していないため、これを使用するようにしてみる。lib64の修正のみ。--- /usr/portage/media-libs/glitz/glitz-0.5.6.ebuild.orig +++ /usr/portage/media-libs/glitz/glitz-0.5.6.ebuild @@ -13,6 +13,14 @@ DEPEND="virtual/opengl" +src_compile() { + econf || die "econf failed" + if use amd64 && [[ "${ABI}" = "x86" ]]; then + find . -name Makefile | xargs sed -i -e 's/lib64/lib32/g' + fi + emake || die "emake failed" +} + src_install() { make DESTDIR="${D}" install || die dodoc AUTHORS ChangeLog README TODO
cairo(1.4.10 USE="X glitz opengl svg xcb -debug -directfb -doc")
「xcb」のUSEフラグを有効にするには、カスタム版「emul-linux-x86-xlibs」の作成でlibxcbとxcb-utilを含めて構成し、インストールまでを行っておく。*2glitzを使用する場合、そのライブラリ(*.so)を/usr/lib32/にコピーする必要がある。
以上において、不足している32bit版ライブラリがなければ、そのままビルドは通る。不足があると、lib64の中のライブラリとリンクしようとしてエラーになる。
$ tar jxf [tbz2の保存先]/media-libs/glitz-[バージョン].tbz2 $ sudo cp -d usr/lib32/*so* /usr/lib32/
Pango(1.16.5)
以下の修正をする。--- /usr/portage/x11-libs/pango/pango-1.16.5.ebuild.orig +++ /usr/portage/x11-libs/pango/pango-1.16.5.ebuild @@ -46,6 +46,14 @@ epunt_cxx } +src_compile() { + econf || die "econf failed" + if use amd64 && [[ "${ABI}" = "x86" ]]; then + find . -name Makefile | xargs sed -i -e 's/lib64/lib32/g' + fi + emake || die "emake failed" +} + src_install() { gnome2_src_install rm ${D}/etc/pango/pango.modules
(2007/11/14)依存する32bit版ライブラリ(emul-linux-x86-baselibsとemul-linux-x86-gtklibs)のpkgconfig用.pcファイルを/usr/lib32/pkgconfig/以下に用意した状態でPKG_CONFIG_PATHを指定し、
$ sudo bash -c 'CHOST=i686-pc-linux-gnu ABI=x86 FEATURES="noman noinfo" PKGDIR=[tbz2の出力先] PKG_CONFIG_PATH=/usr/lib32/pkgconfig emerge -avBO pango'
のようにすると、上の修正をせずにビルドが通った(バージョン1.18.3で確認)。
FEATURESに「ccache」を付けると
../libtool: eval: line 4333: syntax error near unexpected token `|'
のような文法エラーが出ることがある。下のGTK+ 2でも同様。
GTK+ 2(2.10.14)
(2007/10/11)32bit版Glib 2のヘッダを使用させるため、$ sudo bash -c 'CHOST=i686-pc-linux-gnu ABI=x86 FEATURES="noman noinfo" PKGDIR=[tbz2の出力先] PKG_CONFIG_PATH=/usr/lib32/pkgconfig emerge -avBO gtk+'
とする。
libprintbackend-cupsのビルドエラーになる場合があるが、
gcc -shared .libs/gtkprintbackendcups.o .libs/gtkprintercups.o .libs/gtkcupsutils.o -Wl,--rpath -Wl,/var/tmp/portage/x11-libs/gtk+-2.10.14/work/gtk+-2.10.14/gtk/.libs -lpangocairo-1.0 -lpango-1.0 -lX11 -lXfixes -latk-1.0 -lgobject-2.0 -lgmodule-2.0 -ldl -lglib-2.0 -lcairo ../../../gtk/.libs/libgtk-x11-2.0.so -L/var/tmp/portage/x11-libs/gtk+-2.10.14/work/gtk+-2.10.14/gdk/.libs -L/var/tmp/portage/x11-libs/gtk+-2.10.14/work/gtk+-2.10.14/gdk-pixbuf/.libs -lcups -L/usr/lib32 /usr/lib64/libgnutls.so -L/usr/lib64 /usr/lib64/libtasn1.so /usr/lib64/libgcrypt.so /usr/lib64/libgpg-error.so -lz -lpthread -lm -lcrypt [CFLAGS] -Wl,-soname -Wl,libprintbackend-cups.so -o .libs/libprintbackend-cups.so /usr/lib64/libgnutls.so: could not read symbols: File in wrong format collect2: ld returned 1 exit status make[4]: *** [libprintbackend-cups.la] Error 1 make[4]: Leaving directory `/var/tmp/portage/x11-libs/gtk+-2.10.14/work/gtk+-2.10.14/modules/printbackends/cups'
手元では64bit版のCUPSでUSE="X dbus jpeg -ldap nls pam -php png ppds -samba -slp ssl tiff"としていて、CUPSがSSLの機能を使用するために依存する「net-libs/gnutls」と、それに依存する
- dev-libs/libtasn1
- dev-libs/libgcrypt
- dev-libs/libgpg-error
の32bit版パッケージ(ライブラリ)が不足していることによると思われる。「emul-linux-x86-baselibs」に含まれるCUPSが「nossl」なのも、これ(gnutls)に依存しないためなのかもしれない。
対処としては、上記パッケージをカスタムの「emul-linux-x86-baselibs」へ追加してもよいのだが、ここでは手間を省くため、それは行わず、32bit/64bitの両方とも「USE="-ssl"」としてCUPSを用意することにする。64bit版のCUPSでのみ「USE="ssl"」にしたいのであれば
- すでにインストールされているCUPSをquickpkgでtbz2ファイルにしておく
- USE="-ssl"で64bit版CUPSをビルドし、インストール
- 32bit版GTK+をビルド、tbz2パッケージ作成
- 64bitのCUPSを--usepkgでSSL付きのものに戻す
とする。
$ sudo quickpkg --include-config=y cups $ sudo bash -c 'USE="-ssl" emerge -av cups' $ sudo bash -c 'FEATURES="noman noinfo" CHOST=i686-pc-linux-gnu ABI=x86 PKGDIR=[出力先] emerge -avB gtk+' $ sudo emerge --usepkg -av cups
もともと64bit版のCUPSがUSE="-ssl"の場合、この問題は発生しないはず。
(2007/11/14)GTK+ 2.12系へ上げる際、GLib 2やPangoのバージョンを上げて先に入れておかないとconfigureが通らない点に注意。
gtkglext(1.2.0)
gtkglextライブラリを要求する32bitアプリケーションを動作させるには、32bit版gtkglextが必要。checking for GTK+ - version >= 2.0.0... *** 'pkg-config --modversion gtk+-2.0' returned 2.10.14, but GTK+ (2.10.13) *** was found! If pkg-config was correct, then it is best *** to remove the old version of GTK+. You may also be able to fix the error *** by modifying your LD_LIBRARY_PATH enviroment variable, or by editing *** /etc/ld.so.conf. Make sure you have run ldconfig if that is *** required on your system. *** If pkg-config was wrong, set the environment variable PKG_CONFIG_PATH *** to point to the correct configuration files no configure: error: GTK+ 2.0 not found
のようになった場合、32bitのGTK+の.soファイルをコピーしておく。
$ tar jxf [tbz2の保存先]/x11-libs/gtk+-[バージョン(2系)].tbz2 $ sudo cp -d usr/lib32/*.so* /usr/lib32/
次に、GTK+ 2の中のGDKに関するヘッダファイルが不足しているようなので、GTK+ 2のtbz2ファイルを展開した状態で
$ sudo cp -r usr/lib32/gtk-2.0/include/ /usr/lib32/gtk-2.0/
をしてコピーしておく。あとは、lib64のリンクエラーに対処するため、以下の修正をする。
--- /usr/portage/x11-libs/gtkglext/gtkglext-1.2.0.ebuild.orig +++ /usr/portage/x11-libs/gtkglext/gtkglext-1.2.0.ebuild @@ -23,3 +23,11 @@ dev-util/pkgconfig" DOCS="AUTHORS ChangeLog* INSTALL NEWS README* TODO" + +src_compile() { + econf || die "econf failed" + if use amd64 && [[ "${ABI}" = "x86" ]]; then + find . -name Makefile | xargs sed -i -e 's/lib64/lib32/g' + fi + emake || die "emake failed" +}
gtk-engines(2.10.2)とgtk-engines-xfce(2.4.1-r1)
(2007/10/11)Glib 2とGTK+ 2の32bit固有のヘッダファイルを使用するようにする。最も楽なのが、GTK+ 2のtbz2ファイルを展開後$ sudo cp usr/lib32/pkgconfig/* /usr/lib32/pkgconfig/
GTK+ 2の.pcファイルをコピーし、
$ sudo bash -c 'CHOST=i686-pc-linux-gnu ABI=x86 FEATURES="noman noinfo" PKGDIR=[tbz2の出力先] PKG_CONFIG_PATH=/usr/lib32/pkgconfig emerge -avBO gtk-engines gtk-engines-xfce'
のようにインストールする方法。
xeffectsのOverlayから「gtk-engines-aurora」*3を入れてみたところ、これも同様。
gtk-engines-qt(0.8)
まずCMakeを入れておく。64bit版のものでよい。次に、64bit版のQT3に加え、kdelibs(実行には必要ないが、ビルドに必要)も入れておく。
-- Looking for pthread_create in pthread - found -- Didn't find KDE3 headers -- Didn't find KDE3 core library -- Didn't find the KDE3 dcopidl preprocessor -- Didn't find the KDE3 dcopidl2cpp preprocessor -- Didn't find the KDE3 kconfig_compiler preprocessor CMake Error: Could NOT find everything required for compiling KDE 3 programs -- Configuring done
上のエラーはこれで回避できる。
/usr/lib/gcc/x86_64-pc-linux-gnu/4.1.2/../../../../x86_64-pc-linux-gnu/bin/ld: cannot find -lqassistantclient collect2: ld returned 1 exit status make[2]: *** [src/libqtengine.so] Error 1 make[1]: *** [src/CMakeFiles/qtengine.dir/all] Error 2 make: *** [all] Error 2
に対しては、emul-linux-x86-qtlibsの(もしくは自分でビルドした)32bit版QT3から該当ライブラリ(libqassistantclient.a)をコピーする。
$ tar jxf /usr/portage/distfiles/qt-[バージョン(3系)].tbz2 $ sudo cp usr/qt/3/lib32/libqassistantclient.a /usr/qt/3/lib32/
更に、libbonobouiに依存しないようにするためと、ライブラリパスの修正が必要。
--- /usr/portage/x11-themes/gtk-engines-qt/gtk-engines-qt-0.8.ebuild.orig +++ /usr/portage/x11-themes/gtk-engines-qt/gtk-engines-qt-0.8.ebuild @@ -25,6 +25,22 @@ S=${WORKDIR}/${MY_PN} +src_compile() { + if use amd64 && [[ "${ABI}" = "x86" ]]; then + einfo "Disabling libbonoboui" + sed -i -e 's/PKGCONFIG(libbonoboui.*//' CMakeLists.txt + fi + econf || die "econf failed" + if use amd64 && [[ "${ABI}" = "x86" ]]; then + local f + for f in $(find . -type f | egrep "(.txt|cmake|CMake)"); do + sed -i -e 's|/usr/qt/3/lib|/usr/qt/3/lib32|g' \ + -e 's|/usr/kde/3.5/lib|/usr/kde/3.5/lib32|g' ${f} + done + fi + emake || die "emake failed" +} + src_install() { kde_src_install mv "${D}"/usr/local/share/{locale,applications} "${D}"/usr/share/ || die
(2007/10/11)ここまでの作業を行った上で、
$ sudo bash -c 'CHOST=i686-pc-linux-gnu ABI=x86 FEATURES="noman noinfo" PKGDIR=[tbz2の出力先] PKG_CONFIG_PATH=/usr/lib32/pkgconfig emerge -avBO gtk-engines-qt'
のようにしてビルドする。Glib 2とGTK+ 2に関して32bitのヘッダを参照させるのに、PKG_CONFIG_PATHの指定も行う。
インストールするebuildの例
自分で管理する自分用ebuildとなるため、パッケージ選択のUSEフラグは無くてもよいのだが、元のebuildにある「qt3」はそのままにした。GTK+ 2の/usr/lib32/gtk-2.0/include/以下は使用されることがあるため、選択で残せるようにした。
注意点として、上のビルドの流れの中でGlib(1系と2系の両方)の不足ヘッダファイルのディレクトリをコピーしてあるものはここには含まれず、カスタム版「emul-linux-x86-baselibs」に含めることになる。
ファイル名: emul-linux-x86-gtklibs-9999.ebuild
# Copyright 1999-2007 Gentoo Foundation # Distributed under the terms of the GNU General Public License v2 # $Header: /var/cvsroot/gentoo-x86/app-emulation/emul-linux-x86-gtklibs/emul-linux-x86-gtklibs-11.0.ebuild,v 1.1 2007/08/18 15:29:17 tester Exp $ inherit emul-libs SRC_URI="mirror://gentoo/atk-1.18.0.tbz2 mirror://gentoo/cairo-1.4.10.tbz2 mirror://gentoo/glitz-0.5.6.tbz2 mirror://gentoo/gtk+-1.2.10-r12.tbz2 mirror://gentoo/gtk+-2.10.14.tbz2 mirror://gentoo/gtk-engines-2.10.2.tbz2 mirror://gentoo/gtk-engines-aurora-1.0.tbz2 qt3? ( mirror://gentoo/gtk-engines-qt-0.8.tbz2 ) mirror://gentoo/gtk-engines-xfce-2.4.1-r1.tbz2 mirror://gentoo/gtkglext-1.2.0.tbz2 mirror://gentoo/imlib-1.9.15-r1.tbz2 mirror://gentoo/pango-1.16.5.tbz2" LICENSE="GPL-2 LGPL-2 LGPL-2.1 FTL || ( LGPL-2.1 MPL-1.1 ) BSD" KEYWORDS="-* ~amd64" IUSE="qt3 nodevelop" DEPEND="" RDEPEND=">=app-emulation/emul-linux-x86-baselibs-10.2 qt3? ( >=app-emulation/emul-linux-x86-qtlibs-10.0 ) >=app-emulation/emul-linux-x86-xlibs-10.0" src_unpack() { query_tools="^${S}/usr/bin/gtk-query-immodules-2.0|^${S}/usr/bin/gdk-pixbuf-query-loaders|^${S}/usr/bin/pango-querymodules" allowed_common="^${S}/etc/env.d|^${S}/etc/gtk-2.0/i686-pc-linux-gnu|^${S}/etc/pango/i686-pc-linux-gnu|${query_tools}" use nodevelop && ALLOWED="(${allowed_common})" \ || ALLOWED="(${allowed_common}|^${S}/usr/lib32/gtk-2.0/include|^${S}/usr/lib32/pkgconfig|.*lib32.*\.l?a$)" emul-libs_src_unpack # these tools generate an index in /etc/{pango,gtk-2.0}/${CHOST} mv -f "${S}/usr/bin/pango-querymodules"{,32} mv -f "${S}/usr/bin/gtk-query-immodules-2.0"{,-32} mv -f "${S}/usr/bin/gdk-pixbuf-query-loaders"{,32} [[ -f ${S}/usr/lib32/kde3/kcm_kcmgtk.so ]] && rm -f ${S}/usr/lib32/kde3/kcm_kcmgtk.so } pkg_preinst() { #bug 169058 for l in ${ROOT}/usr/lib32/{pango,gtk-2.0} ; do [[ -L ${l} ]] && rm -f ${l} done } pkg_postinst() { PANGO_CONFDIR="/etc/pango/i686-pc-linux-gnu" if [[ ${ROOT} == "/" ]] ; then einfo "Generating pango modules listing..." mkdir -p ${PANGO_CONFDIR} pango-querymodules32 > ${PANGO_CONFDIR}/pango.modules else ewarn "You'll have to run the following command after chrooting into ${ROOT}:" ewarn "pango-querymodules32 > ${PANGO_CONFDIR}/pango.modules" fi GTK2_CONFDIR="/etc/gtk-2.0/i686-pc-linux-gnu" einfo "Generating gtk+ immodules/gdk-pixbuf loaders listing..." mkdir -p ${GTK2_CONFDIR} gtk-query-immodules-2.0-32 > ${ROOT}${GTK2_CONFDIR}/gtk.immodules gdk-pixbuf-query-loaders32 > ${ROOT}${GTK2_CONFDIR}/gdk-pixbuf.loaders }
(2007/10/10).pcファイルと.a形式のライブラリ、更に、libtoolが使用する.laファイルに関して、インストールするかどうかを「develop」USEフラグで選択できるようにした。詳しくはemul-linux-x86-xlibsの記事の追記(インストール用ebuildの下)を参照。
(2007/10/11)USE=developで残すファイルは、自分で32bitライブラリを管理する上では結構使えることが分かってきたので、「develop」を逆の「nodevelop」にして、デフォルトでこれらのファイルを残すようにした。
(2007/11/14)GTK+ 2.12.1-r1で/etc/gtk-2.0/にあるファイルが変更されないようにallowed_commonを修正(/etc/gtk-2.0/以下の代わりに/etc/gtk-2.0/i686-pc-linux-gnu/以下を残すようにした)
これをローカルOverlayに入れてインストール。下は例。別途PORTDIR_OVERLAYを設定しておく。
$ sudo mkdir /usr/local/overlays/local/app-emulation/emul-linux-x86-gtklibs/files -p $ sudo cp emul-linux-x86-gtklibs-9999.ebuild /usr/local/overlays/local/app-emulation/emul-linux-x86-gtklibs/ $ sudo cp [tbz2ファイル...] /usr/portage/distfiles/ $ sudo ebuild /usr/local/overlays/local/app-emulation/emul-linux-x86-gtklibs/emul-linux-x86-gtklibs-9999.ebuild digest $ sudo emerge -avu emul-linux-x86-gtklibs