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

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

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を指定する必要も出る。これらを行わないと、挙動のおかしなライブラリになってしまうかもしれない。

  1. GTK+ 1(1.2.10-r12)
  2. Imlib 1(1.9.15-r1)
  3. ATK(1.18.0)
  4. glitz(0.5.6)
  5. cairo(1.4.10 USE="X glitz opengl svg xcb -debug -directfb -doc")
  6. Pango(1.16.5)
  7. GTK+ 2(2.10.14)
  8. gtkglext(1.2.0)
  9. gtk-engines(2.10.2)とgtk-engines-xfce(2.4.1-r1)
  10. gtk-engines-qt(0.8)
  11. インストールする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を含めて構成し、インストールまでを行っておく。*2
glitzを使用する場合、そのライブラリ(*.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"としていて、CUPSSSLの機能を使用するために依存する「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"」にしたいのであれば

  1. すでにインストールされているCUPSquickpkgでtbz2ファイルにしておく
  2. USE="-ssl"で64bit版CUPSをビルドし、インストール
  3. 32bit版GTK+をビルド、tbz2パッケージ作成
  4. 64bitのCUPS--usepkgSSL付きのものに戻す

とする。

$ 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

*1:x86_64用のものが使われてしまう

*2:/usr/lib32/以下にlibxcb-*.soが不足なく存在しているようにする

*3:x86_64上でインストールするには、/etc/portage/package.keywordsで「~x86」の指定をする